Faraday: Cara menggunakan coba lagi dengan metode POST

Dibuat pada 12 Mar 2018  ·  3Komentar  ·  Sumber: lostisland/faraday

Info dasar

  • 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]

Deskripsi masalah

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.

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!

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

Bagaimanapun, senang mengetahui masalah Anda sekarang terpecahkan 👍!

Semua 3 komentar

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 👍!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jwaldrip picture jwaldrip  ·  13Komentar

jasnow picture jasnow  ·  9Komentar

sferik picture sferik  ·  26Komentar

mscoutermarsh picture mscoutermarsh  ·  9Komentar

coberlin picture coberlin  ·  32Komentar