Faraday: Aide à l'écriture de middleware

Créé le 21 janv. 2014  ·  13Commentaires  ·  Source: lostisland/faraday

Il me semble d'après la documentation que ce qui suit devrait fonctionner. Mais ce n'est pas le cas. Les documents sont médiocres pour l'écriture de middleware. Au lieu de cela, quelqu'un peut-il prêter assistance.

# 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>'

Commentaire le plus utile

Un exemple simple et complet serait très utile pour la documentation.

Tous les 13 commentaires

Essayez conn.use au lieu de conn.request . Il essaie de regarder le middleware MyMiddleware dans Faraday::Request.

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

@technoweenie Nous devrions avoir une meilleure documentation sur la façon d'enregistrer un middleware. J'ai récemment dû le faire ici et j'ai dû lire le code pour comprendre comment.

@jwaldrip Si vous aviez enregistré votre middleware, vous seriez en mesure de dire conn.request .

Si vous aviez enregistré votre middleware, vous seriez en mesure de dire conn.request.

De plus, vous devez utiliser le symbole avec lequel vous vous êtes inscrit, pas le nom de la classe. Les symboles ne sont là que comme raccourci pour inclure le nom complet de la classe. conn.request(:json) est fondamentalement le même que Faraday::Request::JSON .

Nous devrions avoir une meilleure documentation sur la façon d'enregistrer un middleware.

:+1: Je l'ai repoussé car j'avais prévu de changer complètement le système middleware.

@jwaldrip Il est vrai qu'il s'agit d'une mauvaise expérience utilisateur. Il a commenté la ligne qui enregistre le middleware sous une abréviation de symbole, mais a continué à utiliser le setter conn.request qui ne fonctionne qu'avec les abréviations de symboles, je pense. Par conséquent, le middleware n'a pas pu être trouvé.

Nous devrions réfléchir à la manière d'améliorer cela, ou au moins avoir un meilleur message d'erreur.

Je l'ai fait fonctionner, a pris un certain temps. Faites-moi savoir si je peux aider avec la documentation ou la refonte du middleware.

À quoi ressemblait votre configuration finale ? @jwaldrip

Y a-t-il déjà eu quelque chose d'écrit à ce sujet ? Je n'ai rien trouvé d'utile et j'ai dû me cogner la tête pendant quelques minutes pour le comprendre.

@stefansedich ne sait pas s'il y a eu un suivi direct ou une amélioration après cette discussion, mais nous prévoyons de faire un gros travail sur la documentation avec la prochaine version majeure (1.0), donc j'espère que ce ne sera pas un problème à l'avenir encore.

Ce serait génial si quelqu'un publiait à quoi ressemble exactement l'enregistrement dans ce numéro pour l'instant.

@maxim Nous avons maintenant un site officiel avec de la documentation sur le middleware , mais il continue de s'améliorer.

En bref, request et response ne doivent être utilisés que pour un middleware enregistré, si vous devez en injecter un sur mesure, il est simplement plus facile d'appeler .use .
Ainsi, dans l'exemple ci-dessus, ce qui suit fonctionnerait :

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

Un exemple simple et complet serait très utile pour la documentation.

@maxim Nous avons maintenant un site officiel avec de la documentation sur le middleware, mais il continue de s'améliorer.

En bref, la demande et la réponse ne doivent être utilisées que pour un middleware enregistré, si vous devez en injecter un sur mesure, il est simplement plus facile d'appeler .use.
Ainsi, dans l'exemple ci-dessus, ce qui suit fonctionnerait :

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

@iMacTia Ce n'est pas dans la documentation mais c'est essentiel. Peut-être que cela pourrait être dans https://lostisland.github.io/faraday/middleware/custom

@wilsonsilva tu as tout à fait raison, ce serait certainement une bonne amélioration 😅. Je suis surpris qu'il ait été manqué pour être juste

Cette page vous a été utile?
0 / 5 - 0 notes