2015-06-23 54 views
1

我在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> 
+0

我不能复制你的错误 - 早期的行'request = Net :: HTTP :: Delete.new(path,'{“ids”:[“abc123”]}')'引发了一个不同的错误。第二个参数不应该是头文件的散列吗?你在哪里试图把你的JSON - 标题/正文/表单数据? – Kimball

+0

Thanks @Kimball我已更新我的问题,为标题添加散列仍会引发400错误 – gouravtiwari21

+1

为了完整性,您可以尝试'Net :: HTTPHeader#set_form_data',但是IIRC只是将散列转换为查询参数。如果可能的话,而不是编写自己的JSON,它可能不太容易出错,需要'json'并使用'Hash#to_json'。不知道你想要与哪些服务互动,我不能提供多少建议;重载DELETE请求是一项充满挑战的任务! – Kimball

回答

0

净:: HTTP :: Delete.new()方法通过提供在PARAMS头

# 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 

可以使用这样的:在Delete.new(path,params)

Net::HTTP::Delete.new(path,{'Depth' => 'Infinity', 'foo' => 'bar'}) 

的PARAMS一个散列,而不是一个字符串。

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

[更新]

我们可以把一个JSON字符串request.body这样

require 'json' 

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

,或者你可以生成JSON字符串你自己

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

虽然这给了我指针,你能解释我怎么能发送JSON与请求?作为标题或正文? – gouravtiwari21

+0

@ gouravtiwari21我已经更新了我的答案,您可以将一个json字符串传递到request.body中,您需要做的只是确保json字符串格式是正确的。 – Zoker

+0

谢谢@Zoker,它仍然不适合我。 – gouravtiwari21

相关问题