Faraday: 帮助编写中间件

创建于 2014-01-21  ·  13评论  ·  资料来源: lostisland/faraday

在我看来,以下应该工作的文档。 但事实并非如此。 这些文档不适合编写中间件。 取而代之的是,有人可以提供一些帮助。

# play.rb
require 'faraday'

class MyMiddleware

  attr_reader :options

  def initialize(app, options={})
    <strong i="6">@app</strong> = app
    <strong i="7">@options</strong> = options
  end

  def call(env)
    @app.call(env)
  end

end

# This doesn't seem to work either, removing for now.
# Faraday.register_middleware :request, my_middlware: lambda { MyMiddleware }

client = Faraday.new do |conn|
  # conn.request :my_middleware, foo: :bar
  conn.request MyMiddleware, foo: :bar
end

response = client.get('http://jasonwaldrip.com/')
$ ruby play.rb
/Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday.rb:64:in `lookup_middleware': MyMiddleware is not registered on Faraday::Request (RuntimeError)
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday/builder.rb:146:in `use_symbol'
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday/builder.rb:100:in `request'
    from play.rb:19:in `block in <main>'
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday/connection.rb:65:in `initialize'
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday.rb:11:in `new'
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday.rb:11:in `new'
    from play.rb:18:in `<main>'

最有用的评论

一个完整的简单示例对文档大有帮助。

所有13条评论

尝试conn.use而不是conn.request 。 它试图在 Faraday::Request 中查看 MyMiddleware 中间件。

https://github.com/lostisland/faraday/blob/b8d90a59bafb8dd6e19488fae07945a7700f5664/lib/faraday/rack_builder.rb#L82 -L101

@technoweenie我们应该有更好的文档来说明如何注册中间件。 我最近不得不在这里做,并且不得不阅读代码来弄清楚如何做。

@jwaldrip如果你已经注册了你的中间件,你就可以说conn.request

如果你已经注册了你的中间件,你就可以说 conn.request。

此外,您应该使用您注册的符号,而不是类名。 这些符号只是作为包含完整类名的快捷方式。 conn.request(:json)Faraday::Request::JSON基本相同。

我们应该有更好的文档来说明如何注册中间件。

:+1: 我推迟了,因为我打算彻底改变中间件系统。

@jwaldrip是对的,这是糟糕的用户体验。 他注释掉了在符号速记下注册中间件的行,但继续使用conn.request setter,我认为它只适用于符号速记。 因此找不到中间件。

我们应该考虑如何改进它,或者至少有一个更好的错误信息。

我开始工作了,花了一些时间。 让我知道我是否可以在文档或中间件返工方面提供帮助。

你最终的设置是什么样的? @jwaldrip

有没有围绕这个写过什么? 我找不到任何有用的东西,不得不用几分钟的时间来弄清楚。

@stefansedich不确定在这次讨论之后是否有任何直接的跟进或改进,但我们计划在下一个主要版本 (1.0) 的文档上做一些繁重的工作,所以希望这在未来不会成为问题再次。

如果有人暂时在此问题中发布确切的注册内容,那就太好了。

@maxim我们现在有一个官方网站,里面有一些关于中间件的文档,但它仍在改进。

简而言之, requestresponse应该只用于注册的中间件,如果你需要注入一个定制的中间件,调用.use更容易。
因此,在上面的示例中,以下内容将起作用:

client = Faraday.new do |conn|
  conn.use MyMiddleware, foo: :bar
end

一个完整的简单示例对文档大有帮助。

@maxim我们现在有一个官方网站,里面有一些关于中间件的文档,但它仍在改进。

简而言之,request 和 response 应该只用于注册的中间件,如果你需要注入一个定制的更容易调用.use。
因此,在上面的示例中,以下内容将起作用:

client = Faraday.new do |conn|
  conn.use MyMiddleware, foo: :bar
end

@iMacTia这不在文档中,但它是必不可少的。 也许它可以在https://lostisland.github.io/faraday/middleware/custom

@wilsonsilva你说得对,这绝对是一个很好的改进😅。 我很惊讶它被错过了公平

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

luizkowalski picture luizkowalski  ·  3评论

amrrbakry picture amrrbakry  ·  4评论

Lewiscowles1986 picture Lewiscowles1986  ·  4评论

yusefu picture yusefu  ·  3评论

mattmill30 picture mattmill30  ·  4评论