2013-11-03 2 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

본문은 GET (또는 일부 POST) 매개 변수와 마찬가지로 URI 인코딩됩니다. 이 같은 수행하여 수동으로 압축을 풀 수 : 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"} 

을 (위보다 더 나은 형식의 변화를 다루는)에 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"}