Как сделать тип контента 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"}'
)