【问题标题】:Faraday gem undefined method 'bytesize'=' for Hash`Faraday gem未定义方法'bytesize'='用于Hash`
【发布时间】:2018-05-25 07:43:38
【问题描述】:

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

但它也不起作用。

【问题讨论】:

  • 这是一个不错的库,用于在 ruby​​ 中发出 HTTP 请求:ruby-doc.org/stdlib-2.5.1/libdoc/net/http/rdoc/Net/HTTP.html
  • 这个错误可能是因为form_data不是正确的json格式。
  • to_json的结果肯定响应bytesize:form_data.to_json.respond_to?(:bytesize) #=> true
  • 应该没问题。刚刚尝试使用您的设置发出发布请求,一切正常。 conn.post("https://google.com/api/test", {a: 1, b: 2}.to_json) => #<Faraday::Response:0x00007fe66b9f5a20 ...>
  • 当您运行第二个代码(带有form_data.to_json 的代码)时会发生什么——您得到的是同样的错误还是另一个错误?

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


【解决方案1】:

官方faradayrepo 提供下一个描述:

# 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 或提供的代码无关的新错误。

【讨论】:

  • “导致解析错误” / “与法拉第无关的新错误” - 你指的是哪个其他错误?
  • "您指的是哪个其他错误?" - 没有任何其他错误
【解决方案2】:

使用to_json将其转换为json,as_json也会失败。

{ key: value }.as_json.respond_to?(:bytesize) => false

{ key: value }.to_json.respond_to?(:bytesize) => true

【讨论】:

    猜你喜欢
    • 2010-11-10
    • 2014-03-15
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多