02.Method

HTTP Method

HTTP ๋ฉ”์„œ๋“œ

  • GET : ๋ฆฌ์†Œ์Šค ์กฐํšŒ

  • POST : ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ(๋“ฑ๋ก)

  • PUT : ๋ฆฌ์†Œ์Šค ๋Œ€์ฒด, ์—†์œผ๋ฉด ์ƒ์„ฑ

  • PATCH : ๋ฆฌ์†Œ์Šค ๋ถ€๋ถ„ ๋ณ€๊ฒฝ

  • DELETE : ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

API URI ์„ค๊ณ„

  • ์ข‹์€ URI ์„ค๊ณ„๋Š” ๋ฆฌ์†Œ์Šค ์‹๋ณ„์ด ์ค‘์š”

    • ํšŒ์› = ๋ฆฌ์†Œ์Šค

    • ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ /members

    • ํšŒ์› ์กฐํšŒ /members/{id} GET

    • ํšŒ์› ๋“ฑ๋ก /members/{id} POST

    • ํšŒ์› ์ˆ˜์ • /members/{id} PUT

    • ํšŒ์› ์‚ญ์ œ /members/{id} DELETE

  • ๋ฆฌ์†Œ์Šค(ํšŒ์›)์™€ ํ–‰์œ„(์กฐํšŒ, ๋“ฑ๋ก, ์‚ญ์ œ, ๋ณ€๊ฒฝ)๋ฅผ ๋ถ„๋ฆฌ

    • URI๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ์‹๋ณ„

GET

  • ๋ฆฌ์†Œ์Šค ์กฐํšŒ

  • ์ „๋‹ฌ ๋ฐ์ดํ„ฐ๋Š” query parameter OR query string ์„ ํ†ตํ•ด ์ „๋‹ฌ

POST

  • ์ƒˆ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ(๋“ฑ๋ก)

  • ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

    • ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ

    • ์ปจํŠธ๋กค URI

  • massage body๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

PUT

  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ€์ฒด, ์—†์œผ๋ฉด ์ƒ์„ฑ (๋ฎ์–ด์“ฐ๊ธฐ)

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค ์œ„์น˜๋ฅผ ์•Œ๊ณ  URI ์ง€์ • (POST์™€์˜ ์ฐจ์ด)

    • PUT /members/100 HTTP/1.1

    • POST /members HTTP/1.1

PATCH

  • ๋ฆฌ์†Œ์Šค ๋ถ€๋ถ„ ๋ณ€๊ฒฝ

    • PATCH /members/100 HTTP/1.1

DELETE

  • ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ

    • DELETE /members/100 HTTP/1.1

HTTP ๋ฉ”์„œ๋“œ์˜ ์†์„ฑ

HTTP ์†์„ฑ

  • ์•ˆ์ „(Safe)

    • ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ (ex. GET, HEAD ..)

  • ๋ฉฑ๋“ฑ(Idempotent)

    • ๋ช‡ ๋ฒˆ์„ ํ˜ธ์ถœํ•˜๋“  ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค (GET, PUT, DELETE)

    • ์ž๋™ ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์—์„œ ํ™œ์šฉ

  • ์บ์‹œ๊ฐ€๋Šฅ(Cacheable)

    • ์‘๋‹ต ๊ฒฐ๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹œํ•ด์„œ ์‚ฌ์šฉ (GET, HEAD ์ •๋„๋งŒ ์บ์‹œ๋กœ ์‚ฌ์šฉ)


HTTP ๋ฉ”์„œ๋“œ ํ™œ์šฉ

ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก

  • Query Parameter๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

    • GET

    • ex) ์ •๋ ฌ ํ•„ํ„ฐ(๊ฒ€์ƒ‰)

  • Message Body๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

    • POST, PUT, PATCH

    • ex) ํšŒ์›๊ฐ€์ž…, ์ƒํ’ˆ์ฃผ๋ฌธ, ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก, ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ

์ •์  ๋ฐ์ดํ„ฐ ์กฐํšŒ

  • GET

  • ์ด๋ฏธ์ง€, ์ •์  ํ…์ŠคํŠธ ๋ฌธ์„œ

  • Query Parameter ์—†์ด ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ๋กœ ๋‹จ์ˆœ ์กฐํšŒ

๋™์  ๋ฐ์ดํ„ฐ ์กฐํšŒ

  • GET

  • ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰, ์ •๋ ฌ, ํ•„ํ„ฐ

  • Query Parameter ์‚ฌ์šฉ

HTML FORM์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

  • POST

  • ๋“ฑ๋ก, ๋ณ€๊ฒฝ

  • Content-Type

    • application/x-www-form-urlencoded

      • form ๋‚ด์šฉ์„ Message Body๋ฅผ ํ†ตํ•ด ์ „์†ก

      • ์ „์†ก ๋ฐ์ดํ„ฐ๋ฅผ url encoding ์ฒ˜๋ฆฌ

    • multipart/form-data

      • ํŒŒ์ผ ์—…๋กœ๋“œ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ ์‚ฌ์šฉ

      • ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์—ฌ๋Ÿฌ ํŒŒ์ผ๊ณผ ํผ ๋‚ด์šฉ์„ ํ•จ๊ป˜ ์ „์†ก ๊ฐ€๋Šฅ

  • HTML Form ์ „์†ก์€ GET, POST๋งŒ ์ง€์›

HTTP API๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

  • Server to Server ํ†ต์‹ 

  • ๋ชจ๋ฐ”์ผ ์•ฑ ํด๋ผ์ด์–ธํŠธ

  • Ajax ์›น ํด๋ผ์ด์–ธํŠธ

  • GET -> Query Parameter๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ํ›„ ์กฐํšŒ

  • POST, PUT, PATCH -> Message Body๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก

  • Content-Type : application/json

HTTP API ์„ค๊ณ„ ์˜ˆ์‹œ

POST ๊ธฐ๋ฐ˜ ๋“ฑ๋ก

์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ (Collection)

  • ํšŒ์› ๋ชฉ๋ก /members -> GET

  • ํšŒ์› ๋“ฑ๋ก /members -> POST

  • ํšŒ์› ์กฐํšŒ /members/{id} -> GET

  • ํšŒ์› ์ˆ˜์ • /members/{id} -> PATCH, PUT, POST

  • ํšŒ์› ์‚ญ์ œ /members/{id} -> DELETE

PUT ๊ธฐ๋ฐ˜ ๋“ฑ๋ก

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์ €์žฅ์†Œ (Store)

  • ํŒŒ์ผ ๋ชฉ๋ก /files -> GET

  • ํŒŒ์ผ ์กฐํšŒ /files/{filename} -> GET

  • ํŒŒ์ผ ๋“ฑ๋ก /files/{filename} -> PUT

  • ํŒŒ์ผ ์‚ญ์ œ /files/{filename} -> DELETE

  • ํŒŒ์ผ ๋Œ€๋Ÿ‰ ๋“ฑ๋ก /files -> POST

HTML FORM ์‚ฌ์šฉ

HTML FORM์€ GET, POST๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ Control URI ์‚ฌ์šฉ

  • ํšŒ์› ๋ชฉ๋ก /members -> GET

  • ํšŒ์› ๋“ฑ๋ก ํผ /members/new -> GET

  • ํšŒ์› ๋“ฑ๋ก /members/new -> POST

  • ํšŒ์› ์กฐํšŒ /members/{id} -> GET

  • ํšŒ์› ์ˆ˜์ • ํผ /members/{id}/edit -> GET

  • ํšŒ์› ์ˆ˜์ • /members/{id}/edit -> POST

  • ํšŒ์› ์‚ญ์ œ /members/{id}/delete -> POST

REST Resource Naming Guide

  • ์ปฌ๋ ‰์…˜๊ณผ ๋ฌธ์„œ๋กœ ์ตœ๋Œ€ํ•œ ํ•ด๊ฒฐํ•˜๊ณ  ๊ทธ ํ›„์— ์ปจํŠธ๋กค URI ์‚ฌ์šฉ


HTTP ์ƒํƒœ์ฝ”๋“œ

2xx (Successful): ์š”์ฒญ ์ •์ƒ ์ฒ˜๋ฆฌ

Code

  • 200 OK

  • 201 Created (POST)

  • 202 Accepted (batch)

  • 204 No Content

3xx (Redirection): ์š”์ฒญ์„ ์™„๋ฃŒ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€ ํ–‰๋™ ํ•„์š”

Redirect

  • ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” 3xx ์‘๋‹ต์˜ ๊ฒฐ๊ณผ์— Location ํ—ค๋”๊ฐ€ ์žˆ์œผ๋ฉด, Location ์œ„์น˜๋กœ ์ž๋™ ์ด๋™

  • ์˜๊ตฌ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ : ํŠน์ • ๋ฆฌ์†Œ์Šค์˜ URI๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ์ด๋™ (301, 308)

  • ์ผ์‹œ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ : ์ผ์‹œ์ ์ธ ๋ณ€๊ฒฝ (302, 303, 307)

    • PRG(Post/Redirect/Get)์— ์‚ฌ์šฉ / ์ƒˆ๋กœ๊ณ ์นจ ์ค‘๋ณต ์ฃผ๋ฌธ ๋ฐฉ์ง€

  • ํŠน์ˆ˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ : ๊ฒฐ๊ณผ ๋Œ€์‹  ์บ์‹œ ์‚ฌ์šฉ

Code

  • 300 Multiple Choices (X)

  • 301 Moved Permanently

    • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ Get์œผ๋กœ ๋ณ€ํ•˜๊ณ , ๋ณธ๋ฌธ ์†์‹ค

  • 302 Found

    • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ GET์œผ๋กœ ๋ณ€ํ•˜๊ณ , ๋ณธ๋ฌธ ์ œ๊ฑฐ

  • 303 See Other

    • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ GET์œผ๋กœ ๋ณ€๊ฒฝ

  • 304 Not Modified

    • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Œ์„ ์•Œ๋ ค์คŒ (์บ์‹œ ์žฌ์‚ฌ์šฉ)

  • 307 Temporary Redirect

    • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ ๋ฉ”์„œ๋“œ์™€ ๋ณธ๋ฌธ ์œ ์ง€

  • 308 Permanent Redirect

    • ๋ฆฌ๋‹ค์ด๋ ŒํŠธ ์‹œ POST, ๋ณธ๋ฌธ ์œ ์ง€

4xx (Client Error)

  • ์˜ค๋ฅ˜์˜ ์›์ธ์€ ํด๋ผ์ด์–ธํŠธ

Code

  • 400 Bad Request

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž˜๋ชป๋œ ์š”์ฒญ์„ ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Œ

  • 401 Unauthorized

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ธ์ฆ์ด ํ•„์š”

    • ์ธ์ฆ(Authentication): ๋กœ๊ทธ์ธ

    • ์ธ๊ฐ€(Authorization): ๊ถŒํ•œ

  • 403 Forbidden

    • ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ดํ•ดํ–ˆ์ง€๋งŒ ์Šน์ธ์„ ๊ฑฐ๋ถ€ (์ ‘๊ทผ ๊ถŒํ•œ ์ œํ•œ)

  • 404 Not Found

    • ์š”์ฒญ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ

5xx (Server Error)

  • ์„œ๋ฒ„ ๋ฌธ์ œ๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

Code

  • 500 Internal Server Error

    • ์„œ๋ฒ„ ๋‚ด๋ถ€ ๋ฌธ์ œ๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ (์• ๋งคํ•˜๋ฉด 500)

  • 503 Service Unavailable

    • ์„œ๋น„์Šค ์ด์šฉ ๋ถˆ๊ฐ€

Last updated