๋ด๊ฐ ์ฌ์ฉํ๋ ์๋น์ค ์ ๊ณต์
์ฒด ์ค ํ๋๋ https://service.com/service:search
์ ๊ฐ์ URL์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํจ๋ฌ๋ฐ์ด๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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
)
ํ์ง๋ง ๋ฌธ์ ์ URL๋ก ์ด ์์ ์ ์ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
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='
๊ธฐ๋ณธ ์ด๋ํฐ์ด๊ธฐ ๋๋ฌธ์ net/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
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ค์ ๋ก ์๋ํ๋ฏ๋ก Faraday์ ๋ฌด์ธ๊ฐ๊ฐ net/http์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ด URL์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋
ํ์ธ์ @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
์ ์กด์ฌ ๋๋ถ์ ์ค์ ๋ :
URL์
๋ค์ ์ค๊น์ง ๋ฌธ์ ๋ฅผ ์ถ์ ํ์ต๋๋ค. 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
์
๋๋ค.
์ด์ ํฅ๋ฏธ๋กญ๊ฒ์ ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์ ๊ฒฝ์ฐ +
URI์ ๋ํ ๋ฐฉ๋ฒ์ด ํฌํจ ๋ :
๊ฒฐ๊ณผ๊ฐ ๋งค์ฐ ์๊ธฐ์น ์์์ฒ๋ผ ๋ณด์ธ๋ค!
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๋ง ๋จ์ต๋๋ค.
์ด ๊ฒฝ์ฐ ์์ ์ ๋งค์ฐ ์ฝ์ต๋๋ค. URL ์์ /
๋ฅผ ์ถ๊ฐํ๋ฉด ์ถฉ๋ถํฉ๋๋ค. ์์๋๋ก ์๋ํฉ๋๋ค.
data = Provider::Client.post(
"/service:search?limit=#{LIMIT}&offset=#{offset}", search_params
)
๊ทธ๋ฌ๋ /
์์ํ ์ ์๋ base
์๋ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํด์ผ ํ ์ ์์ผ๋ฏ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ํ์ง๋ ์์ต๋๋ค.
/
์์ ์ถ๊ฐํ์ฌ ์๋ํด ๋ณด๊ณ ์๋ํ๋์ง ์๋ ค์ฃผ์ญ์์ค. ํ์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ์ด์ด๋๊ณ ์ดํด๋ณด๊ณ Faraday์์ ํด๋น ์ฝ๋ ์ค์ ์์ ํ์ฌ ์ด ๊ฒฝ์ฐ ์๋ํฉ๋๋ค.
์ง์ ์๋ํด๋ณด๊ณ ์ถ๋ค๋ฉด ๊ธฐ๊บผ์ด PR์ ๊ฒํ ํ๊ฒ ์ต๋๋ค ๐
@iMacTia ์ด์ ์๋ํ์ต๋๋ค. ๊ธฐ๋ณธ URL์ https://service.com/api
์
๋๋ค. ๋๋ ์ถ๊ฐํ๋ฉด /
์ service:search
I๊ฐ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค ๋์น /api
๋ด๊ฐ ์ถ๊ฐํ๋๋ก ๊ธฐ๋ณธ URL์์ ์ฌ๋ผ์ก๋ค /api/service:search
ํ๊ณ ์ง๊ธ์์ ๋ฒ๊ธ์
@luizkowalski ์๋ฒฝ, ๋ค, ๊ทธ๊ฒ ์ ํํ ์ ๊ฐ ์๋ฏธํ ๋ฐ์ ๋๋ค.
๊ทธ๋ฌ๋ /๋ก ์์ํ ์ ์๋ ๊ธฐ์ค์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํด์ผ ํ ์๋ ์์ผ๋ฏ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ํ์ง๋ ์์ต๋๋ค.
ํจ๋ฌ๋ฐ์ด๋ ์ ๊ณต๋ URL์ด /
๋ก ์์ํ๊ณ ๊ธฐ๋ณธ์ ์ ๊ณต๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ฑฐํ ๊ฒฝ์ฐ ์ ๋ URL์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
์ด๋ฏธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์๊ธฐ ๋๋ฌธ์ ๋คํ์ด์ง๋ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ ์ด์ ํ์ํ์ง ์๋๋ก ์ฌ์ ํ ์ฌ๋ฐ๋ฅด๊ฒ ์์ ๋์ด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@luizkowalski ์๋ฒฝ, ๋ค, ๊ทธ๊ฒ ์ ํํ ์ ๊ฐ ์๋ฏธํ ๋ฐ์ ๋๋ค.
ํจ๋ฌ๋ฐ์ด๋ ์ ๊ณต๋ URL์ด
/
๋ก ์์ํ๊ณ ๊ธฐ๋ณธ์ ์ ๊ณต๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ฑฐํ ๊ฒฝ์ฐ ์ ๋ URL์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.์ด๋ฏธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์๊ธฐ ๋๋ฌธ์ ๋คํ์ด์ง๋ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ ์ด์ ํ์ํ์ง ์๋๋ก ์ฌ์ ํ ์ฌ๋ฐ๋ฅด๊ฒ ์์ ๋์ด์ผ ํฉ๋๋ค.