我正在使用curp-gem使用JSON数据进行Curl Multi-post。然而,我无法实际获得要发布的参数,也无法弄清楚如何正确配置参数。
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
这样做:
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,
}
]
问题:curp不知道您正在发送JSON数据。Curb不阅读和解释:headers
的内容。正如您在这里看到的,curp将您的哈希转换为一个由"&"分隔的字符串,这是正常(非json)http数据发送的默认字符串(例如:"field1=value1&k=j")。当服务器(Rails)读取并解释头显式表示数据为JSON格式时,它会尝试解码,结果与执行解码时得到的异常相同:JSON.parse("field1=value1&k=j")
。
要解决这个问题,您需要将"post_fields"作为空散列发送,并使用"post_body"发送实际数据。此外,您需要使用to_json
手动将哈希转换为json。
我不知道他们(路边项目所有者)是否知道这个问题,但我建议你警告他们。