Ruby: HTTP Put 方法

Ruby: HTTP Put method

我正在尝试更新 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 请求?我已经尝试了通过 google 搜索找到的几种方法,但其中 none 已经取得了成功。

几件事:

  • 您没有在 Ruby 示例中发送 JSON,它是 Ruby 散列的字符串表示形式,它不相同。您需要 JSON module 或类似的。
  • 在 Ruby 代码中,您尝试发送 JSON object(看起来像 {"ip":"1.1.1.1"},在 curl 示例中,您正在发送它采用 application/x-www-form-urlencoded 格式,因此它们目前并不等同。
  • 此外,我还会查看服务器期望从您的请求中获得的数据类型:Ruby 和 curl 都默认发送 Content-Type: application/x-www-form-urlencoded 的 header 请求,而您重新期待发送 JSON。这就是 curl 示例起作用的原因:您使用的数据格式和 header 匹配。请注意 URL 中的 .json 应该没有什么区别; header 优先。
  • 您对 send_request 的调用让您选择了 data 参数作为 Python-style 关键字参数。 Ruby 不会那样做:你实际上在那里做的是通过调用分配一个局部变量 in-line。

所以尝试这样的事情:

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'})

只是一个友好的提醒,说一些 "doesn't work" 通常不会向可能回答您问题的人提供足够的信息:尝试并记住粘贴错误消息、堆栈跟踪和类似内容: )