Parece-me, com base na documentação, que o seguinte deve funcionar. Mas isso não acontece. Os documentos são ruins para escrever middleware. Em vez disso, alguém pode prestar alguma ajuda.
# 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>'
Experimente conn.use
vez de conn.request
. Ele está tentando procurar o middleware MyMiddleware em Faraday :: Request.
@technoweenie Devemos ter uma documentação melhor sobre como registrar o middleware. Recentemente, tive que fazer isso aqui e li o código para descobrir como.
@jwaldrip Se você registrou seu middleware, poderia dizer conn.request
.
Se você registrou seu middleware, poderá dizer conn.request.
Além disso, você deve usar o símbolo com o qual se registrou, não o nome da classe. Os símbolos estão lá apenas como um atalho para incluir o nome completo da classe. conn.request(:json)
é basicamente igual a Faraday::Request::JSON
.
Devemos ter uma documentação melhor sobre como registrar o middleware.
: +1: Eu empurrei porque planejava mudar completamente o sistema de middleware.
@jwaldrip está certo ao dizer que esta é uma experiência do usuário ruim. Ele comentou a linha que registra o middleware sob uma abreviação de símbolo, mas continuou a usar conn.request
setter que só funciona com abreviações de símbolo, eu acho. Portanto, o middleware não foi encontrado.
Devemos pensar em como melhorar isso, ou pelo menos ter uma mensagem de erro melhor.
Eu consegui fazer funcionar, demorou um pouco. Deixe-me saber se eu posso ajudar em alguma coisa com a documentação ou com o retrabalho do middleware.
Qual foi sua configuração final? @jwaldrip
Já houve alguma coisa escrita sobre isso? Não consegui encontrar nada útil e tive que bater com a cabeça por alguns minutos para descobrir.
@stefansedich não tem certeza se houve algum acompanhamento direto ou melhoria após esta discussão, mas estamos planejando fazer um trabalho pesado na documentação junto com a próxima versão principal (1.0), então esperamos que isso não seja um problema no futuro novamente.
Seria ótimo se alguém postasse a aparência exata do registro nesta edição por enquanto.
@maxim Agora temos um site oficial com alguma documentação sobre middleware , mas ainda está melhorando.
Resumindo, request
e response
só devem ser usados para middleware registrado, se você precisar injetar um customizado é mais fácil chamar .use
.
Portanto, no exemplo acima, o seguinte funcionaria:
client = Faraday.new do |conn|
conn.use MyMiddleware, foo: :bar
end
Um exemplo simples completo ajudaria muito na documentação.
@maxim Agora temos um site oficial com alguma documentação sobre middleware, mas ainda está melhorando.
Resumindo, a solicitação e a resposta devem ser usadas apenas para middleware registrado; se você precisar injetar um customizado, é mais fácil chamar .use.
Portanto, no exemplo acima, o seguinte funcionaria:client = Faraday.new do |conn| conn.use MyMiddleware, foo: :bar end
@iMacTia Isso não está na documentação, mas é essencial. Talvez possa estar em https://lostisland.github.io/faraday/middleware/custom
@wilsonsilva você está totalmente certo, isso seria uma boa melhora 😅. Estou surpreso por ter faltado para ser justo
Comentários muito úteis
Um exemplo simples completo ajudaria muito na documentação.