REST API - λλ§μ μΈμ΄λ‘ λΈλ‘κΉ ν΄λ³΄κΈ°
π REST API
πREST( Representational State Transfer )
API μλ λ°©μμ λν 쑰건μ λΆκ³Όνλ μννΈμ¨μ΄ μν€ν μ³
λκ·λͺ¨μ κ³ μ±λ₯ ν΅μ μ μμ μ μΌλ‘ μ§μ
πAPI
μ ν리μΌμ΄μ νλ‘κ·Έλλ° μΈν°νμ΄μ€
λ€λ₯Έ μννΈμ¨μ΄ μμ€ν κ³Ό ν΅μ νκΈ° μν΄ λ°λΌμΌ νλ κ·μΉμ μ μ
π REST API
μΉμμ μ¬μ©λλ λ°μ΄ν°λ μμμ HTTP URIλ‘ νννκ³ , HTTP νλ‘ν μ½μ ν΅ν΄ μμ²κ³Ό μλ΅μ μ μνλ λ°©μ
REST ꡬμ±
- μμ(RESOURCE) - URI
- νμ(Verb) - HTTP METHOD
- νν(Representations)
REST νΉμ§
1) κ· μΌν μΈν°νμ΄μ€ : μλ²κ° νμ€ νμμΌλ‘ μ 보λ₯Ό μ μ‘
2) 무μν : μλ²κ° μ΄μ μ λͺ¨λ μμ²κ³Ό λ 립μ μΌλ‘ λͺ¨λ ν΄λΌμ΄μΈνΈ μμ²μ μλ£νλ ν΅μ λ°©λ²
3) κ³μΈ΅ν μμ€ν : μ¬λ¬ κ³μΈ΅μΌλ‘ μ¬λ¬ μλ²μμ μ€νλλλ‘ RESTful μΉ μλΉμ€λ₯Ό μ€κ³
4) μΊμ κ°λ₯μ± : ν΄λΌμ΄μΈνΈ λλ μ€κ°μμ μΌλΆ μλ΅μ μ μ₯νλ νλ‘μΈμ€μΈ μΊμ±μ μ§μ
5) μ¨λ맨λ μ½λ : μλ²λ ν΄λΌμ΄μΈνΈ κΈ°λ₯μ μΌμμ μΌλ‘ νμ₯νκ±°λ μ¬μ©μ μ§μ κ°λ₯
REST API μ΄μ
νμ₯μ± μ μ°μ± λ 립μ±
μ©μ΄ μ 리
- 리μμ€(Resource): λ°μ΄ν°μ μΌλΆμ λλ€. (μ. user)
- μ½λ μ (Collection): 리μμ€μ μ§ν©μ λλ€. (μ. users)
- URL(Identifies the location): 리μμ€ νΉμ μ½λ μ μ μλ³ν μ μλ κ²½λ‘μ λλ€
πREST APIλ₯Ό λμμΈνλ λ°©λ²
λ μ€λλ₯΄λ 리차λμ¨(Leonard Richardson) 4λ¨κ³ λͺ¨λΈ
πREST μ±μλ λͺ¨λΈ - 0λ¨κ³
REST APIλ₯Ό μμ±νκΈ° μν κΈ°λ³Έ λ¨κ³
리μμ€ κ΅¬λΆ μμ΄ HTTP νλ‘ν μ½μ μ¬μ©νκΈ°λ§ ν΄λ κ°λ₯νλ€
νλμ End-pointλ₯Ό μ¬μ©ν΄μ HTTP Methodλ λ°λμ POSTκ° λλ€
μ¬μ©μμ)
Reqest : μ μ λ₯Ό μμ²νλ©΄
POST /api/user
{
"function": "getUser",
"arguments" [
"1"
]
}
Resposne : μ½λλ 200κ³Ό ν¨κ» μμ²μ λ°κ³
HTTP/1.1 200 OK
{
"result" {
"id": "1"
"name": "honey",
}
}
CRUD : HTTP Methodλ λ°λμ POSTκ° λλ€
CREATE : POST /api/user
READ : POST /api/user
UPDATE : POST /api/user
DELETE : POST /api/user
πREST μ±μλ λͺ¨λΈ - 1λ¨κ³
리μμ€ κ°λ μ λμ
λͺ¨λ μμ²μ νλμ μλν¬μΈνΈ(λ€νΈμν¬μ μ°κ²°νκ³ λ€νΈμν¬λ₯Ό ν΅ν΄ ν΅μ νλ λͺ¨λ λλ°μ΄μ€)λ‘ λ³΄λ΄λ κ²
μ΄ μλλΌ κ°λ³ 리μμ€μ ν΅μ
μμ²νκ³ λ°μ μμμ λν μ 보λ₯Ό μλ΅μΌλ‘ μ λ¬ν΄μΌ νλ€λ κ²
HTTP Methodλ GETκ³Ό POSTλ§ μ¬μ©νκ³ μ½λλ 200μΌλ‘ μ λ¬
μ¬μ©μμ)
Reqest : μ νν μ μ μ μ 무λ₯Ό λ¬Όμ΄λ³΄λ©΄
POST /api/users/create
{
"name": "honey"
}
Resposne : μ½λλ 200κ³Ό ν¨κ» μμ²μ λ°κ³
HTTP/1.1 200 OK
{
"result" {
"error": "already exist member"
}
}
CRUD : GETκ³Ό POSTλ§ μ¬μ©
CREATE : POST /api/users/create
READ : GET /api/users/1
UPDATE : POST /api/users/update
DELETE : POST /api/users/remove/1
πREST μ±μλ λͺ¨λΈ - 2λ¨κ³
2λ¨κ³λ CRUDμ λ§κ² μ μ ν HTTP λ©μλλ₯Ό μ¬μ©νλ κ²μ μ€μ
μ‘°ν(READ) -> GET, μμ±(CREATE) -> POST
μλ΅ μ½λλ 201 Createdλ‘ λͺ ννκ² μμ±
νμ¬ κ°μ₯ λ§μ REST APIκ° μ΄ λ¨κ³μ ν΄λΉ
μ¬μ©μμ)
Reqest : μ νν μ μ μ μ 무λ₯Ό λ¬Όμ΄λ³΄λ©΄
POST /api/users/create
{
"name": "honey"
}
Resposne : μ½λλ 201κ³Ό ν¨κ» μμ²μ λ°κ³
HTTP/1.1 201 Created
Content-Type: application/json
{
"result" {
"id": "1",
"name": "honey"
}
}
CRUD : CREATE/READ/UPDATE/DELETE
CREATE : POST /api/users
READ : GET /api/users/1
UPDATE : PUT /api/users/1
DELETE : DELETE /api/users/1
πREST μ±μλ λͺ¨λΈ - 3λ¨κ³
HATEOAS(Hypertext As The Engine Of Application State)
νμ΄νΌλ―Έλμ΄ μ»¨νΈλ‘€μ μ μ©
μμ²μ 2λ¨κ³μ λμΌ μλ΅μ URIλ₯Ό ν¬ν¨ν λ§ν¬ μμλ₯Ό μ½μ νμ¬ μμ±
μλ΅ λ΄μ μλ‘μ΄ λ§ν¬λ₯Ό λ£μ΄ μλ‘μ΄ κΈ°λ₯μ μ κ·Ό κ°λ₯
μΆκ°μ μΌλ‘ λ€μ Requestμ νμν End-pointκΉμ§ μ 곡μ νλ€. μ΄λ Uniform Interfaceμ HATEOASλ₯Ό μλ―Έ
μ¬μ©μμ)
Reqest
GET /api/
Resposne
HTTP/1.1 200 OK
Content-Type: application/json
{
"/api/users",
"/api/users/{userId}/roles",
"/api/products",
"/api/..."
}
Reqest
GET /api/users/1
Resposne
HTTP/1.1 200 OK
Content-Type: application/json
{
"result" {
"id": "1",
"name": "honey",
"_links": {
"self" : {
"href" : "https:/api/users/1"
},
"update" : {
"href" : "https:/api/users/1"
},
"list" : {
"href" : "https:/api/users/" // ν΄λΌμ΄μΈνΈμκ² ν₯λ―Έλ₯Ό λ μ μλ μμ
},
}
}
πOPEN API
λꡬμκ²λ μ κ·Ό κ°λ₯ν API(μ΄μ© μμΉ o, μ νμ¬ν o)
π API Key
APIλ₯Ό μ΄μ©νκΈ° μν΄μλ keyκ° νμ
μλ² λ¬Έμ μ¬λ μ΄μ