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.

Reply via email to