在我看来,以下应该工作的文档。 但事实并非如此。 这些文档不适合编写中间件。 取而代之的是,有人可以提供一些帮助。
# 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>'
尝试conn.use
而不是conn.request
。 它试图在 Faraday::Request 中查看 MyMiddleware 中间件。
@technoweenie我们应该有更好的文档来说明如何注册中间件。 我最近不得不在这里做,并且不得不阅读代码来弄清楚如何做。
@jwaldrip如果你已经注册了你的中间件,你就可以说conn.request
。
如果你已经注册了你的中间件,你就可以说 conn.request。
此外,您应该使用您注册的符号,而不是类名。 这些符号只是作为包含完整类名的快捷方式。 conn.request(:json)
与Faraday::Request::JSON
基本相同。
我们应该有更好的文档来说明如何注册中间件。
:+1: 我推迟了,因为我打算彻底改变中间件系统。
@jwaldrip是对的,这是糟糕的用户体验。 他注释掉了在符号速记下注册中间件的行,但继续使用conn.request
setter,我认为它只适用于符号速记。 因此找不到中间件。
我们应该考虑如何改进它,或者至少有一个更好的错误信息。
我开始工作了,花了一些时间。 让我知道我是否可以在文档或中间件返工方面提供帮助。
你最终的设置是什么样的? @jwaldrip
有没有围绕这个写过什么? 我找不到任何有用的东西,不得不用几分钟的时间来弄清楚。
@stefansedich不确定在这次讨论之后是否有任何直接的跟进或改进,但我们计划在下一个主要版本 (1.0) 的文档上做一些繁重的工作,所以希望这在未来不会成为问题再次。
如果有人暂时在此问题中发布确切的注册内容,那就太好了。
一个完整的简单示例对文档大有帮助。
@maxim我们现在有一个官方网站,里面有一些关于中间件的文档,但它仍在改进。
简而言之,request 和 response 应该只用于注册的中间件,如果你需要注入一个定制的更容易调用.use。
因此,在上面的示例中,以下内容将起作用:client = Faraday.new do |conn| conn.use MyMiddleware, foo: :bar end
@iMacTia这不在文档中,但它是必不可少的。 也许它可以在https://lostisland.github.io/faraday/middleware/custom
@wilsonsilva你说得对,这绝对是一个很好的改进😅。 我很惊讶它被错过了公平
最有用的评论
一个完整的简单示例对文档大有帮助。