从Ruby发布时如何避免对JSON进行uri编码?

时间:2012-07-28 07:01:35

标签: ruby json http post

我正在尝试编写一个简单的http帖子,它会将一个json主体发送到一个安静的api。我使用以下代码:

data = {'EmailAddress' => email, 'Name' => 'bobby', 'CustomFields' => [ {'Key' => 'Country', 'Value' => 'canada'}, {'Key' => 'City', 'Value' => 'vancouver'} ], 'Resubscribe' => true }.to_json

require 'net/http'
net = Net::HTTP.new("api.createsend.com", 80)
request = Net::HTTP::Post.new("/api/v3/subscribers/#{@list}.json")
request.basic_auth(@api, 'magic')
request.set_form_data(:body => data)

response = net.start do |http|
http.request(request)
end
puts response.code
puts response.read_body

我遇到的麻烦是身体以字符串形式进入服务器而不是十六进制。这是我发送的内容:

  

体=%7B%22EmailAddress%22%3A%223%40blah.com%22%2C%22Name%22%3A%22bobby%22%2C%22CustomFields%22%3A%5B%7B%22Key%22%图3a%22Country%22%2C%22Value%22%3A%22canada%22%7D%2C%7B%22Key%22%3A%22City%22%2C%22Value%22%3A%22vancouver%22%7D%5D%图2c%22Resubscribe%22%3atrue%7D

以下是我要发送的内容:

{
  "EmailAddress": "3@blah.com",
  "Name": "bobby",
  "CustomFields" : [
    {
      "Key":"Country",
      "Value":"canada"
    },
    {
      "Key":"City",
      "Value":"vancouver"
    }
  ],
  "Resubscribe": true
}

如何打包这些数据,使其不会以字符串形式出现?

1 个答案:

答案 0 :(得分:2)

而不是:

request.set_form_data(:body => data)

试试这样:

request.body = data

net / http不应该是对邮件正文进行uri编码,如果你发现这种情况发生了,那么可能还有其他的事情正在发生,或者你可能只是错了。