我在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>
答案 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