【问题标题】:Faraday JSON post 'undefined method bytesize' for has bodies法拉第 JSON 发布“未定义方法字节大小”的主体
【发布时间】:2015-04-03 22:55:07
【问题描述】:

我正在尝试将一些代码从 HTTParty 转换为 Faraday。以前我使用的是:

HTTParty.post("http://localhost/widgets.json", body: { name: "Widget" })

新的sn-p是:

faraday = Faraday.new(url: "http://localhost") do |config|
  config.adapter Faraday.default_adapter

  config.request :json
  config.response :json
end
faraday.post("/widgets.json", { name: "Widget" })

结果为:NoMethodError: undefined method 'bytesize' for {}:Hash。是否可以让法拉第自动将我的请求正文序列化为字符串?

【问题讨论】:

  • 尝试将适配器放在中间件列表的最后——请参阅Advanced middleware usage
  • @l'L'l 这绝对是错误。您可以添加答案而不是评论,以便我接受 + 赏金吗?

标签: ruby faraday


【解决方案1】:

中间件列表要求按特定顺序构建/堆叠,否则会遇到此错误。第一个中间件被认为是最外面的,它包裹了所有其他中间件,所以适配器应该是最里面的一个(或最后一个):

Faraday.new(url: "http://localhost") do |config|
  config.request :json
  config.response :json
  config.adapter Faraday.default_adapter
end

请参阅Advanced middleware usage 了解更多信息。

【讨论】:

  • 谢谢!这绝对是订购。感谢您的回复。
【解决方案2】:

您始终可以为 Faraday 创建自己的中间件。

require 'faraday'

class RequestFormatterMiddleware < Faraday::Middleware
  def call(env)
    env = format_body(env)
    @app.call(env)
  end

  def format_body(env)
    env.body = 'test' #here is any of needed operation
    env
  end
end

conn = Faraday.new("http://localhost") do |c|
  c.use RequestFormatterMiddleware
end

response = conn.post do |req|
 req.url "http://localhost"
 req.headers['Content-Type'] = 'application/json'
 req.body = '{ "name": "lalalal" }' 
end

p response.body #=> "test"

【讨论】:

  • 你为什么投反对票?使用自己的中间件,您可以轻松地进行序列化。
  • 我投了反对票,因为这是一个糟糕的解决方案。 @I'L'I 的评论是正确的解决方案。编写自定义中间件来解决参数排序问题(这是唯一的问题)的建议是荒谬的。
猜你喜欢
  • 2012-09-01
  • 2013-06-02
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
相关资源
最近更新 更多