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@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-talk+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.