Как сделать тип контента restclient gem respect Ruby на post?

например, в консоли RestClient:

RestClient.post 'http://localhost:5001', {:a => 'b'}, :content_type => 'application/json'

это не отправляет application / json в качестве типа контента. Вместо этого я вижу:--4-->

Content-Type: application/x-www-form-urlencoded

я смог отследить изменение в restclient / payload.rb:

  class UrlEncoded < Base
  ...

  def headers
    super.merge({'Content-Type' => 'application/x-www-form-urlencoded'})
  end
end

замена супер.слияние с super приводит к уважению типа контента, но, очевидно, это не реальное решение. Кто-нибудь знает, как это исправить? Спасибо.

3 ответов


вы можете поместить json в качестве строки в качестве полезной нагрузки вместо хэша. Например, делать:

RestClient.post 'http://localhost:5001','{"a":"b"}',:content_type => 'application/json'

Если вы посмотрите на нагрузки.rb, он показывает, что он будет использовать базовый класс вместо UrlEncoded класса, если полезная нагрузка является Строковой. Попробуйте это и посмотрите, сработает ли это для вас.


факт:

на :post запрос, когда payload это Hash на Content-Type заголовок всегда будет переопределен на application/x-www-form-urlencoded.

Reproduciable с помощью REST-клиента (2.0.0).

решение:

преобразовать полезную нагрузку хэша в строку json.

require 'json'

payload.to_json

есть авиабилет в остальном-клиент репозитория:


Я хотел бы добавить, что моя проблема была при использовании RestClient::Request.execute (вместо RestClient.post или RestClient.get).

проблема была в том, как я устанавливал :content_type и :accept. Из примеров, которые я видел, казалось, что они должны быть такими вариантами верхнего уровня:

res = RestClient::Request.execute(
  :method => :get,
  :url => url,
  :verify_ssl =>  false,
  :content_type => :json,
  :accept => :json,
  :headers => { 
    :Authorization => "Bearer #{token}", 
  },
  :payload => '{"a":"b"}'
)

но вы на самом деле должны поместить их в :headers такой:

res = RestClient::Request.execute(
  :method => :get,
  :url => url,
  :verify_ssl =>  false,
  :headers => { 
    :Authorization => "Bearer #{token}", 
    :content_type => :json,
    :accept => :json
  },
  :payload => '{"a":"b"}'
)