0

次のようなリクエストがあります。

url = "https://api-3t.sandbox.paypal.com/nvp?METHOD=DoExpressCheckoutPayment&TOKEN=#{transaction.token}
                        &PAYERID=#{transaction.payer_id}&PAYMENTREQUEST_n_PAYMENTACTION=sale"
url = CGI.escape(url)
uri = URI(url)
res = Net::HTTP.get_response(uri)

このようにres.body見えます。TOKEN=EC%2d7UM71457T34680821&TIMESTAMP=2013%2d11%2d03T21%3a19%3a11Z&CORRELATIONID=3b73c396244ff&ACK=Success&VERSION=98&BUILD=8334781

TOKEN文字列から値と値を取得するにはどうすればよいACKですか? ここでうまくいくかどうかわかりませんparamsか?何か案は?

4

1 に答える 1

2

本文は、GET (または一部の POST) パラメータと同様に URI エンコードされています。次のようにして、手動で解凍できます。

require 'uri'

# body takes place of res.body for this example
body = 'TOKEN=EC%2d7UM71457T34680821&TIMESTAMP=2013%2d11%2d03' +    
  'T21%3a19%3a11Z&CORRELATIONID=3b73c396244ff&AC' + 
  'K=Success&VERSION=98&BUILD=8334781'

# First split into key/value pairs, and use inject to start building a hash
results = body.split('&').inject( {} ) do |hash,kv| 

  # Split each key/value pair
  k,v = kv.split('=').map do |uri_encoded_value| 
    # Decode - innermost loop, because it may contain encoded '&' or '='
    URI.decode(uri_encoded_value)
  end

  # Add to hash we are building with inject
  hash[k] = v
  hash
end

=> {"TOKEN"=>"EC-7UM71457T34680821", "TIMESTAMP"=>"2013-11-03T21:19:11Z",
 "CORRELATIONID"=>"3b73c396244ff", "ACK"=>"Success", "VERSION"=>"98", 
 "BUILD"=>"8334781"}

実際には、クラスメソッドURIを使用して、これのほとんどすべてを行うことができます (上記よりも形式のバリエーションをうまく処理できます) 。decode_www_form

params = {}
URI.decode_www_form( body ).each do |k,v|
  params[k] = v
end
params
=> {"TOKEN"=>"EC-7UM71457T34680821", "TIMESTAMP"=>"2013-11-03T21:19:11Z",
 "CORRELATIONID"=>"3b73c396244ff", "ACK"=>"Success", "VERSION"=>"98", 
 "BUILD"=>"8334781"}
于 2013-11-03T21:41:59.633 に答える