ruby-on-rails - 法拉第 gem 未定义方法 'bytesize' =' for Hash`

标签 ruby-on-rails ruby ruby-on-rails-4 faraday

我想向 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)

但是我得到这个错误:

NoMethodError (undefined method `bytesize' for {:a=>1, :b=>2}:Hash)

我也试过:

conn.post("/api/test", form_data.to_json)

但它也不起作用。

最佳答案

官方faraday repo 提供下一个描述:

# 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

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

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

form_data = {a: 1, b: 2}.to_json

注意。使用符号键格式时,不要按.to_s转换,否则会导致解析错误。

通过你提供的法拉第配置,我在将 format_data 转换为 json 后不会导致任何错误。因此,新错误与法拉第 gem 或提供的代码无关。

关于ruby-on-rails - 法拉第 gem 未定义方法 'bytesize' =' for Hash`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50523995/

相关文章:

ruby-on-rails - 在 Rails 中创建制表符分隔的 ASCII 文件

ruby-on-rails - 我可以验证回形针附件不是危险的文件类型吗?

html - 导航栏的 Bootstrap 下拉菜单

ruby-on-rails - 对模型使用 has_and_belongs_to_many 是个坏主意吗?

ruby-on-rails - 是否可以跳过 Rails 4 中的 prepend_before_action 并设计?

ruby-on-rails - 如何删除默认 gem? !想卸载一个 gem 1.7.7 版本的 json

ruby-on-rails - ruby net-sftp 逐行读取文件

ruby - 生成随机日期

ruby - 为什么我们在 Rails 记录器中使用 block 而不是字符串?

ruby - 将数组结果转换为 ruby