0

我正在使用遏制gem 使用 JSON 数据进行 Curl Multi 发布。但是,我无法实际获取要发布的参数,也无法弄清楚如何正确配置参数。

urls = [
  { 
    :url => "http://localhost:5000/", 
    :method => :post, 
    :headers => {'Accept' => 'application/json', 'Content-Type' => 'application/json'}, 
    :post_fields => {'field1' => 'value1', 'k' => 'j'}
  }
]

Curl::Multi.http(urls) do |easy, code, method|
  puts "#{easy.body_str.inspect}, #{method.inspect}, #{code.inspect}"
end

=>

"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>400 Bad Request</title>\n<h1>Bad Request</h1>\n<p>The browser (or proxy) sent a request that this server could not understand.</p>\n", :post, nil
4

1 回答 1

1

去做:

urls = [
  { 
    :url => "http://localhost:5000/", 
    :method => :post, 
    :headers => {'Accept' => 'application/json', 'Content-Type' => 'application/json'}, 
    :post_fields => {},
    :post_body => {'field1' => 'value1', 'k' => 'j'}.to_json,
  }
]

问题:路边不知道您正在发送 JSON 数据。遏制不阅读和解释:headers. 正如您在此处看到的,遏制将您的哈希转换为由“&”分隔的字符串,这是普通(非 json)http 数据发送的默认值(例如:“field1=value1&k=j”)。当服务器(Rails)读取并明确解释标头说数据是 JSON 格式时,它会尝试解码,结果与您这样做时得到的异常相同:JSON.parse("field1=value1&k=j").

为了解决这个问题,您需要将“post_fields”作为空哈希发送,并使用“post_body”发送您的实际数据。此外,您需要手动将哈希转换为 json to_json

我不知道他们(路边项目所有者)是否知道这个问题,但我建议你警告他们。

于 2015-02-16T22:42:26.073 回答