Faraday: Comment utiliser la nouvelle tentative avec la méthode POST

Créé le 12 mars 2018  ·  3Commentaires  ·  Source: lostisland/faraday

Informations de base

  • Version Faraday :
    farday (0.11.0)
    faraday_middleware (0.11.0.1)
    faraday_middleware-aws-signers-v4 (0.1.5)

  • Version rubis :
    rubis 2.3.0p0 (2015-12-25 révision 53290) [x86_64-darwin15]

Description du problème

J'ai une interface accédant à une API, j'utilisais une connexion Faraday avec la méthode get et je définissais une nouvelle tentative, et tout fonctionnait bien jusqu'à ce que je change ma méthode pour publier , puis la nouvelle tentative a cessé de fonctionner . inclus dans le

IDEMPOTENT_METHODS = [:delete, :get, :head, :options, :put]

réf : https://github.com/lostisland/faraday/pull/437/files
et je dois utiliser retry_if si je souhaite réessayer le POST mais que je n'ai pas trouvé de documentation ou retry_if .

Donc ma connexion ressemble à ça :

    def my_connection(my_api_endpoint)
      Faraday.new(url: my_api_endpoint) do |faraday|
        faraday.request  :retry, max: 5, exceptions:
          [BadRequest, NotFound, ServerError, Faraday::Error::ConnectionFailed]
         faraday.response :logger
         faraday.adapter  Faraday.default_adapter
         faraday.options[:open_timeout] = 10
      end
    end

et l'appelant ainsi :

  res = my_connection(my_api_endpoint).post do |req|
    req.headers['Content-Type'] = 'application/json'
    req.options.timeout = 25
    req.body = body.to_json
  end

Toute aide sera la bienvenue.

Commentaire le plus utile

Merci pour les commentaires @yusefu et désolé pour le TypeError.
Je pense que le problème est que @connections devrait être un hachage, pas un tableau, mon mauvais!

<strong i="9">@connections</strong> ||= {}

Quoi qu'il en soit, heureux de savoir que votre problème est maintenant résolu 👍!

Tous les 3 commentaires

Salut @yusefu , excuses pour le manque de documentation, c'est quelque chose que nous essayons de résoudre dans la v1.0.
En attendant, laissez-moi vous aider à résoudre votre problème. Fondamentalement, le retry_if est une option que vous pouvez passer exactement comme vous passez max: 5, exceptions: [BadRequest, NotFound, ServerError, Faraday::Error::ConnectionFailed] . La seule différence est que retry_if doit être une fonction (soit un lambda, soit un proc.
Si vous n'êtes pas familier avec ceux-ci, je suggérerais d'utiliser un proc , qui peut être instancié avec Proc.new { ... } ou avec le multi-ligne Proc.new do ... end .

Donc, si vous voulez utiliser retry_if , votre exemple deviendrait quelque chose comme :

def my_connection(my_api_endpoint)
  # This is optional, I've added the <strong i="17">@connections</strong> memoized variable to avoid
  # re-creating the connection every time. Not sure it's applicable to your case
  # but consider it as it might improve performances
  <strong i="18">@connections</strong> ||= []
  @connections[my_api_endpoint] ||= Faraday.new(url: my_api_endpoint) do |faraday|
    faraday.request  :retry, max: 5, exceptions:
      [BadRequest, NotFound, ServerError, Faraday::Error::ConnectionFailed],
      retry_if: Proc.new do |env, exception|
        # your implementation goes here...
      end
     faraday.response :logger
     faraday.adapter  Faraday.default_adapter
     faraday.options[:open_timeout] = 10
  end
end

Cependant, si votre seul objectif est d'ajouter :post à la liste des méthodes de relance, vous pouvez également utiliser l'option methods ajoutée sur ce PR que vous avez lié :

def my_connection(my_api_endpoint)
  # This is optional, I've added the <strong i="23">@connections</strong> memoized variable to avoid
  # re-creating the connection every time. Not sure it's applicable to your case
  # but consider it as it might improve performances
  <strong i="24">@connections</strong> ||= []
  @connections[my_api_endpoint] ||= Faraday.new(url: my_api_endpoint) do |faraday|
    faraday.request  :retry, max: 5, exceptions:
      [BadRequest, NotFound, ServerError, Faraday::Error::ConnectionFailed],
      methods: Faraday::Request::Retry::IDEMPOTENT_METHODS + [:post]
     faraday.response :logger
     faraday.adapter  Faraday.default_adapter
     faraday.options[:open_timeout] = 10
  end
end

S'il vous plaît laissez-moi savoir si cela aide 😄

L'instance de connexions a donné une TypeError.

expected MyAPI::BadRequest, got #<TypeError: {:req=>{}, :res=>nil, :headers=>nil, :reason_phrase=>nil}> with backtrace:

Mais avec le simple ajout de post à IDEMPOTENT_METHODS, la nouvelle tentative est désormais possible.
Merci beaucoup @iMacTia 🙏 ça a marché.

Merci pour les commentaires @yusefu et désolé pour le TypeError.
Je pense que le problème est que @connections devrait être un hachage, pas un tableau, mon mauvais!

<strong i="9">@connections</strong> ||= {}

Quoi qu'il en soit, heureux de savoir que votre problème est maintenant résolu 👍!

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