RESTAPI(REpresentational State Transfer)란
- Roy T.Fielding이 제한 방법론으로 컴퓨터 시스템간의 상호운용성을 제공하는 방법중 하나
RESTful의 조건
- 클라이언트, 서버 및 리소스로 구성되었으며 요청이 HTTP를 통해 관리되는 클라이언트-서버 아키텍처
- 스테이트리스 클라이언트-서버 커뮤니케이션: 요청 간에 클라이언트 정보가 저장되지 않으며, 각 요청이 분리되어 있고 서로 연결되어 있지 않음
- 클라이언트-서버 상호 작용을 간소화하는 캐시 가능 데이터
- 정보가 표준 형식으로 전송되도록 하기 위한 구성 요소 간 통합 인터페이스. 여기에 필요한 것은 다음과 같습니다.
- 요청된 리소스가 식별 가능하며 클라이언트에 전송된 표현과 분리되어야 합니다.
- 수신한 표현을 통해 클라이언트가 리소스를 조작할 수 있어야 합니다(이렇게 할 수 있는 충분한 정보가 표현에 포함되어 있기 때문).
- 클라이언트에 반환되는 자기 기술적(self-descriptive) 메시지에 클라이언트가 정보를 어떻게 처리해야 할지 설명하는 정보가 충분히 포함되어야 합니다.
- hateoas: 클라이언트가 리소스에 액세스한 후 하이퍼링크를 사용해 현재 수행 가능한 기타 모든 작업을 찾을 수 있어야 합니다.
- 요청된 정보를 검색하는 데 관련된 서버(보안, 로드 밸런싱 등을 담당)의 각 유형을 클라이언트가 볼 수 없는 계층 구조로 체계화하는 계층화된 시스템.
- 코드 온디맨드(선택 사항): 요청을 받으면 서버에서 클라이언트로 실행 가능한 코드를 전송하여 클라이언트 기능을 확장할 수 있는 기능.
- 1, 2,3, 5는 http를 사용하면 자동적으로 지켜지며 6은 javascript를 클라이언트로 전송하여 실행할 수 있으므로 만족됨.
- 따라서 4의 기능을 지키는 것이 주된 내용이다.
- 4.a, 4.b는 resource를 제대로 정의하고 그에대한 method를 잘 정의하는 것으로 만족 시킬 수 있다.
- 4.c는 content-type header를 잘 작성하는 것으로 만족시킬 수 있다.
- 4.d는 링크정보를 response에 포함 시키는 방법으로 만족 시킬 수 있다.
실제에서 RESTful api를 구성하는 방법
- GET 은 지정된 URI에서 리소스의 표현을 검색한다. query string에 리소스 검색에 필요한정보를 포함 할 수있다.
- POST 는 지정된 URI에 새 리소스를 만든다.
- PUT 은 지정된 URI에 리소스를 만들거나 대체합니다. 즉, 덮어씌운다. 멱등성을 유지해야 한다.
- PATCH 는 리소스의 부분 업데이트를 수행한다.
- DELETE 는 지정된 URI의 리소스를 제거한다.
REST API Method 성질
- Safe: 호출해도 representation이 변경되지 않음.
- Idempotent: n번 호출의 결과와 1번호출의 결과가 같다. (Post만 만족하지 못할 수 있음.) ex) Idempotent 한 메서드는 timeout 이 나서 제대로 된 응답을 못받는 경우 다시 요청해도 괜찮음이 보장됨
- Cacheable : 응답 결과를 캐싱해서 사용해도 되는가
- Post도 가능하지만 실제로는 Get, Head만 캐싱해서 사용.
REST API URI
- URI규칙은 다음과 같다.
- 마지막이 슬래쉬로 끝나서는 안된다.
- '_'대신 '-'을 사용한다.
- 소문자로 구성한다.
- 동사는 포함하지 않고 http method로 대체한다.
- 파일 확장자를 표시하지 않는다.
- self-descriptive message
- json, html등의 정보를 보낼때 content-type에 어떤 파일 종류인지 명시해야한다.
- 만약 json이라면 각 key값의 의미를 알 수있도록 명시해야 한다.(많은 rest api라고 불리는 api들이 만족하지 않는 내용)
- IANA에 media-type을 등록하는 방법이 있다.
- hateoas
- 각 요청에 대한 응답이 다른 상태로 바뀌는 데 필요한 정보를 포함해야한다.
- 즉, reponse의 내용에 링크가 포함 되어있어야한다.
- HTML file에 링크 태그를 사용하여 만족시킬 수 있다.
- JSON의 경우 value로 링크주소를 넣어 만족 시킬 수 있다.
출처:
- Day1, 2-2. 그런 REST API로 괜찮은가 - naver d2
https://www.youtube.com/watch?v=RP_f5dMoHFc
- Oktane17: Designing Beautiful REST + JSON APIs - okta
https://www.youtube.com/watch?v=MiOSzpfP1Ww
https://en.wikipedia.org/wiki/Representational_state_transfer