Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby HTTP请求中使用URI中的方括号[]_Ruby_Http_Net Http_Typhoeus - Fatal编程技术网

如何在Ruby HTTP请求中使用URI中的方括号[]

如何在Ruby HTTP请求中使用URI中的方括号[],ruby,http,net-http,typhoeus,Ruby,Http,Net Http,Typhoeus,我使用的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%2

我使用的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键时,它会工作,但当我在传递URI之前使用Typhous(或net/http)对URI进行编码时,它会失败(请求通过,但API无法正确识别它)

在没有URL编码方括号的情况下,如何强制Ruby向这个URI发出HTTP请求

编辑:这看起来很有希望,但我不完全确定应该如何修改monkeypatching以适合这个示例


Typhous允许您使用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
但是,Typhous默认情况下不添加括号。有一些讨论提供了这一决定背后的理由。幸运的是,您可以自己轻松地添加括号:

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

Typhous允许您使用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
但是,Typhous默认情况下不添加括号。有一些讨论提供了这一决定背后的理由。幸运的是,您可以自己轻松地添加括号:

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

是的,一些实际的代码会有所帮助。另外,检查您的Web服务器日志,查看您的请求在这两种情况下(Chrome和Ruby)都被翻译成了什么。@Krule:是什么使它无效?是的,一些实际的代码会有所帮助。另外,检查您的Web服务器日志,查看您的请求在这两种情况下(Chrome和Ruby)被翻译成的确切内容。@Krule:是什么使它无效?