法拉第宝石未定义方法 'bytesize'=' for Hash`

bav*_*ten 6 ruby ruby-on-rails faraday ruby-on-rails-4

我想向 API 发送 POST 请求。这是我的代码:

conn = Faraday.new(url: BASE) do |faraday|
  faraday.response :logger
  faraday.request  :url_encoded
  faraday.headers['Content-Type'] = 'application/json'
  faraday.headers["Authorization"] = "bearer #{AppConfig.instance.access_token}"
  faraday.adapter Faraday.default_adapter
end
form_data = {a: 1, b: 2}
conn.post("/api/test", form_data)
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

conn = Faraday.new(url: BASE) do |faraday|
  faraday.response :logger
  faraday.request  :url_encoded
  faraday.headers['Content-Type'] = 'application/json'
  faraday.headers["Authorization"] = "bearer #{AppConfig.instance.access_token}"
  faraday.adapter Faraday.default_adapter
end
form_data = {a: 1, b: 2}
conn.post("/api/test", form_data)
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

conn.post("/api/test", form_data.to_json)
Run Code Online (Sandbox Code Playgroud)

但它也不起作用。

Leo*_*Leo 7

官方法拉第存储库提供了以下描述:

# post payload as JSON instead of "www-form-urlencoded" encoding:
conn.post do |req|
  req.url '/nigiri'
  req.headers['Content-Type'] = 'application/json'
  req.body = '{ "name": "Unagi" }'
end
Run Code Online (Sandbox Code Playgroud)

因此,内容类型“application/json”无法解析哈希。Gem 本身不会将正文数据转换为所需的格式。

您需要将 form_data 转换为 string( json) 格式:

form_data = {a: 1, b: 2}.to_json
Run Code Online (Sandbox Code Playgroud)

笔记。使用符号键格式时不要进行转换,.to_s因为这会导致解析错误。

使用您提供的法拉第配置,将 format_data 转换为 json 后不会导致任何错误。因此,新错误与法拉第宝石或提供的代码无关。