рдлреИрд░рд╛рдбреЗ рд╕рдВрд╕реНрдХрд░рдг:
рдлреИрд░рд╛рдбреЗ (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 , рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдХрдореА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо 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> ||= {}
рд╡реИрд╕реЗ рднреА, рдпрд╣ рдЬрд╛рдирдХрд░ рдЦреБрд╢реА рд╣реБрдИ рдХрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдЕрдм рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ !
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ @yusefu рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ TypeError рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐
@connections
рдПрдХ рд╣реИрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рд╕рд░рдгреА рдирд╣реАрдВ, рдореЗрд░рд╛ рдмреБрд░рд╛!рд╡реИрд╕реЗ рднреА, рдпрд╣ рдЬрд╛рдирдХрд░ рдЦреБрд╢реА рд╣реБрдИ рдХрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдЕрдм рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ !