HTTP & RESTful HTTP API

sanghun Leeยท2020๋…„ 8์›” 6์ผ
0

Today I Learned

๋ชฉ๋ก ๋ณด๊ธฐ
39/66
post-thumbnail

๐Ÿฆ‹Target

httpํ†ต์‹ ์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๊ณ  ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์ž

1. HTTP๋ž€?

Hyper Text Transger Protocol๋กœ html๋ฌธ์„œ๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ†ต์‹ ๊ทœ์•ฝ(protocol)์ด๋‹ค

์›น์ƒ์—์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋ผ๋ฆฌ ํ†ต์‹  ์‹œ ์–ด๋–ค ํ˜•์‹ ๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ์„ ํ•˜์ž๊ณ  ๊ทœ์ •ํ•ด ๋†“์€ ํ†ต์‹ ํ˜•์‹(๊ตฌ์กฐ)์ด๋‹ค(ํ”„๋ก ํŠธ์—”๋“œ์„œ๋ฒ„ <-> ํด๋ผ์ด์–ธํŠธ๊ฐ„์˜ ํ†ต์‹ )(๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์•ค๋“œ ์„œ๋ฒ„๊ฐ„์˜ ํ†ต์‹ )

2. Request? Response

ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP request๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๋Š” HTTP reponse๋ฅผ ๋ณด๋‚ธ๋‹ค
(๊ฐ๊ฐ์˜ ์š”์ฒญ/์‘๋‹ต set์€ ๋…๋ฆฝ์ ์ด๋‹ค)
ex) ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ ํ›„ ์‘๋‹ต์„ ๋ฐ›๊ณ  ๋ช‡ ์ดˆ ๋’ค ๋‹ค์‹œ ์š”์ฒญ์„ ๋ณด๋‚ด๋„ ์ „์— ๋ณด๋‚ธ ์š”์ฒญ ์‘๋‹ต์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•œ๋‹ค(์ง„ํ–‰๊ณผ์ •์ด๋‚˜ ๋ฐ์ดํ„ฐ ํ•„์š” ์‹œ ์ฟ ํ‚ค๋‚˜ ์„ธ์…˜๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค)

3. headers์™€ body์˜ ์—ญํ• ?

HTTP request๋Š” ํฌ๊ฒŒ 3๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ status line, headers, body๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • headers: ํ•ด๋‹นrequest์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค.(Request message, body length๋“ฑ..)

  • Key:value๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค(ex, HOST: google.com)

  • Headers๋Š” ํฌ๊ฒŒ 3๋ถ€๋ถ„(general, request, entity)์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ  ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” header์ •๋ณด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. Host: ์š”์ฒญ์ด ์ „์†ก๋˜๋Š” target์˜ host url: ์˜ˆ๋ฅผ ๋“ค์–ด google.com
  2. User-Agent: ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋Œ€ํ•œ ์ •๋ณด: ์˜ˆ๋ฅผ ๋“ค์–ด , ์›น๋ธŒ๋ผ์šฐ์ €์— ๋Œ€ํ•œ ์ •๋ณด.
  3. Accept: ํ•ด๋‹น์š”์ฒญ์ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์‘๋‹ตํƒ€์ž…
  4. Connection: ํ•ด๋‹น์š”์ฒญ์ด ๋๋‚œ ํ›„ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ปค๋„ฅ์…˜์„ ์œ ์ง€ํ•  ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด ๋Š์„์ง€์— ๋Œ€ํ•ด ์ง€์‹œํ•˜๋Š” ๋ถ€๋ถ„.
  5. Connect-Type: ํ•ด๋‹น์š”์ฒญ์ด ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€body์˜ ํƒ€์ž…. Json์„ ๋ณด๋‚ด๋ฉด application/json.
  6. Connect-Length: ๋ฉ”์„ธ์ง€ body์˜ ๊ธธ์ด
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json
Content-Length: 257
Host: google.com
User-Agent: HTTPie/0.9.3
  • Body: ํ•ด๋‹น request์˜ ์‹ค์ œ ๋ฉ”์„ธ์ง€/๋‚ด์šฉ.
  • Body ๊ฐ€ ์—†๋Š” request๋„ ๋งŽ์€๋ฐ Get request๋“ค์€ ๋Œ€๋ถ€๋ถ„ body๊ฐ€ ์—†๋‹ค.
POST /payment-sync HTTP/1.1

Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3

{
    "imp_uid": "imp_1234567890",
    "merchant_uid": "order_id_8237352",
    "status": "paid"
}

4. Method๋ž€?

  • GET: ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„(get)์˜ฌ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” method.
  1. ๋ฐ์ดํ„ฐ ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ ์—†์ด ๋ฐ›์•„์˜ค๊ธฐ๋งŒ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
  2. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” HTTP Method
  3. ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— request์— body๋ฅผ ์•ˆ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • POST: ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Method.
  1. ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •ํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„ Request body๊ฐ€ ํฌํ•จ๋˜์„œ ๋ณด๋‚ด์ง„๋‹ค.
  • OPTIONS :์ฃผ๋กœ ์š”์ฒญ URI์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” Method๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

  • PUT :POST์™€ ๋น„์Šทํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” Method.

  1. POST์™€ ๊ฒน์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์ค‘ํ•˜๋‚˜๋กœ ํ†ต์ผํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉฐ POST๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค.
  • DELETE: ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ์‚ญ์ œ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์“ฐ์ด๋Š” Method
  1. POST์— ๋ฐ€๋ ค ์ž˜ ์•ˆ์”€

5. Status-code ๋“ค์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”?

์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ๋งํ•œ๋‹ค.

์•„๋ž˜๋Š” ๊ทธ ์˜ˆ์ œ๋“ค์ด๋‹ค.

  • 200 OK : ๋ฌธ์ œ ์—†์ด ๋‹ค ์‹คํ–‰๋จ
  • 301 Moved Permanently: ํ•ด๋‹น URI๊ฐ€ ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๋ณด๋‚ด๋Š” ์ฝ”๋“œ
HTTP/1.1 301 Moved Permanently
Location: http://www.example.org/index.asp
  • 400 Bad Request: ํ•ด๋‹น์š”์ฒญ์ด ์ž˜๋ชป๋œ ์š”์ฒญ์ผ ๋•Œ ๋ณด๋‚ด๋Š” ์ฝ”๋“œ(์š”์ฒญ์— ํฌํ•จ๋œinput๊ฐ’๋“ค์ด ์ž˜ ๋ชป ๋ณด๋‚ด์ง„ ๊ฒฝ์šฐ)
  • 401 Unauthorized: ์œ ์ €๊ฐ€ ํ•ด๋‹น์š”์ฒญ์„ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ๋จผ์ € ๋กœ๊ทธ์ธ์„ ํ•˜๊ฑฐ๋‚˜
    403 Forbidden: ์œ ์ €๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์— ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ๋œป(์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค์ง ๊ณผ๊ธˆ์„ ํ•œ ์œ ์ €๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ)
  • 404 Not Found: ์š”์ฒญ๋œ URI๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋œป
  • 500 Internal Server Error: ์„œ๋ฒ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์„ ๋•Œ ์‚ฌ์šฉ ๋˜๋Š” ์ฝ”๋“œ

6. RESTful HTTP API๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

  1. URI: uniform resource identifier ๋กœ ํ•ด๋‹น ์‚ฌ์ดํŠธ์˜ ํŠน์ •์ž์›์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” '์œ ์ผ'ํ•œ์ฃผ์†Œ

  2. HTTP Method: Http request๊ฐ€ ์˜๋„ํ•˜๋Š” action์„ ์ •์˜ํ•œ ๊ฒƒ์ด๋‹ค.

  3. Playload: HTTP request์—์„œ ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ(body)๋ฅผ ๋งํ•œ๋‹ค.

REpresentational State Transfer ๋ž€?

์›น์ƒ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ HTTP URI๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๊ทธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ–‰์œ„๋ฅผ Method๋กœ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋ฆฌ์†Œ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ํ•œ๋‹ค ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

(HTTP URI๋กœ ์ •์˜๋œ ๋ฆฌ์†Œ์Šค๋ฅผ HTTP Method + Playload๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ)

๋ฉ”์„œ๋“œ๋Š” ์ฃผ๋กœ GET, POST๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

HTTP POST https://api.trueshort.com/user/portfolio
{
    "user_id" : 1,
    "stocks": [ 
        "005930",
        "298730",
        "378900"
    ]
}

7. ์˜ฌ๋ฐ”๋ฅธ end-point ์ฃผ์†Œ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ• ๊นŒ์š”?

์ƒ/ํ•˜ ์˜ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ์ค˜์•ผ ํ•œ๋‹ค.
ex)

  • https://api.trueshort.com/kospi/stock/005930 ์ด๋ผ๋Š” ๊ตฌ์กฐ๋ผ๋ฉด, KOSPI์— ์†ํ•ด์žˆ๋Š” ์ฃผ์‹(Stock) ์ค‘ ์‚ผ์„ฑ์ „์ž(005930)์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.
  • https://api.shopping.com/books/novel/stephenking ์ด๋ผ๋Š” ๊ตฌ์กฐ ์ด๋ผ๋ฉด, ์ฑ…๋“ค์ค‘ ์†Œ์„ค ๊ทธ๋ฆฌ๊ณ  ์†Œ์„ค์ค‘ Stephen King์˜ ์†Œ์„ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ด๋‹ค.

uri์˜ underscore์ฃผ๋กœ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ์˜์–ด ๋Œ€๋ฌธ์ž๋ณด๋‹ค ์†Œ๋ฌธ์ž๋ฅผ ์“ด๋‹ค. ๋„ˆ๋ฌด ๊ธด๋‹จ์–ด๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค(๊ฐ€๋…์„ฑ์ค‘์š”!) ๋˜ํ•œ ์ฃผ๋กœ ๋ช…์‚ฌ๋กœ ์ž‘์„ฑ์„ ํ•˜๋Š”๋ฐ ๋™์‚ฌ๋Š” Method๋ฅผ ํ†ตํ•ด ํ‘œํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Routing: ๊ฒฝ๋กœ์— ๋งž๊ฒŒ ์•Œ๋งž๋Š” ํŒŒ์ผ์„ ๋„˜๊ฒจ ์ฃผ๋Š”๊ฒƒ.

profile
์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด๋ฅผ ๋‹ด์€ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€