如何在Ruby HTTP请求中使用URI中的方括号[]
我使用的API要求我向URL发出请求,其中一个字段作为数组传递。例如:如何在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
"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:是什么使它无效?