2012-01-09 65 views
1

我正在使用一個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設置的方式。當我在URI中輸入URI並按回車時,它可以正常工作,但是當我使用Typhoeus(或net/http)在傳遞它之前對URI進行編碼時,它會失敗(請求會通過,但API無法正確識別) 。

如何強制Ruby向此URI發出HTTP請求沒有對方括號進行URL編碼?

編輯:這個反應看起來很有希望,但我不完全確定如何改變monkeypatching以適應這個例子。

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

+0

是的,一些實際的代碼會有所幫助。此外,請檢查您的Web服務器日誌,以確切瞭解您的請求在兩種情況下都已轉換爲何種格式(Chrome與Ruby)。 – theglauber 2012-01-09 20:37:51

+1

@Krule:是什麼讓它失效? – 2012-01-11 01:11:04

回答

1

百頭巨怪允許您使用Ruby構建通過HTTP參數。爲了產生一個類似於在您的文章的URL,你會做線沿線的東西:

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 

然而,由於本示例URL中包含一個JSON對象,似乎更有可能的是API你正在尋找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"} 

編輯:

倘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