0

Context :

I'm using HTTParty to do a POST request on an API that accept application/json

My body is something like that (as a hash)

{:contact_id =>"12345679", 
 :items=> [
      {:contact_id=>"123456789", :quantity=>"1", :price=>"0"},
      {:contact_id=>"112315475", :quantity=>"2", :price=>"2"}
]}

Issue :

When I write the following code, this is working :

HTTParty.post('https://some-url', body: content.to_json, headers: { "Content-Type" => "application/json" } )

But when change only the => symbol in headers, to : symbol, this is not working (the API respond that some parameters are missing)

HTTParty.post('https://some-url', body: content.to_json, headers: { "Content-Type": "application/json" } )

Question :

Why changing "Content-Type" => "application/json" to "Content-Type": "application/json" lead to errors ?

I think this is something with Ruby hash that I don't understand.

Edit :

I think my question is not a duplicate of Why is this string key in a hash converted to a symbol?

It's important for HTTParty consumers, to know that HTTParty do not accept symbols for headers but only strings.

For more information, see Content-Type Does not send when I try to use a new Hash syntax on header and Passing headers and query params in HTTparty

Thank you @anothermh

Xero
  • 3,951
  • 4
  • 41
  • 73

1 Answers1

2

Hash keys in Ruby can be any object type. For example, they can be strings or they can be symbols. Using a colon (:) in your hash key tells Ruby that you are using a symbol. The only way to use a string (or other object type, like Integer) for your key is to use hash rockets (=>).

When you enter { "Content-Type": "application/json" }, Ruby will convert the string "Content-Type" to the symbol :"Content-Type". You can see this yourself in the console:

{ "Content-Type": "application/json" }
=> { :"Content-Type" => "application/json" }

When you use a hash rocket it does not get converted and remains a string:

{ "Content-Type" => "application/json" }
=> { "Content-Type" => "application/json" }

HTTParty does not work with symbolized keys.

anothermh
  • 9,815
  • 3
  • 33
  • 52
  • so HTTParty only accept string as headers, if I understand well – Xero Jan 17 '19 at 09:11
  • 1
    Correct. Read more [here](https://github.com/jnunemaker/httparty/issues/472) and [here](https://stackoverflow.com/q/24691483/3784008). – anothermh Jan 17 '19 at 09:12