我正在尝试更新' ip' API中json对象中的参数。
我有以下情况:
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请求?我尝试过通过谷歌搜索找到的几种方法,但都没有成功的结果。
答案 0 :(得分:3)
一些事情:
{"ip":"1.1.1.1"}
,而在curl示例中,您将以application / x-www-form-urlencoded格式发送它,因此它们“目前还不等同。Content-Type: application/x-www-form-urlencoded
的请求标头,并且您希望发送JSON。这就是curl示例的工作原理:您正在使用的数据格式和标题匹配。请注意,网址中的.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'})
只是一个友好的提醒,说一些“不起作用”通常不会给可能回答你问题的人提供足够的信息:尝试并记住粘贴错误消息,堆栈跟踪以及类似的东西:)