簡體   English   中英

如何在Ruby HTTP請求的URI中使用方括號[]

[英]How to use square brackets [] in URI in Ruby HTTP request

我使用的API要求我向URL發出請求,且其中一個字段作為數組傳遞。 例如:

"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之前對URI進行編碼時,它會失敗(請求可以通過,但API無法正確識別它) 。

如何在對方括號進行 URL編碼的情況下強制Ruby向該URI發出HTTP請求?

編輯 :此SO響應看起來很有希望,但是我不完全確定如何更改Monkeypatching以適合此示例。

我如何猴子修補紅寶石的URI.parse方法

Typhoeus允許您使用Ruby構造傳遞HTTP參數。 要產生與帖子中的URL類似的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默認情況下不添加括號。 Typhoeus郵件列表上有一些討論提供了此決定的依據。 幸運的是,您可以輕松地自己添加括號:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM