Faraday: URI рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рд╡рд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ

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

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

  • рдлреИрд░рд╛рдбреЗ рд╕рдВрд╕реНрдХрд░рдг: 1.1.0
  • рд░реВрдмреА рд╕рдВрд╕реНрдХрд░рдг: 2.7.1

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

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ URL рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ: https://service.com/service:search ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдо рдлреИрд░рд╛рдбреЗ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:

class Provider::Client
 ...
 delegate :post, :patch, :delete, :put, to: :client

 def client
  Faraday.new(url: 'https://service.com/') do |faraday|
    faraday.headers = headers.merge(content_type: content_type)
    faraday.response(:json, content_type: CONTENT_TYPE)
    faraday.basic_auth(USER, PASSWORD)
    faraday.adapter(Faraday.default_adapter)
  end
 end
end

рдФрд░ рдЬрдм рдореИрдВ рдЗрд╕реЗ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ

data = Provider::Client.post(
  "service:search?limit=#{LIMIT}&offset=#{offset}", search_params
)

рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдкреНрд░рд╢реНрди рдореЗрдВ рдпреВрдЖрд░рдПрд▓ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ:

URI::InvalidURIError: query conflicts with opaque
from /Users/luiz/.rbenv/versions/2.7.1/lib/ruby/2.7.0/uri/generic.rb:832:in `query='

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдиреЗрдЯ/http рдПрдбрд╛рдкреНрдЯрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдбрд╛рдкреНрдЯрд░ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╡рд╣реА рдХреЙрд▓ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдерд╛

require "uri"
require "net/http"

url = URI("https://service.com/service:search?limit=50&offset=400")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Accept"] = "custom_header"
request["Authorization"] = "Basic xxx="
request["Content-Type"] = "application/json"
request.body = "long_json"
response = https.request(request)

puts response.read_body

рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдлреИрд░рд╛рдбреЗ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рдпреВрдЖрд░рдПрд▓ рдХреЛ рдиреЗрдЯ/http рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдорд╛рдиреНрдп рдХрд░ рд░рд╣рд╛ рд╣реИ

bug good first issue

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

@luizkowalski рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА, рд╣рд╛рдБ рдпрд╣реА рд╡рд╣реА рд╣реИ рдЬреЛ рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ / рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

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

рд╣рд╛рдп @luizkowalski , рдЕрдкрд╡рд╛рдж URI рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ рдФрд░ query= рд╡рд┐рдзрд┐ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

def query=(v)
  return <strong i="9">@query</strong> = nil unless v
  raise InvalidURIError, "query conflicts with opaque" if <strong i="10">@opaque</strong>
  ...
end

рдлреИрд░рд╛рдбреЗ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдФрд░ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз url рдкрд░ рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рдЬрд╛рджреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ @opaque рдХреЛ : рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рдЗрд╕ рд▓рд╛рдЗрди рддрдХ рд▓рдЧрд╛рдпрд╛ рд╣реИ: https://github.com/lostisland/faraday/blob/c26df87b8653db4f270e3bcdc7a15bcdd2dd5cae/lib/faraday/connection.rb#L525
рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, base рд╣реЛрдЧрд╛ #<URI::HTTPS https://service.com/> рдФрд░ url рд╣реЛрдЧрд╛ service:search?limit=50&offset=400 ред
рдЕрдм, рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдпрджрд┐ рдпреВрдЖрд░рдЖрдИ рдХреЗ рд▓рд┐рдП + рд╡рд┐рдзрд┐ рдХреЗ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ : , рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ!

2.7.1 > url
 => "service:search?limit=50&offset=400" 
2.7.1 > base
 => #<URI::HTTPS https://service.com/> 
2.7.1 > base + url
 => #<URI::Generic service:search?limit=50&offset=400>

рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, base рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ url рдмрдЪрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рдХреНрд╕ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рдХреЗрд╡рд▓ / рдкреНрд░реАрдкреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдЪреАрдЬреЗрдВ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ:

data = Provider::Client.post(
  "/service:search?limit=#{LIMIT}&offset=#{offset}", search_params
)

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

@iMacTia рдЗрд╕рдиреЗ рдЕрдм рдХрд╛рдо рдХрд┐рдпрд╛ред рдЖрдзрд╛рд░ URL рд╣реИ: https://service.com/api ред рдЬрдм рдореИрдВрдиреЗ / рдХреЛ service:search рдЬреЛрдбрд╝рд╛ рддреЛ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рдФрд░ рджреЗрдЦрд╛ рдХрд┐ /api рдореВрд▓ URL рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ /api/service:search рдЬреЛрдбрд╝рд╛ рдФрд░ рдЕрдм рдпрд╣ рдареАрдХ рд╣реИ

@luizkowalski рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА, рд╣рд╛рдБ рдпрд╣реА рд╡рд╣реА рд╣реИ рдЬреЛ рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ / рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

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

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

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

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

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

subvertallchris picture subvertallchris  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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