2012-01-09 13 views
1

私は、配列として渡されたフィールドの1つを持つURLにリクエストを発行する必要があるAPIを使用しています。例:あなたが見ることができるようにRubyのHTTPリクエストでURIの角括弧[]を使用する方法

"http://www.example.com/objects/add.php?key=XXXXXXXXXXX;objects=[%7B%2522field1%2522%253A%2522My%2520ObjectA2%2522%7D%252C%7B%2522field%2522%253A%2522ObjectB%2522%252C%2522color%2522%253A%25221%2522%252C%2522note%2522%253A%252298765%2522%7D];ids=foo,bar" 

、配列の内容はURLエンコードする必要がありますが、全体のURLではありません。はい、私はそれが奇妙であることは分かっていますが、APIが設定されている方法です。 ChromeにURIを入力してEnterキーを押すと機能しますが、Typhoeus(またはnet/http)を使用して渡す前にURIをエンコードすると失敗します(要求は通過しますが、APIは正しく認識しません) 。

RubyにこのURIへのHTTP要求を発行させるにはどうすればいいですかなし URLエンコードの角括弧は?

EDIT:このSOの応答は有望でしたが、私はこの例に合うように、どのようにしてMonkeypatchingを変更すべきかについて完全にはわかりません。

How do I monkey-patch ruby's URI.parse method

+0

はい、実際のコードが役に立ちます。また、Webサーバーのログを調べて、両方のインスタンスで要求がどのように変換されたのかを正確に確認します(Chrome対Ruby)。 – theglauber

+1

@Krule:何が無効になるのですか? –

答えて

1

TyphoeusあなたはRubyの構築を使用してHTTPパラメータを渡すことができます。あなたの例のURLは、JSONオブジェクトが含まれているため、APIあなたがしている可能性が高いようで、

my_params = { 
       api_key: "XXXXXXXXXXXXXXXXXX", 
       objects: [ 
       { field1: 'My ObjectA2' }, 
       { field: 'ObjectB', 
        color: '1', 
        note: '98765' }], 
       ids: "foo, bar" 
      } 


get_response = Typhoeus::Request.get("http://www.example.com/objects/add.php", params: my_params) 
get_response.effective_url #> http://www.example.com/objects/add.php?api_key=XXXXXXXXXXXXXXXXXX&ids=foo%2C+bar&objects=%7B%3Afield1%3D%3E%22My+ObjectA2%22%7D&objects=%7B%3Afield%3D%3E%22ObjectB%22%2C+%3Acolor%3D%3E%221%22%2C+%3Anote%3D%3E%2298765%22%7D 

しかし:あなたのポスト内の1つのようなURLを生成するには、の線に沿って何かをしたいですで働いているとPOSTリクエストを探しています。

post_response = Typhoeus::Request.post("http://www.example.com/objects/add.php", params: my_params) 
post_response.effective_url #> http://www.example.com/objects/add.php 
post_response.request.params #> {:api_key=>"XXXXXXXXXXXXXXXXXX", :objects=>[{:field1=>"My ObjectA2"}, {:field=>"ObjectB", :color=>"1", :note=>"98765"}], :ids=>"foo, bar"} 

EDIT:イベントで

APIがGET要求を期待していることは、現在のGETリクエスト経由でシリアル化されたデータを渡すための最も一般的な方法は、パラメータ名の最後に角括弧を追加することです:

http://www.example.com/objects/add.php?objects[]=something&objects[]=something%20else 

ただし、Typhoeusではデフォルトで角括弧は追加されません。この決定の裏に理由を提示する議論がいくつかあります(on the Typhoeus mailing list)。幸いにも、括弧を簡単に追加することができます。

my_params = { 
       api_key: "XXXXXXXXXXXXXXXXXX", 
       :"objects[]" => [ 
       { field1: 'My ObjectA2' }, 
       { field: 'ObjectB', 
        color: '1', 
        note: '98765' }], 
       ids: "foo, bar" 
      } 


get_response = Typhoeus::Request.get("http://www.example.com/objects/add.php", params: my_params) 
get_response.effective_url #> http://www.example.com/objects/add.php?api_key=XXXXXXXXXXXXXXXXXX&ids=foo%2C+bar&objects%5B%5D=%7B%3Afield1%3D%3E%22My+ObjectA2%22%7D&objects%5B%5D=%7B%3Afield%3D%3E%22ObjectB%22%2C+%3Acolor%3D%3E%221%22%2C+%3Anote%3D%3E%2298765%22%7D 
関連する問題