Faraday: ๋ฐ”๋””์™€ ํ•จ๊ป˜ ์‚ญ์ œ

์— ๋งŒ๋“  2017๋…„ 05์›” 17์ผ  ยท  23์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: lostisland/faraday

HTTP ์‚ฌ์–‘์€ 2014๋…„์— ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉฐ ์‚ญ์ œ์— ๋ณธ๋ฌธ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” ๋ณธ๋ฌธ์„ ํ—ˆ์šฉํ•˜๊ณ  ์‚ญ์ œํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด connection.rb์—์„œ ์œ„์ž„์ž ๋ฉ”์†Œ๋“œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•„์ง ์ด๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ œ ๊ฒฝ์šฐ์— ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋‹ค์Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

conn = Faraday.new
body = {
some_key: 'some value'
}
conn.run_request(:delete, url, body, headers)

์‚ญ์ œ๊ฐ€ ๋” ์ด์ƒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณธ๋ฌธ์„ nilsํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ชจ๋“  23 ๋Œ“๊ธ€

๊ท€ํ•˜์˜ ๊ฒ€ํ† ๋ฅผ ์œ„ํ•ด PR์ด ๊ณง ์˜ฌ๋ผ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @Carlbc18 ์ž…๋‹ˆ๋‹ค .

์œ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
HTTP 2.0 ์‚ฌ์–‘์—๋งŒ ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด ๊ธฐ๋Šฅ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

https://tools.ietf.org/html/rfc7231#section -4.3.5

์ฐธ๊ณ : ์ด ๋™์ผํ•œ ํ…์ŠคํŠธ ๋ธ”๋ก์€ GET && HEAD ์š”์ฒญ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ์‚ฌ์–‘์˜ ์ด ๋ถ€๋ถ„:

DELETE ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๋‚ด์˜ ํŽ˜์ด๋กœ๋“œ์—๋Š” ์ •์˜๋œ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
DELETE ์š”์ฒญ์— ํŽ˜์ด๋กœ๋“œ ๋ณธ๋ฌธ์„ ๋ณด๋‚ด๋ฉด ๊ธฐ์กด
์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ตฌํ˜„.

์ž‘๋™ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค(์›ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ). ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ™๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๊นŒ?

HTTP 2.0 ์‚ฌ์–‘์—๋งŒ ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด ๊ธฐ๋Šฅ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ HTTP 1.1์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

PR์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๊ผญ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์ €์žฅ์†Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ faraday ํฌํฌํ•˜๊ณ  ํฌํฌ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•œ ๋‹ค์Œ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ PR์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@iMacTia ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์˜ฌ๋ ค์ค„๊ฒŒ. ๋ฒ„์ „ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ๊ฒฌํ•ด๋Š” ๋งˆ์นจ๋‚ด ์ด๊ฒƒ์œผ๋กœ ์ฃผ์š” ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” semver ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ํŒจ๋Ÿฌ๋ฐ์ด ๋ฒ„์ „์€ 1.0.0์ด ๋ฉ๋‹ˆ๋‹ค. ๋„ค ์ƒ๊ฐ์„ ๋งํ•ด๋ด.

์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ semver๋ฅผ ๊ณ ์ˆ˜ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” v1.0์„ ์˜ˆ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ค‘๋‹จ๋  ๊ฒฝ์šฐ ๋ฒ„์ „ 1.0(ํ˜„์žฌ ๊ณ ์ •๋œ ๋ฆด๋ฆฌ์Šค ๋‚ ์งœ๊ฐ€ ์—†์Œ)์—์„œ๋งŒ ๋ฆด๋ฆฌ์Šค๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์ดํ•ด๋Š” ์ด์ œ ์„ ํƒ์ ์œผ๋กœ GET, HEAD ๋ฐ DELETE ์š”์ฒญ์— ๋ณธ๋ฌธ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@iMacTia i ๋ฒ„์ „์ด 0.13.0์ด๊ณ  PR์ด ์˜ฌ๋ผ์™”์Šต๋‹ˆ๋‹ค. ์˜๊ฒฌ์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋Œ€ํ™”๋ฅผ PR์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ๋‚ด https://github.com/lostisland/faraday/pull/695#issuecomment -305145499์— ๋Œ€ํ•œ ํ›„์† ์กฐ์น˜์ž…๋‹ˆ๋‹ค.
์šฐ์„  ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์•„๋ž˜๋Š” ์—ฌ์ „ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

conn = Faraday.new(...)
conn.get('/path', {page: 1, per: 10})

# performs "GET /path?page=1&per=10"

๋‚ด ์˜๊ฒฌ์— ๋ช…์‹œ๋œ ์˜ต์…˜ 1์€ ์ด ๋™์ž‘์„ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

conn = Faraday.new(..., standard: :http1_1)
conn.get('/path', {page: 1, per: 10})

# performs "GET /path" with body "page=1&per=10" (assuming www_form_url_encoded request)

๋Œ€์‹  ์˜ต์…˜ 2๋Š” ๋” ๊ฐ•๋ ฅํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

conn = Faraday.new(...) # note no special config here
conn.get('/path', {page: 1, per: 10}, body: {some_key: 'some_value')

# performs "GET /path?page=1&per=10" with body "some_key=some_value"

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ruby โ€‹โ€‹1.9๋Š” ํ‚ค์›Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ต์…˜ 2๋Š” ruby โ€‹โ€‹>= 2์—์„œ๋งŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ž

๋ฃจ๋น„ 1.9์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Ruby 1.9๋Š” ์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํŒจ๋Ÿฌ๋ฐ์ด์˜ v1.0 ๋ฆด๋ฆฌ์Šค์™€ ์ธ๋ผ์ธ์ด ๋  ์ตœ์†Œ ๋ฃจ๋น„ ๋ฒ„์ „์„ ์œ„ํ•ด ์ ์–ด๋„ 2.0์œผ๋กœ ๋ฒ„์ „์„ ์˜ฌ๋ฆด ๊ฒƒ์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜ต์…˜ 2๋Š” parms ๋ฐ/๋˜๋Š” ์„ ํƒ์  ๋ณธ๋ฌธ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์œผ๋ฏ€๋กœ http 1.1 ์‚ฌ์–‘์„ ๋” ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

Ruby 1.9์—์„œ ์ž‘๋™ํ•˜๋Š” http ์‚ฌ์–‘ ๊ธฐ๋Šฅ๊ณผ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ V1 of Faraday์— ๋” ์ ํ•ฉํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ(ruby v, params ์ „๋‹ฌ)์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ณผํ•œ ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฑด ์•„๋‹๊นŒ....

๋ฃจ๋น„ 1.9์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Ruby 1.9๋Š” ์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํŒจ๋Ÿฌ๋ฐ์ด์˜ v1.0 ๋ฆด๋ฆฌ์Šค์™€ ์ธ๋ผ์ธ์ด ๋  ์ตœ์†Œ ๋ฃจ๋น„ ๋ฒ„์ „์„ ์œ„ํ•ด ์ ์–ด๋„ 2.0์œผ๋กœ ๋ฒ„์ „์„ ์˜ฌ๋ฆด ๊ฒƒ์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜ต์…˜ 2๋Š” parms ๋ฐ/๋˜๋Š” ์„ ํƒ์  ๋ณธ๋ฌธ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์œผ๋ฏ€๋กœ http 1.1 ์‚ฌ์–‘์„ ๋” ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์œ„์˜ ๋ชจ๋“  ๋‚ด์šฉ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ v1.0์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•จ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ตœ์„ ์˜ ์กฐ์น˜์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ v1.0 ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” API๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GET, HEAD, ์‚ญ์ œ ์š”์ฒญ

conn = Faraday.new(...) # note no special config here
conn.get(path, url_params, body: {...})
# second parameter is URL PARAMS, optionally accept a named parameter for request body
# works the same for head and delete

POST, PUT, ํŒจ์น˜ ์š”์ฒญ

conn = Faraday.new(...) # note no special config here
conn.post(path, body, url_params: {...})
# second parameter is REQUEST BODY, optionally accept a named parameter for url_params
# works the same for put and patch

์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์„ ๋‹ค๋ฃจ๊ณ  post/put/patch ์š”์ฒญ๋„ ํ™•์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด PR์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ์ด๋ฅผ ์œ„ํ•ด ์ƒˆ PR์„ ์—ด๊ฒ ์Šต๋‹ˆ๊นŒ? ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” V1 ๋ถ„๊ธฐ ์ปท์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์„ ๋‹ซ๊ณ  ์™„์ „ํžˆ ๋‹ค๋ฅผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— V1 ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋งˆ์Šคํ„ฐ์—์„œ ์ž์œ ๋กญ๊ฒŒ ์‹œ์ž‘ํ•˜๋ฉด PR์„ ๋ฆฌ๋””๋ ‰์…˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

์•ˆ๋…•ํ•˜์„ธ์š” @Carlbc18 ๋‹˜์ด ์ด์ œ 1.0 ์ง€์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ƒ.

๊ณ ๋งˆ์›Œ, ๊ณ ๋งˆ์›Œ! ๐Ÿ˜€

์•„์ง ์ด๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ œ ๊ฒฝ์šฐ์— ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋‹ค์Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

conn = Faraday.new
body = {
some_key: 'some value'
}
conn.run_request(:delete, url, body, headers)

์‚ญ์ œ๊ฐ€ ๋” ์ด์ƒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณธ๋ฌธ์„ nilsํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„์ง PR์„ ๋ณธ ์ ์€ ์—†์ง€๋งŒ v1์— ๋Œ€ํ•œ ์ž‘์—…์ด ์ฒœ์ฒœํžˆ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ง์ ‘ ์ž‘์—…ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฒฌ์ ์„ ๋“œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋œ API๋Š” ์œ„์˜ ๋‚ด ์˜๊ฒฌ์— ์„ค๋ช…๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ˆ„๊ตฌ๋“ ์ง€ ๋‚˜๋ณด๋‹ค ๋จผ์ € ์‹œ๋„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด PR์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋Š” ์†”๋ฃจ์…˜์˜ ๊ฒฝ์šฐ PR์„ ๋งˆ์Šคํ„ฐ์—์„œ ๋ถ„๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ 0.x ๋ฆด๋ฆฌ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ค‘๋‹จ๋  ๊ฒฝ์šฐ 1.0 ๋ถ„๊ธฐ์—์„œ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://github.com/lostisland/faraday/pull/855 ๋Š” ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ PR ์ดˆ์•ˆ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ํŒจ๋Ÿฌ๋ฐ์ด์—์„œ ๋ธ”๋ก ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณธ๋ฌธ์œผ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

conn.delete(url) do |req|
  req.body = { some_key: 'some value' }
end

์ด ์•„์ด๋””์–ด๋Š” ๋ณธ์ฒด๋ฅผ ๋‹จ์ผ ๋ผ์ด๋„ˆ๋กœ ๊ฐ„๋‹จํžˆ ์‚ญ์ œํ–ˆ์ง€๋งŒ ๊ตฌํ˜„์€ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋ณต์žกํ•˜๊ณ  ๋†€๋ผ์šด ๋™์ž‘์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ธ”๋ก ํ˜•์‹์€ ์ด๋ฏธ ํŒจ๋Ÿฌ๋ฐ์ด์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์— ๋” ๋งŽ์€ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํด๋ž˜์Šค์˜ ์†์„ฑ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

conn.delete('/foo/1') do |req|
  req.headers["X-Men"] = "marvel"
  req.params[:confirm] = 1
  req.body = { some_key: 'some value' }
end
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰