: 웹에서 사용되는 데이터나 자원을 HTTP URI로 표현하고, HTTP 프로토콜을 통해 요청과 응답을 정의하는 방식
REST API를 디자인하는 방법
=>리차드슨의 REST성숙도모델
0단계
: 단순히 HTTP프로토콜 사용
(REST API라고는 할수 없음. 작성하기 위한 기본단계)
‣ 엔드포인트로 모두 /appointment
사용
Case) 병원 예약
요청 내용 요청 응답 예약가능한 시간 확인 POST/ appointment HTTP/1.1 HTTP/ 1.1 200 OK 특정시간에 예약 POST/ appointment HTTP/1.1 HTTP/ 1.1 200 OK
1단계
: 웹에서 사용되는 모든 데이터나 자원을 HTTP URI로 표현한다.
‣ 개별 리소스와의 통신을 준수
-모든 자원은 개별 리소스에 맞는 엔드포인트를 사용해야하며 요청하고 받는 자원에 대한 정보를 응답으로 전달해야한다.
-요청에 따른 응답으로 리소스를 전달할 때에도 사용한 리소스에 대한 정보와 함께 리소스 사용에 대한 성공/실패 여부를 반환.
‣ 엔드포인트 작성방법
-동사, HTTP메서드, 혹은 어떤 행위에 대한 단어 사용은 지양하고, 리소스에 집중해 명사 형태의 단어로 작성
Case) 병원예약-실패로 가정
요청 내용 요청 응답 예약가능한 시간 확인 POST/doctors/허준 HTTP/1.1 HTTP/ 1.1 200 OK 특정시간에 예약 POST/slots/123 HTTP/1.1 HTTP/ 1.1 200 OK ☞특정시간에 예약
요청: 실제 slots라는 리소스의 123이라는 id를 가진 리소스가 변경
응답: 성공/ 실패 여부 반환{ “appointmentFailure”:{ “reason”: “해당시간은 이미 예약되어있습니다.” }
2단계
:CRUD에 맞게 적절한 HTTP메서드를 사용하는것에 중점
‣ HTTP메서드 사용시 규칙
1. GET
메서드 같은 경우는 서버의 데이터를 변화시키지 않는 요청에 사용해야 합니다.
2. POST
메서드는 요청마다 새로운 리소스를 생성하고 PUT
메서드는 요청마다 같은 리소스를 반환합니다. 이렇게 매 요청마다 같은 리소스를 반환하는 특징을 멱등(idempotent)하다고 합니다. 그렇기 때문에 멱등성을 가지는 메서드 PUT
과 그렇지 않은 메서드POST
는 구분하여 사용해야 합니다.
3. PUT
메서드와 PATCH
메서드도 구분하여 사용해야 합니다. PUT
은 교체, PATCH
는 수정의 용도로 사용합니다.
Case)병원예약
요청 내용 요청 응답 예약가능한 시간 확인 GET/doctors/허준/slots? date=2022-08-10 HTTP/1.1 HTTP/ 1.1 200 OK 특정시간에 예약 POST/slots/123 HTTP/1.1 HTTP/1.1 201 Created Location: slots/123/appointment ☞ 예약가능한 시간확인 => 조회(READ)하는 행위
요청 :GET
메서드를 사용하여 요청을 보내고,GET
메서드는body
를 가지지 않기 때문에 queryparameter를사용하여 필요한 리소스를 전달
☞ 특정시간에 예약 => 생성(CREATE)하는 행위
요청 :POST
메서드를 사용하여 요청을 보내고,POST
요청에 대한 응답이 어떻게 반환되는지가 중요.
응답 : 새롭게 생성된 리소스를 보내주기 때문에, 응답코드는201created
로 명확하게 작성. 관련 리소스를 클라이언트가Location
헤더에 작성된 URI를 통해 확인할 수 있도록 한다.
3단계
: HATEOAS(Hypertext As The Engine Of Application State)로 표현되는 하이터미디어컨트롤을 적용.
‣응답에는 리소스의 URI를 포함한 링크요소를 삽입하여 작성
Case)병원예약
요청 내용 요청 응답 예약가능한 시간 확인 GET/doctors/허준/slots? date=2022-08-10 HTTP/1.1 HTTP/ 1.1 200 OK 특정시간에 예약 POST/slots/123 HTTP/1.1 HTTP/1.1 201 Created Location: slots/123/appointment ☞ 예약가능한 시간 확인
응답: 예약가능시간을 확인한 후 그시간대에 예약을 할수 있는 링크 삽입{ “links” : { “appointment”:{ “href”: “http://~~”, “method”:”POST” } } }
☞ 특정시간에 예약
응답 : 특정시간에 예약을 완료하고 나서는 그예약을 다시 확일할수 있는 링크 삽입{ “links” : { “self”:{ “href”: “http://~~”, “method”:”GET” }, "cancel”:{ "href”: “http://~~”, “method”:”DELETE” } } }
Open API와 API Key
출처
코드스테이츠