有没有办法使用Net :: HTTP发送带有DELETE请求的JSON?

时间:2015-06-23 04:23:02

标签: 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', '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'    

我已经使用了很多HTTParty gem,我知道它可以达到这个目的,但我不想只为一个API包含一个gem。

非常感谢任何帮助/指示。

更新 正如@kimball和@Zoker所说,这就是我所做的(我使用的是ruby-2.0.0-p643 MRI):

request = Net::HTTP::Delete.new(path, {'Depth' => 'Infinity', 
                                       'Content-Type' =>'application/json'})
request.body = '{"ids":["abc123"]}'
request.basic_auth('username', 'password')

response = http.request(request)
它扔了:

'400 Invalid URI'    

更新2 再次按照评论中的建议:

require 'json'
request.body = {"ids" => ["abc123"]}.to_json

结果仍然相同。

response = http.request(request)
=> #<Net::HTTPBadRequest 400 Invalid URI readbody=true>

2 个答案:

答案 0 :(得分:0)

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)中的参数是散列,而不是字符串。

更重要的是,哈希值必须是String

[UPDATE]

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

require 'json'

request.body = JSON.generate({'foo'=>'bar','key'=>'value'})

或者您可以自己生成json字符串

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

答案 1 :(得分:0)

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

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

路径是您指定的URL