Faraday: POST рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдорд╛рд░реНрдЪ 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: lostisland/faraday

рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА

  • рдлреИрд░рд╛рдбреЗ рд╕рдВрд╕реНрдХрд░рдг:
    рдлреИрд░рд╛рдбреЗ (0.11.0)
    рдлреИрд░рд╛рдбреЗ_рдорд┐рдбрд▓рд╡реЗрдпрд░ (0.11.0.1)
    faraday_middleware-aws-signers-v4 (0.1.5)

  • рд░реВрдмреА рд╕рдВрд╕реНрдХрд░рдг:
    рд░реВрдмреА 2.3.0p0 (2015-12-25 рд╕рдВрд╢реЛрдзрди 53290) [x86_64-darwin15]

рдореБрджреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг

рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдлреИрд░рд╛рдбреЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЬрдм рддрдХ рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдмрджрд▓рд╛ рддрдм рддрдХ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЧреБрдЧрд▓ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рдХрд┐ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рд╣реИ рдореЗрдВ рд╢рд╛рдорд┐рд▓

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

рд░реЗрдлрд░реА: https://github.com/lostisland/faraday/pull/437/files
рдФрд░ рдЕрдЧрд░ рдореИрдВ POST рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ retry_if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ dor retry_if ред

рддреЛ рдореЗрд░рд╛ рдХрдиреЗрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

    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

рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдмреБрд▓рд╛ рд░рд╣рд╛ рд╣реИ:

  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

рдХрд┐рд╕реА рднреА рдорджрдж рдХрд╛ рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ @yusefu рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ TypeError рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ @connections рдПрдХ рд╣реИрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рд╕рд░рдгреА рдирд╣реАрдВ, рдореЗрд░рд╛ рдмреБрд░рд╛!

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

рд╡реИрд╕реЗ рднреА, рдпрд╣ рдЬрд╛рдирдХрд░ рдЦреБрд╢реА рд╣реБрдИ рдХрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдЕрдм рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ !

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдп @yusefu , рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдХрдореА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо v1.0 рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЗрд╕ рдмреАрдЪ, рдореБрдЭреЗ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рджреЗрдВред рдореВрд▓ рд░реВрдк рд╕реЗ retry_if рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк max: 5, exceptions: [BadRequest, NotFound, ServerError, Faraday::Error::ConnectionFailed] рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ retry_if рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ рддреЛ рд▓реИрдореНрдмреНрдбрд╛ рдпрд╛ proc.
рдпрджрд┐ рдЖрдк рдЙрдирд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдореИрдВ рдПрдХ proc рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛, рдЬрд┐рд╕реЗ Proc.new { ... } рдпрд╛ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ Proc.new do ... end рдХреЗ рд╕рд╛рде рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рдпрджрд┐ рдЖрдк retry_if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:

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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп :post рдХреЛ рдкреБрдирд░реНрдкреНрд░рдпрд╛рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕ рдкреАрдЖрд░ рдкрд░ рдЬреЛрдбрд╝реЗ рдЧрдП methods рд╡рд┐рдХрд▓реНрдк рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рд╣реИ:

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

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ

рдХрдиреЗрдХреНрд╢рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдиреЗ рдЯрд╛рдЗрдк рдПрд░рд░ рджрд┐рдпрд╛ред

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

рд▓реЗрдХрд┐рди IDEMPOTENT_METHODS рдореЗрдВ рдкреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рдзрд╛рд░рдг рдЬреЛрдбрд╝ рдХреЗ рд╕рд╛рде рдЕрдм рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рд╕рдВрднрд╡ рд╣реИред
рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж @iMacTia ЁЯЩП рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ @yusefu рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ TypeError рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ @connections рдПрдХ рд╣реИрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рд╕рд░рдгреА рдирд╣реАрдВ, рдореЗрд░рд╛ рдмреБрд░рд╛!

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

рд╡реИрд╕реЗ рднреА, рдпрд╣ рдЬрд╛рдирдХрд░ рдЦреБрд╢реА рд╣реБрдИ рдХрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдЕрдм рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ !

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mattmill30 picture mattmill30  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jeffb-stell picture jeffb-stell  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jedeleh picture jedeleh  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

iMacTia picture iMacTia  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

t3hk0d3 picture t3hk0d3  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ