📌 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를 같이 전달
'Codestates SEB FE 42기 > 정리노트' 카테고리의 다른 글
S2 unit9 | Eftect Hook : Side Effect 제어 (0) | 2022.12.08 |
---|---|
S2 unit9 | State 끌어올리기 (0) | 2022.12.07 |
S2 unit7 | [HTTP/네트워크] HTTP Messages (0) | 2022.12.04 |
S2 unit7 | [HTTP/네트워크] AJAX , SSR vs CSR (1) | 2022.12.03 |
S2 unit7 | [HTTP/네트워크] 크롬 브라우저 에러 의미 (0) | 2022.12.02 |