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]
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.
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 👍!
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!Wie auch immer, ich freue mich zu wissen, dass Ihr Problem jetzt gelöst ist 👍!