Versi Faraday:
faraday (0,11,0)
faraday_middleware (0.11.0.1)
faraday_middleware-aws-signers-v4 (0.1.5)
Versi Ruby:
ruby 2.3.0p0 (2015-12-25 revisi 53290) [x86_64-darwin15]
Saya memiliki antarmuka yang mengakses beberapa api, menggunakan koneksi Faraday dengan metode get dan mengatur coba lagi, dan semuanya berfungsi dengan baik sampai saya mengubah metode saya untuk memposting kemudian coba lagi berhenti bekerja. Saya mencari di Google sedikit jadi saya mengerti bahwa posting itu tidak termasuk dalam
IDEMPOTENT_METHODS = [:delete, :get, :head, :options, :put]
ref: https://github.com/lostisland/faraday/pull/437/files
dan saya harus menggunakan retry_if jika saya ingin mencoba lagi POST tetapi tidak menemukan dokumentasi atau retry_if .
Jadi koneksi saya terlihat seperti ini:
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
dan menyebutnya seperti ini:
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
Bantuan apa pun akan sangat diterima.
Hai @yusefu , mohon maaf atas kurangnya dokumentasi, ini adalah sesuatu yang kami coba atasi di v1.0.
Sementara itu, izinkan saya membantu masalah Anda. Pada dasarnya retry_if
adalah opsi yang dapat Anda lewati dengan tepat bagaimana Anda melewati max: 5, exceptions: [BadRequest, NotFound, ServerError, Faraday::Error::ConnectionFailed]
. Satu-satunya perbedaan adalah bahwa retry_if
harus berupa fungsi (baik lambda atau proc.
Jika Anda tidak terbiasa dengan itu, saya sarankan untuk menggunakan proc
, yang dapat dipakai dengan Proc.new { ... }
atau dengan multi-baris Proc.new do ... end
.
Jadi jika Anda ingin menggunakan retry_if
contoh Anda akan menjadi seperti:
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
Namun, jika satu-satunya tujuan Anda adalah menambahkan :post ke daftar metode coba lagi, Anda juga dapat menggunakan opsi methods
yang ditambahkan pada PR yang Anda tautkan:
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
Tolong beri tahu saya jika ini membantu
Contoh koneksi memberikan TypeError.
expected MyAPI::BadRequest, got #<TypeError: {:req=>{}, :res=>nil, :headers=>nil, :reason_phrase=>nil}> with backtrace:
Tetapi dengan penambahan posting yang sederhana ke IDEMPOTENT_METHODS, percobaan ulang sekarang dimungkinkan.
Terima kasih banyak @iMacTia 🙏 berhasil.
Terima kasih atas umpan baliknya @yusefu dan maaf untuk TypeError.
Saya pikir masalahnya adalah @connections
harus berupa hash, bukan array, buruk!
<strong i="9">@connections</strong> ||= {}
Bagaimanapun, senang mengetahui masalah Anda sekarang terpecahkan 👍!
Komentar yang paling membantu
Terima kasih atas umpan baliknya @yusefu dan maaf untuk TypeError.
Saya pikir masalahnya adalah
@connections
harus berupa hash, bukan array, buruk!Bagaimanapun, senang mengetahui masalah Anda sekarang terpecahkan 👍!