Hi everyone,
Using the wonderful Sinatra to create a RESTful Web service. What I want
to do is:
1 receive a POST and return a JSON response.
2 after a short period send a POST to a URL provided in a “callback”
param during 1 above
So far I can receive the client’s POST and eithr return a JSON response,
or post to the callback URL. BUT, I can’t do both.
Have tried to use Threads but no luck.
Now trying event-machine-http but I’m sure I’m missing
something…here’s the code. ANy help much appreciated! Cheers.
oneapi.rb
require ‘sinatra’
require ‘json’
require ‘ruby-debug’
require ‘singleton’
require ‘em-http-request’
callback test
post ‘/callbacktest’ do
“Callback was #{params[0]}”
end
OneAPI payment operations
class Receipts
include Singleton
$receipts = Hash.new
def addReceipt(transId,jsonTrans)
$receipts[“#{transId}”] = jsonTrans
end
def getReceipt(transId)
return $receipts[“#{transId}”]
end
end
receipts = Receipts.instance
post ‘/payment/transactions/amount’ do # => creates a new charge
content_type :json, :charset => ‘utf-8’
class Transaction
def initialize(endUserId, code, referenceCode, callback=false)
@endUserId = endUserId
@code = code
@referenceCode = referenceCode
$callback = callback
$transId = rand(1000)
end
def transId
return $transId
end
def to_json(*a)
{"amountTransaction" => {
"endUserId" => @endUserId,
"paymentAmount" =>{
"chargingInformation" => {"code" => @code, "description" =>
@description},
“totalAmountCharged”=> “0” # the payment is only
‘processing’ at this point so nothing charged
},
“referenceCode” => @referenceCode,
“serverReferenceCode”
=>“#{(0…6).map{65.+(rand(25)).chr}.join}”, # just an example, can be
any string
“resourceURL” =>
“http://localhost:4567/payment/#{@endUserId}/transactions/amount/#{$transId}”,
“transactionOperationStatus” => “Processing”
}}.to_json(*a)
end
def jsonResponse
jsonTrans = self.to_json
return jsonTrans
end
end
def make_request(site=‘http://localhost:4567/callbacktest’, body={})
http = EventMachine::HttpRequest.new(site).post :body => body
http.errback { p ‘request failed’ }
http.callback {
p http.response_header.status
p http.response_header
p http.response
}
end
trans = Transaction.new(params[:endUserId],params[:code],
params[:referenceCode], params[:callback])
OK, send the JSON response…
trans.to_json
…and now send the callback. Just testing the mechanism for now
TODO this will be the transaction JSON but with amendments:
transactionOperationStatus changed
and currency/amount added.
EM.run do
# fire callback
EM.add_timer(5) {make_request “http://localhost:4567/callbacktest”,
:param => ‘hi there’}
end
RESULT: callback is sent but the original response (trans.to_json)
is not sent!!
end