Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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 有没有一种方法可以通过Net::HTTP发送JSON和DELETE请求?_Ruby_Json_Net Http - Fatal编程技术网

Ruby 有没有一种方法可以通过Net::HTTP发送JSON和DELETE请求?

Ruby 有没有一种方法可以通过Net::HTTP发送JSON和DELETE请求?,ruby,json,net-http,Ruby,Json,Net Http,我在Sinatra应用程序中使用Net::HTTP作为CRUD请求。对于删除请求,我需要将JSON与请求一起发送: uri = URI.parse('http://localhost:3000') http = Net::HTTP.new(uri.host, uri.port) path = '/resource/resource-id' request = Net::HTTP::Delete.new(path) request.basic_auth('username', 'passw

我在Sinatra应用程序中使用Net::HTTP作为CRUD请求。对于删除请求,我需要将JSON与请求一起发送:

uri = URI.parse('http://localhost:3000')    
http = Net::HTTP.new(uri.host, uri.port)
path = '/resource/resource-id'
request = Net::HTTP::Delete.new(path)
request.basic_auth('username', 'password')

response = http.request(request)
上面的代码可以发送DELETE请求,但是当我发送JSON时

request = Net::HTTP::Delete.new(path, '{"ids": ["abc123"]}')
request.basic_auth('username', 'password')

response = http.request(request)
它抛出:

'400 Invalid URI'    
'400 Invalid URI'    
我经常使用httpartygem,我知道它可以达到这个目的,但我不想只为一个API包含一个gem

非常感谢您的帮助/指点

更新 正如@kimball和@Zoker所建议的,下面是我所做的(我使用的是ruby-2.0.0-p643 MRI):

它抛出:

'400 Invalid URI'    
'400 Invalid URI'    
更新2 正如评论中所建议的那样:

require 'json'
request.body = {"ids" => ["abc123"]}.to_json
结果还是一样

response = http.request(request)
=> #<Net::HTTPBadRequest 400 Invalid URI readbody=true>
response=http.request(请求)
=> #
Net::HTTP::Delete.new()方法在标头中提供传递参数

# File lib/net/http.rb, line 1231
def delete(path, initheader = {'Depth' => 'Infinity'})
  request(Delete.new(path, initheader))
end
# via: http://docs.ruby-lang.org/en/2.1.0/Net/HTTP.html
您可以这样使用:

Net::HTTP::Delete.new(path,{'Depth' => 'Infinity', 'foo' => 'bar'})
Delete.new(path,params)
中的参数是散列,而不是字符串

更重要的是,哈希值必须是
字符串

[更新]

我们可以像这样将json字符串放入request.body

require 'json'

request.body = JSON.generate({'foo'=>'bar','key'=>'value'})
或者您可以自己生成json字符串

request.body = "{\"foo\":\"bar\",\"key\":\"value\"}"
Net::HTTP::Delete.new()方法在标头中提供传递参数

# File lib/net/http.rb, line 1231
def delete(path, initheader = {'Depth' => 'Infinity'})
  request(Delete.new(path, initheader))
end
# via: http://docs.ruby-lang.org/en/2.1.0/Net/HTTP.html
您可以这样使用:

Net::HTTP::Delete.new(path,{'Depth' => 'Infinity', 'foo' => 'bar'})
Delete.new(path,params)
中的参数是散列,而不是字符串

更重要的是,哈希值必须是
字符串

[更新]

我们可以像这样将json字符串放入request.body

require 'json'

request.body = JSON.generate({'foo'=>'bar','key'=>'value'})
或者您可以自己生成json字符串

request.body = "{\"foo\":\"bar\",\"key\":\"value\"}"

您也可以在请求中添加和if/elsif语句,并应用:

elsif delete
    request = Net::HTTP::Delete.new(path)
end

其中path是您指定的URL

,您也可以在请求中添加and if/elsif语句并应用:

elsif delete
    request = Net::HTTP::Delete.new(path)
end

其中path是您指定的URL

我无法复制您的错误-前面的一行
request=Net::HTTP::Delete.new(路径“{”ids:[“abc123”]}”)
引发了另一个错误。第二个参数不应该是头的散列吗?你想把你的JSON-header/body/form数据放在哪里?谢谢@Kimball我更新了我的问题,为header添加一个哈希仍然会抛出400个错误。为了完整性,你可以尝试
Net::HTTPHeader#set\u form\u data
,但IIRC它只是将哈希转换为查询参数。如果可能的话,也可以不编写自己的JSON,而使用
要求使用“JSON”
并使用
散列来生成JSON
。如果不知道你想与什么服务互动,我无法提供太多建议;重载删除请求是一项令人担忧的任务!关于Hash#to _json的观点很好,在代码中我也在做同样的事情。我已经在可用信息(不了解服务器)上尽可能地测试了这一点,我无法重现您的错误。我自己处理外部服务的经验主要是糟糕的文档——我经常在任何我能找到的地方(header、body、query-params)放置我的参数,直到找到可以工作的东西。如果是内部的,至少您可以检查自己的服务器代码。我无法复制您的错误-前面的行
request=Net::HTTP::Delete.new(路径“{”ids:[“abc123”]}”)
引发了另一个错误。第二个参数不应该是头的散列吗?你想把你的JSON-header/body/form数据放在哪里?谢谢@Kimball我更新了我的问题,为header添加一个哈希仍然会抛出400个错误。为了完整性,你可以尝试
Net::HTTPHeader#set\u form\u data
,但IIRC它只是将哈希转换为查询参数。如果可能的话,也可以不编写自己的JSON,而使用
要求使用“JSON”
并使用
散列来生成JSON
。如果不知道你想与什么服务互动,我无法提供太多建议;重载删除请求是一项令人担忧的任务!关于Hash#to _json的观点很好,在代码中我也在做同样的事情。我已经在可用信息(不了解服务器)上尽可能地测试了这一点,我无法重现您的错误。我自己处理外部服务的经验主要是糟糕的文档——我经常在任何我能找到的地方(header、body、query-params)放置我的参数,直到找到可以工作的东西。如果它是内部的,至少你可以检查你自己的服务器代码。虽然这给了我一个指针,你能解释一下我如何在请求中发送JSON吗?作为header还是body?@gouravtiwari21我已经更新了我的答案,你可以将一个json字符串传递到request.body,你需要做的只是确保json字符串格式正确。oops,但它对我有效,我从reponse body获得
{“foo”:“bar”,“key”:“value”}
,这可能是因为你使用的是最新的ruby(2.1或2.2)?我被ruby 2,0的这个项目困住了,尽管这给了我指针,你能解释一下我如何在请求中发送JSON吗?作为header还是body?@gouravtiwari21我已经更新了我的答案,你可以将一个json字符串传递到request.body,你需要做的只是确保json字符串格式正确。oops,但它对我有效,我从reponse body获得
{“foo”:“bar”,“key”:“value”}
,这可能是因为你使用的是最新的ruby(2.1或2.2)?我一直在为ruby 2,0做这个项目