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
--
Posted via http://www.ruby-forum.com/.
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung
2011-Apr-08 11:29 UTC
Re: Sinatra: can I return response AND post a callback?
On Apr 8, 11:52 am, Kevin Smith <li...-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> Hi everyone, > > Using the wonderful Sinatra to create a RESTful Web service. What I want > to do is:You might note this isn''t a sinatra group.> > # OK, send the JSON response... > trans.to_jsonNot very familiar with sinatra, but I don''t think this sends anything at all - sinatra uses the result of the last expression in the block as its response If you do something else after this, then that''s what sinatra will use as its response Also, beware global variables - if you ever got concurrent requests your code would do horrible things Fred> end > > -- > Posted viahttp://www.ruby-forum.com/.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.