我正在使用HTTParty对接受application/json
的API进行POST请求
我的身体是这样的(作为哈希)
{:contact_id =>"12345679",
:items=> [
{:contact_id=>"123456789", :quantity=>"1", :price=>"0"},
{:contact_id=>"112315475", :quantity=>"2", :price=>"2"}
]}
当我编写以下代码时,此方法有效:
HTTParty.post('https://some-url', body: content.to_json, headers: { "Content-Type" => "application/json" } )
但是当仅将标头中的=>
符号更改为:
符号时,这将不起作用(API会响应缺少某些参数)
HTTParty.post('https://some-url', body: content.to_json, headers: { "Content-Type": "application/json" } )
为什么将"Content-Type" => "application/json"
更改为"Content-Type": "application/json"
会导致错误?
我认为这是我不理解的带有Ruby哈希的东西。
我认为我的问题不是Why is this string key in a hash converted to a symbol?的重复
对于HTTParty使用者来说很重要,要知道 HTTParty不接受标头只能接受字符串的符号。
有关更多信息,请参见 Content-Type Does not send when I try to use a new Hash syntax on header和 Passing headers and query params in HTTparty
谢谢@anothermh
答案 0 :(得分:2)
Ruby中的哈希键可以是任何对象类型。例如,它们可以是字符串,也可以是符号。在哈希键中使用冒号(:
)会告诉Ruby您正在使用符号。将字符串(或其他对象类型,例如Integer)用作密钥的唯一方法是使用哈希火箭(=>
)。
输入{ "Content-Type": "application/json" }
时,Ruby会将字符串"Content-Type"
转换为符号:"Content-Type"
。您可以在控制台中自己看到它:
{ "Content-Type": "application/json" }
=> { :"Content-Type" => "application/json" }
当您使用哈希火箭时,它不会转换,而是保留为字符串:
{ "Content-Type" => "application/json" }
=> { "Content-Type" => "application/json" }
HTTParty does not work with symbolized keys。