Заголовки HTTParty странное поведение - PullRequest
0 голосов
/ 17 января 2019

Контекст:

Я использую HTTParty для выполнения запроса POST на API, который принимает application/json

Мое тело что-то в этом роде (как хеш)

{: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, что я не понимаю.

Редактировать:

Я думаю, что мой вопрос не является дубликатом Почему этот ключ строки в хэшепреобразован в символ?

Для потребителей HTTPart важно знать, что HTTParty не принимает символы для заголовков , а только строки .

Для получения дополнительной информации см. Content-Type Не отправляется, когда я пытаюсь использовать новый синтаксис Hash для заголовков и Передача headers и параметры запросов в HTTparty

Спасибо @ anothermh

1 Ответ

0 голосов
/ 17 января 2019

Хеш-ключи в 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 не работает с символическими ключами .

...