我在Sinatra应用程序中使用Net :: HTTP进行CRUD请求。对于删除请求,我需要一起发送JSON与要求:有没有办法发送带有Net :: HTTP的DELETE请求的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)
上面的代码发送删除请求就好了,但是当我发送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建议,这里是我做过什么(我使用的红宝石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>
我不能复制你的错误 - 早期的行'request = Net :: HTTP :: Delete.new(path,'{“ids”:[“abc123”]}')'引发了一个不同的错误。第二个参数不应该是头文件的散列吗?你在哪里试图把你的JSON - 标题/正文/表单数据? – Kimball
Thanks @Kimball我已更新我的问题,为标题添加散列仍会引发400错误 – gouravtiwari21
为了完整性,您可以尝试'Net :: HTTPHeader#set_form_data',但是IIRC只是将散列转换为查询参数。如果可能的话,而不是编写自己的JSON,它可能不太容易出错,需要'json'并使用'Hash#to_json'。不知道你想要与哪些服务互动,我不能提供多少建议;重载DELETE请求是一项充满挑战的任务! – Kimball