我正试图更新api中json对象中的“ip”参数。
我有以下情况:
when "put"
uri = URI.parse("http://#{ip}:#{port}/api/v1/address_data/1.json")
jobj = Hash.new
jobj['ip'] = "1.1.1.1"
http = Net::HTTP.new(uri.hostname, uri.port)
response = http.send_request('PUT', '/api/v1/address_data/1.json', data = jobj.to_s)
end
这不起作用,但可以:
curl -X PUT http://ip:port/api/v1/address_data/1.json -d "ip=1.1.1.1"
如何更准确地将curl转换为ruby中的put请求?我尝试了几种通过谷歌搜索找到的方法,但都没有成功的结果。
最佳答案
有几件事:
在ruby示例中,您没有发送json,它是一个ruby散列的字符串表示,这是不同的。你需要JSON module或类似的。
在ruby代码中,您试图发送一个json对象(它看起来像{"ip":"1.1.1.1"}
,在curl示例中,您以application/x-www-form-urlencoded格式发送它,因此它们目前并不等价。
此外,我还将研究服务器希望从您的请求中获得的数据类型:ruby和curl默认发送Content-Type: application/x-www-form-urlencoded
的请求头,您希望发送json。这就是curl示例工作的原因:您使用的数据格式和头匹配。注意url中的.json
不应该真的有什么区别;头是优先的。
对send_request
的调用让您选择data
参数作为python样式的关键字参数。ruby并没有做到这一点:实际上你所做的是在调用的同时分配一个局部变量。
所以试试这样的方法:
require 'json' # put this at the top of the file
uri = URI.parse("http://#{ip}:#{port}/api/v1/address_data/1.json")
jobj = {"ip" => "1.1.1.1"}
http = Net::HTTP.new(uri.hostname, uri.port)
response = http.send_request('PUT', uri.path, JSON.dump(jobj),
{'Content-Type' => 'application/json'})
仅仅是一个友好的提醒,说一些“不起作用”的话通常不会给可能回答你问题的人提供足够的信息:试着记住粘贴错误消息、堆栈跟踪等等:)
关于ruby - Ruby:HTTP Put方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33112730/