2013-11-03 75 views
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

我怎樣才能得到TOKENACK值的字符串?我不確定params在這裏工作? 任何想法?

回答

2

正文是URI編碼的,就像GET(或某些POST)參數一樣。您可以手動解壓,做這樣的事情:

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"}