Faraday: So verwenden Sie die Wiederholung mit der POST-Methode

Erstellt am 12. März 2018  ·  3Kommentare  ·  Quelle: lostisland/faraday

Basisinformation

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

  • Ruby-Version:
    ruby 2.3.0p0 (2015-12-25 Revision 53290) [x86_64-darwin15]

Fehlerbeschreibung

Ich habe eine Schnittstelle, die auf eine API zugreift, habe eine Faraday -Verbindung mit der Methode get verwendet und eine Wiederholung eingestellt, und alles hat gut funktioniert, bis ich meine Methode zum Posten geändert habe , dann hat die Wiederholung aufgehört zu funktionieren inbegriffen in

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

Siehe: https://github.com/lostisland/faraday/pull/437/files
und ich muss retry_if verwenden, wenn ich den POST wiederholen möchte, aber keine Dokumentation für retry_if gefunden habe .

Also meine Verbindung sieht so aus:

    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

und nennt es so:

  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

Jede Hilfe ist sehr willkommen.

Hilfreichster Kommentar

Danke für das Feedback @yusefu und sorry für den TypeError.
Ich denke, das Problem ist, dass @connections ein Hash sein sollte, kein Array, mein Fehler!

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

Wie auch immer, ich freue mich zu wissen, dass Ihr Problem jetzt gelöst ist 👍!

Alle 3 Kommentare

Hallo @yusefu , entschuldige die fehlende Dokumentation, das versuchen wir in v1.0 zu beheben.
Lassen Sie mich in der Zwischenzeit bei Ihrem Problem helfen. Grundsätzlich ist retry_if eine Option, die Sie genau so übergeben können, wie Sie max: 5, exceptions: [BadRequest, NotFound, ServerError, Faraday::Error::ConnectionFailed] übergeben. Der einzige Unterschied besteht darin, dass retry_if eine Funktion sein muss (entweder ein Lambda oder ein proc.
Wenn Sie damit nicht vertraut sind, würde ich vorschlagen, mit einem proc zu gehen, das mit Proc.new { ... } oder mit dem mehrzeiligen Proc.new do ... end instanziiert werden kann.

Wenn Sie also retry_if verwenden möchten, würde Ihr Beispiel so aussehen:

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

Wenn Ihr einziges Ziel jedoch darin besteht, :post zur Liste der Wiederholungsmethoden hinzuzufügen, können Sie auch die Option methods verwenden, die dem von Ihnen verlinkten PR hinzugefügt wurde:

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

Bitte lassen Sie mich wissen, ob das hilft 😄

Die Verbindungsinstanz hat einen TypeError ausgegeben.

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

Aber mit dem einfachen Hinzufügen von post zu IDEMPOTENT_METHODS ist der erneute Versuch jetzt möglich.
Vielen Dank @iMacTia 🙏 es hat funktioniert.

Danke für das Feedback @yusefu und sorry für den TypeError.
Ich denke, das Problem ist, dass @connections ein Hash sein sollte, kein Array, mein Fehler!

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

Wie auch immer, ich freue mich zu wissen, dass Ihr Problem jetzt gelöst ist 👍!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

mvastola picture mvastola  ·  4Kommentare

jedeleh picture jedeleh  ·  3Kommentare

jordansissel picture jordansissel  ·  5Kommentare

mokolabs picture mokolabs  ·  3Kommentare

Lewiscowles1986 picture Lewiscowles1986  ·  4Kommentare