16

例如,在 RestClient 控制台中:

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

这不会发送 application/json 作为内容类型。相反,我看到:

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 替换 super.merge 会导致内容类型受到尊重,但显然这不是一个真正的解决方案。有谁知道解决这个问题的正确方法?谢谢。

4

4 回答 4

23

您可能希望将 json 作为字符串而不是哈希值作为有效负载。例如,执行:

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

如果您查看有效负载.rb,它表明如果有效负载是字符串,它将使用 Base 类而不是 UrlEncoded 类。试试看,看看是否适合你。

于 2011-11-19T14:28:27.740 回答
14

事实

对于:post请求,当payload是 a时HashContent-Type标头将始终被覆盖为application/x-www-form-urlencoded

可通过 rest-client (2.0.0) 重现。

解决方案

将哈希有效负载转换为 json 字符串。

require 'json'

payload.to_json

rest-client 的 repo 中有一张票:

于 2016-10-03T14:17:29.200 回答
9

我想补充一点,我的问题是使用时RestClient::Request.execute(而不是RestClient.postor 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"}'
)
于 2016-06-02T19:47:59.317 回答
0

我试图通过 POST 以表单数据格式提交用户名和密码,以及 csrf 令牌和身份验证 cookie。将有效负载转换为 json 并明确设置内容类型标头没有帮助。我最终将有效负载作为查询字符串传递,并将其转换为 JSON:

RestClient::Request.execute(
  method: :post, 
  url: 'http://app_url/login.do',
  payload: "username=username&password=password&_csrf=token",
  headers: {'X-XSRF-TOKEN' => 'token'},
  cookies: {'XSRF-TOKEN' =>  cookie_object}
)

另一种选择也是使用 encode_www_form,但查询字符串更适合我的特定用例。

虽然这不是一种常见的情况,并且完全取决于后端期望的参数格式,但如果服务器期望 url 编码作为 POST 正文,则在 POST 正文中传递查询字符串仍然是一个可行的选择。希望这可以帮助某人。

于 2019-10-04T15:34:12.927 回答