How do I make Ruby's RestClient gem respect content_type on post?

Deadly 提交于 2019-11-30 17:45:41

You might want to put json as string as your payload instead of hash. For example, do:

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

If you look at the payload.rb, it shows that it will use the Base clase instead of UrlEncoded class if the payload is string. Try that and see if that work for you.

Fact:

For :post request, when payload is a Hash, the Content-Type header will be always overridden to application/x-www-form-urlencoded.

Reproduciable with rest-client (2.0.0).

Solution:

Convert the hash payload to json string.

require 'json'

payload.to_json

There is a ticket in rest-client's repo:

I'd like to add that my issue was when using RestClient::Request.execute (as opposed to RestClient.post or RestClient.get).

The problem was with how I was setting :content_type and :accept. From the examples I saw it felt like they should be top level options like this:

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

But you actually have to put them within :headers like this:

res = RestClient::Request.execute(
  :method => :get,
  :url => url,
  :verify_ssl =>  false,
  :headers => { 
    :Authorization => "Bearer #{token}", 
    :content_type => :json,
    :accept => :json
  },
  :payload => '{"a":"b"}'
)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!