Codestates SEB FE 42기/정리노트

S2 unit8 | [HTTP/네트워크] REST API, OPEN API & API Key

2realzoo 2022. 12. 6. 13:06

📌 REST API

(Representational State Transfer : 대표 상태 전송) - 로이 필딩

: 웹에서 사용되는 데이터나 자원을 HTTP URI로 표현하고, HTTP 프로토콜을 통해 요청과 응답을 정의하는 방식(아키텍처)

 

✔ REST 성숙도 모델 (RRM) - 레오나르도 리처드슨

🔴 0단계 - HTTP 프로토콜 사용

: REST API의 기본 단계, 0단계만 되어있는 API를 REST API라고 할 수 없음

요청 내용 🙋‍♀️요청 👨‍⚕️응답
예약 가능한 시간 확인 POST / appointment HTTP/1.1
[헤더 생략]

{
    "date" : "2022-12-25",
    "doctor" : "허준"
}

HTTP/1.1 200 OK
[헤더 생략]

{
    "slots" : [
        { "doctor" : "허준", "start" : "09:00", "end" : "12:00" },
        { "doctor" : "허준", "start" : "14:00", "end" : "16:00" }
     ]
}
특정 시간에 예약 POST / appointment HTTP/1.1
[헤더 생략]

{   
    "doctor" : "허준"
    "date" : "2022-12-25",
    "start" : "14:00",
    "end" : "15:00",
    "patient" : "고양이"
    
}
HTTP/1.1 200 OK
[헤더 생략]

 

🟠 1단계 - 개별 리소스와의 통신 준수

: 개별 리소스에 맞는 엔드포인트를 사용하여 요청하고 받는 자원에 대한 정보를 응답으로 전달

요청 내용 🙋‍♀️요청 👨‍⚕️응답
예약 가능한 시간 확인 POST / doctors/허준 HTTP/1.1
[헤더 생략]

{
    "date" : "2022-12-25",
}

HTTP/1.1 200 OK
[헤더 생략]

{
    "slots" : [
        { "id" : 123, "doctor" : "허준", "start" : "09:00", "end" : "12:00" },
        { "id" : 124,  "doctor" : "허준", "start" : "14:00", "end" : "16:00" }
     ]
}
특정 시간에 예약 POST / slots/123 HTTP/1.1
[헤더 생략]

{   
    "patient" : "고양이"
}
HTTP/1.1 200 OK
[헤더 생략]

{
    "appointment" : {
        "slot" : { "id" : "123", "doctor" : "허준", ...},
        "patient" : "고양이"
        }
}

엔드포인트로 요청하는 자원에 대한 정보를 표현하면서 전달하는 데이터의 "doctor" : "허준" 을 생략

마찬가지로 id로 특정 시간에 맞는 정보를 표현하면서 나머지 데이터도 생략

 

💬 어떤 리소스를 변화시키는지, 어떤 응답이 제공되는지에 따라 적절한 엔드포인트를 사용하는 것이 중요하다.

 

: 요청에 따른 응답으로 리소스를 전달할 때, 사용한 리소스의 정보와 함께 리소스 사용에 대한 성공/실패 여부를 반환

요청 내용 🙋‍♀️요청 👨‍⚕️응답
예약 가능한 시간 확인 POST / doctors/허준 HTTP/1.1
[헤더 생략]

{
    "date" : "2022-12-25",
}

HTTP/1.1 200 OK
[헤더 생략]

{
    "slots" : [
        { "id" : 123, "doctor" : "허준", "start" : "09:00", "end" : "12:00" },
        { "id" : 124,  "doctor" : "허준", "start" : "14:00", "end" : "16:00" }
     ]
}
특정 시간에 예약 POST / slots/123 HTTP/1.1
[헤더 생략]

{   
    "patient" : "고양이"
}
HTTP/1.1 200 OK
[헤더 생략]

{
    "appointmentFailure" : {
        "slot" : { "id" : "123", "doctor" : "허준", ...},
        "patient" : "고양이",
        "reason" : "해당 시간은 이미 예약되어 있습니다."
        }
}

 

🟡 2단계 - CRUD(Create, Read, Update, Delete)에 맞는 적절한 HTTP 메서드 사용

요청 내용 🙋‍♀️요청 👨‍⚕️응답
예약 가능한 시간 확인 GET / doctors/허준/slots?date=2022-12-25 HTTP/1.1
[헤더 생략]



HTTP/1.1 200 OK
[헤더 생략]

{
    "slots" : [
        { "id" : 123, "doctor" : "허준", ... },
        { "id" : 124, "doctor" : "허준", ... }
     ]
}
특정 시간에 예약 POST / slots/123 HTTP/1.1
[헤더 생략]

{   
    "patient" : "고양이"
}
HTTP/1.1 201 Created
Location: slots/123/appointment
[헤더 생략]

{
    "appointment" : {
        "slot" : { "id" : "123", "doctor" : "허준", ...},
        "patient" : "고양이"
        }
}

GET 

(1) body대신 query parameter 사용

(2) 서버의 데이터를 변화시키지 않는 요청에 사용

 

 

멱등성(idempotent) 🔗

: 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남는 성질

 

멱등성 메서드 : GET, HEAD, PUT, DELETE

비 멱등성 메서드 : POST, PATCH, CONNECT

 

  POST PUT PATCH
멱등성(idempotent) 요청마다 새로운 리소스 생성 요청마다 같은 리소스 반환 동일한 PATCH 요청이 다른 결과 야기할 수 있음
PATCH를 PUT과 같은 방식으로 사용시 멱등성 가짐
용도 서버로 데이터 전송하여 변경 리소스 교체 용도 리소스 수정 용도

 

🟢 3단계 - HATEOAS(Hypermedia As The Engine Of Application State) 하이퍼미디어 컨트롤 적용

: 요청은 동일, 응답에 리소스의 URI를 포함한 다음 기능에 접근할 수 있는 링크 요소 삽입하여 작성

요청 내용 🙋‍♀️요청 👨‍⚕️응답
예약 가능한 시간 확인 GET / doctors/허준/slots?date=2022-12-25 
HTTP/1.1
[헤더 생략]



HTTP/1.1 200 OK
[헤더 생략]

{
    "slots" : [
        { "id" : 123, "doctor" : "허준", ... },
        { "id" : 124, "doctor" : "허준", ... }
     ],
    "links" : {
        "appointment" : {
            "href" : "http://localhost:8080/slots/123",
            "method" : "POST"
            }
     }
}
특정 시간에 예약 POST / slots/123 HTTP/1.1
[헤더 생략]

{   
    "patient" : "고양이"
}
HTTP/1.1 201 Created
Location: slots/123/appointment
[헤더 생략]

{
    "appointment" : {
        "slot" : { "id" : "123", "doctor" : "허준", ...},
        "patient" : "고양이"
        },
      "links" : {
        "self" : {
            "href" : "http://localhost:8080/slot/123",
            "method" : "GET"
            },
         "cancel" : {
             "href" : "http://localhost:8080/slots/123/cancel",
             "method" : "DELETE"
             },
     }
}

📌 Open API

: 누구에게나 열려있는 API, 단 이용 수칙이 있을 수 있다.

 

📌 API Key 

: API를 통해 자원에 접근할 수 있는 권한의 형태

 

API를 이용하기 위해 Key가 필요한 경우

: 로그인한 이용자에게 API Key 제공, 이용자가 데이터 요청 시 API Key를 같이 전달