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.