Skip to content

Latest commit

Β 

History

History
237 lines (153 loc) Β· 6.41 KB

RESTFul.md

File metadata and controls

237 lines (153 loc) Β· 6.41 KB

RESTFul API 섀계 κ°€μ΄λ“œ

πŸ“Œ 섀계 쀑심 κ·œμΉ™

URIλŠ” μ •λ³΄μ˜ μžμ›μ„ ν‘œν˜„ν•΄μ•Ό ν•œλ‹€ μžμ›μ— λŒ€ν•œ ν–‰μœ„λŠ” HTTP Method(GET, POST, PUT, DELETE λ“±)으둜 ν‘œν˜„ν•œλ‹€

URI μž‘μ„± κ·œμΉ™

πŸ‘Ž

GET /users/show/1

πŸ‘

GET /users/1

URIλŠ” μžμ›μ„ ν‘œν˜„ν•΄μ•Ό ν•˜λ―€λ‘œ, show와 같은 ν–‰μœ„κ°€ ν¬ν•¨λ˜λ©΄ μ•ˆλœλ‹€. showλŠ” HTTP Method인 GET을 톡해 μΆ©λΆ„νžˆ ν‘œν˜„ κ°€λŠ₯ν•˜λ‹€.

μžμ›μ€ Collectionκ³Ό Element둜 λ‚˜λˆ„μ–΄ ν‘œν˜„ν•  수 있고, μ•„λž˜ ν…Œμ΄λΈ”μ— κΈ°μ΄ˆν•˜μ—¬ μ„œλ²„ λŒ€λΆ€λΆ„κ³Όμ˜ 톡신 ν–‰νƒœλ₯Ό ν‘œν˜„ν•  수 μžˆλ‹€.

사진

PATCH vs PUT

PUT은 ν•΄λ‹Ή μžμ›μ˜ 전체λ₯Ό κ΅μ²΄ν•œλ‹€λŠ” 의미

PATCHλŠ” 일뢀λ₯Ό λ³€κ²½ν•œλ‹€λŠ” 의미

β†’ update μ΄λ²€νŠΈμ—μ„œ PUT보닀 의미적으둜 더 μ ν•©ν•˜λ‹€λŠ” 평가

λ§ˆμ§€λ§‰μ— / λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.

πŸ‘Ž

GET /users/1/

πŸ‘

GET /users/1

_(underbar) λŒ€μ‹  -(dash) λ₯Ό μ‚¬μš©ν•œλ‹€.

πŸ‘Ž

POST /users/post_comments

πŸ‘

POST /users/post-comments

μ†Œλ¬Έμžλ₯Ό μ‚¬μš©ν•œλ‹€

πŸ‘Ž

POST /users/postComments

πŸ‘

POST /users/post-comments

컨트둀 μžμ›μ„ μ˜λ―Έν•˜λŠ” URI μ˜ˆμ™Έμ μœΌλ‘œ 동사λ₯Ό ν—ˆμš©ν•œλ‹€.

ν•¨μˆ˜μ²˜λŸΌ, 컨트둀 μžμ›μ„ λ‚˜νƒ€λ‚΄λŠ” URL은 λ™μž‘μ„ ν¬ν•¨ν•˜μ—¬ λͺ…λͺ…ν•œλ‹€.

πŸ‘Ž

POST /posts/duplicating

πŸ‘

POST /posts/duplicate

HTTP Status

성곡 응닡은 2XX 둜 μ‘λ‹΅ν•œλ‹€

  • 200 : OK

  • 201 : CREATED

    • 200κ³Ό 달리 μš”μ²­μ— μ„±κ³΅ν•˜κ³ , μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€λ₯Ό λ§Œλ“  κ²½μš°μ— 응닡
      • POST, PUT
  • 202 : ACCEPTED

    • ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ 받은 ν›„, μš”μ²­μ€ μœ νš¨ν•˜μ§€λ§Œ μ„œλ²„κ°€ 아직 μ²˜λ¦¬ν•˜μ§€ μ•Šμ€ 경우

      • 비동기 μž‘μ—…
      • μš”μ²­μ— λŒ€ν•œ 응닡이 일정 μ‹œκ°„ ν›„ μ™„λ£Œλ˜λŠ” μž‘μ—…μΈ 경우
      • μž‘μ—… μ™„λ£Œ ν›„ ν΄λΌμ΄μ–ΈνŠΈμ— μ•Œλ¦΄ 수 μžˆλŠ” server push μž‘μ—…μ„ ν•˜κ±°λ‚˜, ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•΄λ‹Ή μž‘μ—…μ˜ 진행 상황을 μ‘°νšŒν•  수 μžˆλŠ” URI 응닡해야함
      HTTP/1.1 202 Accepted
      {
      			"links": [
      				{
      					"rel": "self",
      					"method": "GET",
      					"href": "https://api.test.com/v1/users/3"
      				}
      		]
      }
      
  • 204 : NO Content

    • 응닡 bodyκ°€ ν•„μš”μ—†λŠ” μžμ› μ‚­μ œ μš”μ²­(DELETE) 같은 경우
    • 200 응닡 ν›„ null, {}, [], falseλ₯Ό return ν•˜λŠ” 것과 λ‹€λ₯΄λ‹€. μ•„μ˜ˆ HTTP Bodyκ°€ μ—†μŒ

μ‹€νŒ¨ 응닡은 4XX둜 μ‘λ‹΅ν•œλ‹€

  • 400 : [Bad Request]

    • ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ 미리 μ •μ˜λœ νŒŒλΌλ―Έν„° μš”κ΅¬μ‚¬ν•­μ„ μœ„λ°˜ν•œ 경우

    • νŒŒλΌλ―Έν„°μ˜ μœ„μΉ˜(path,Β query,Β body), μ‚¬μš©μž μž…λ ₯ κ°’, μ—λŸ¬ 이유 λ“±μ„Β λ°˜λ“œμ‹œΒ μ•Œλ¦°λ‹€

      • case 1
      {
      
          "message" : "'name'(body) must be Number, input 'name': test123"
      }
      
      • case 2
      {
      
          "errors": [
      
              {
      
                  "location": "body",
      
                  "param": "name",
      
                  "value": "test123",
      
                  "msg": "must be Number"
              }
      
          ]
      
      }
      
  • 401 : [Unauthorized]

  • 403 : [Forbidden]

    • ν•΄λ‹Ή μš”μ²­μ€ μœ νš¨ν•˜λ‚˜ μ„œλ²„ μž‘μ—… 쀑 접근이 ν—ˆμš©λ˜μ§€ μ•Šμ€ μžμ›μ„ μ‘°νšŒν•˜λ €λŠ” 경우
    • μ ‘κ·Ό κΆŒν•œμ΄ 전체가 μ•„λ‹Œ μΌλΆ€λ§Œ ν—ˆμš©λ˜μ–΄ μš”μ²­μžμ˜ 접근이 λΆˆκ°€ν•œ μžμ›μ— μ ‘κ·Ό μ‹œλ„ν•œ 경우 μ‘λ‹΅ν•œλ‹€.
  • 404 : [Not Found]

  • 405 : [Method Not Allowed]

    • 405 codeλŠ” 404 code와 ν˜Όλ™λ  수 있기 λ•Œλ¬Έμ— 룰을 잘 μ •ν•˜κ³  μ‹œμž‘ν•œλ‹€.
    • POST /users/1의 경우 404둜 μ‘λ‹΅ν•œλ‹€κ³  생각할 수 μžˆμ§€λ§Œ, κ²½μš°μ— 따라 405둜 응닡할 수 μžˆλ‹€.Β /users/:idΒ URL은 GET, PATCH, DELETE methodλŠ” ν—ˆμš©λ˜κ³  POSTλŠ” λΆˆκ°€ν•œ URL이닀.
      • λ§Œμ•½ idκ°€Β 1인 μ‚¬μš©μžκ°€ μ—†λŠ” κ²½μš°μ—” 404둜 μ‘λ‹΅ν•˜μ§€λ§Œ(GET, PATCH, DELETE의 경우),Β POST /users/1λŠ”Β /users/:idΒ URL이 POST methodλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 405둜 μ‘λ‹΅ν•˜λŠ” 게 μ˜³λ‹€.
    • Allow: GET, PATCH, DELETEΒ HTTP header에 ν—ˆμš© κ°€λŠ₯ν•œ methodλ₯Ό ν‘œμ‹œν•œλ‹€.
  • 409 : [Conflict]

    • ν•΄λ‹Ή μš”μ²­μ˜ μ²˜λ¦¬κ°€ λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μƒ λΆˆκ°€λŠ₯ν•˜κ±°λ‚˜ λͺ¨μˆœμ΄ 생긴 경우

    • e.g.)Β DELETE /users/hak의 경우, λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μƒ μ‚¬μš©μžμ˜ λͺ¨λ“  μžμ›μ΄ λΉ„μ–΄μžˆμ„ λ•Œλ§Œ μ‚¬μš©μžλ₯Ό μ‚­μ œν•  수 μžˆλŠ” κ·œμΉ™μ΄ μžˆμ„ λ•Œ 409둜 μ‘λ‹΅ν•œλ‹€.

      409 Conflict
      
      {
      
          "message" : "first, delete connected resources."
          "links": [
      
              {
      
                  "rel": "posts.delete",
      
                  "method": "DELETE",
      
                  "href":  "https://api.test.com/v1/users/hak/posts"
              },
      
              {
      
                  "rel": "comments.delete",
      
                  "method": "DELETE",
      
                  "href":  "https://api.test.com/v1/users/hak/comments"
              }
      
          ]
      
      }
      
  • 429 : [Too Many Requests]

    • Retry-After: 3600(HTTP Headers)
    • DoS, Brute-force attack 같은 비정상적인 접근을 막기 μœ„ν•΄ μš”μ²­μ˜ 수λ₯Ό μ œν•œν•œλ‹€.

μž…λ ₯ Form ν˜•νƒœ

μƒˆλ‘œμš΄ Item μž‘μ„±ν•˜κ±°λ‚˜ 기쑴의 Item을 μˆ˜μ •ν•˜λŠ” 경우, μž‘μ„±/μˆ˜μ • Form은 μ–΄λ–»κ²Œ μ œκ³΅ν•΄μ•Ό ν• κΉŒ?

β†’ Form μžμ²΄λ‘œλ„ μ •λ³΄λ‘œ μ·¨κΈ‰

스크란샷 2021-08-31 α„‹α…©α„Œα…₯ᆫ 8.50.28.png

λͺ¨λ°”일 ν™˜κ²½μ— 따라 λ‹€λ₯Έ 정보λ₯Ό 보여야 ν•˜λŠ” 경우

REST APIλŠ” URIκ°€ ν”Œλž«νΌ 쀑립적이어야 ν•˜κΈ° λ•Œλ¬Έμ—, Request Header의 User-Agent 값을 μ°Έμ‘°ν•˜λŠ” 것이 μ’‹λ‹€.

μ•„μ΄ν°μ—μ„œμ˜ User-Agent>

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3

좜처

https://sanghaklee.tistory.com/57

https://spoqa.github.io/2012/02/27/rest-introduction.html