Ruby:HTTP Put方法

时间:2015-10-13 21:13:06

标签: ruby curl put

我正在尝试更新' 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请求?我尝试过通过谷歌搜索找到的几种方法,但都没有成功的结果。

1 个答案:

答案 0 :(得分:3)

一些事情:

  • 你不是在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示例的工作原理:您正在使用的数据格式和标题匹配。请注意,网址中的.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'})

只是一个友好的提醒,说一些“不起作用”通常不会给可能回答你问题的人提供足够的信息:尝试并记住粘贴错误消息,堆栈跟踪以及类似的东西:)