“Application Programming Interface”
앱에서 사용할수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 말한다.
“REpresentational(표현가능한) State(상태) Transfer(전송)”
자원을 이름(표현)으로 구분하여 자원의 상태(정보)를 주고 받는 모든 것을 의미한다.
HTTP URI를 통해 자원을 명시하고, HTTP Method를 통해 해당 자원의 CRUD Operation을 적용하는것을 의미한다.
self-descriptive : REST API 메시지만 보고도 이를 쉽게 이해 할 수 있는 자체표현구조로 되어 있어야한다.
HATEOAS : 클라이언트가 서버에 요청시 서버는 요청에 의존되는 URI를 Response에 포함시켜 반환한다.
예를 들면, 사용자정보의 POST 요청 후 사용자를 GET, PUT, DELETE할 수 있는 URI를 동적으로 알려주게 되는 것이다.
첫 번째, URI는 정보의 자원을 표현해야 한다.
두 번째, 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
GET /rooms
DELETE /room/:id
http://restapi.example.com/room/:id
*Document : 하나의 객체
http://restapi.example.com/sports/soccer
*Collection : 객체들의 집합(일반적으로 복수로 사용)
http://restapi.example.com/sports/soccer/players/13
STATUS CODE | DETAILS |
---|---|
200 (OK) | 클라이언트의 요청을 정상적으로 수행 |
201 (Created) | 클라이언트가 어떤 리소스 생성을 요청, 해당 리소스가 성공적으로 생성됨(POST를 통한 리소스 생성 작업시) |
301 (Moved Permanently) | 클라이언트가 요청한 리소스에 대한 URI가 변경 되었을 때 응답 코드 |
400 (Bad Request) | 클라이언트의 요청이 부적절 할 경우 |
401 (Unauthorized) | 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청했을때 |
403 (Forbidden) | 유저 인증상태와 관계없이 응답하고 싶지 않은 리소스를 요청했을때 |
404 (Not found) | 데이터가 있어야 하나 없음 |
405 (Method Not Allowed) | 클라이언트가 요청한 리소스에서는 사용 불가능한 Method를 이용했을 경우 |
500 (Internal Sever Error) | 서버에 뭔가 문제가 있을때 사용하는 응답코드 |
HTTP에서의 representation
GET 메서드의 정의를 먼저 살펴보면
The GET method requests transfer of a current selected representation
for the target resource.
target resource에 대한 현재 선택된 representation 하나를 반환한다.
“target resource” 란?
-> uri가 가리키는 리소스이다.
그렇다면 리소스란 무엇인가?
-> HTTP 요청의 대상이다.
“representation” 란? (representation data 와 representation metadata로 구성)
-> 어떤 리소스의 특정 시점의 상태를 반영하고 있는 정보이다.
“선택된” 이란?
하나의 리소스의 현재 representation이 하나 이상이 될 수 있으며, 그 중 하나가 선택되었음을 의미한다.
representation들의 예시)
영어 사용자를 위한 representation:
Content-Type: text/plain
Content-Language: en
hello
한국어 사용자를 위한 representation:
Content-Type: text/plain
Content-Language: ko
안녕하세요
HTML을 선호하는 영어 사용자를 위한 representation:
Content-Type: text/html; charset=UTF-8
Content-Language: en
<html><body>hello</body></html>
HTML을 선호하는 한국어 사용자를 위한 representation:
Content-Type: text/html; charset=UTF-8
Content-Language: ko
<html><body>안녕하세요</body></html>
그러면 이들 중 하나를 선택 하는 것은 누가 어떻게 할까?
클라이언트와 서버간의 Content negotitaion을 통해 선택하며, 선택의 주체는 협상 방법에 따라 다르다.
사전 협상의 경우 서버가 선택하고, 클라이언트가 어떤 문서를 선호하는지 헤더에 포함시켜 전송한다.
여기서, 여러 리소스중 하나가 선택되었다고 말할 수 있을까?
위의 요청 모두 같은 uri를 갖기 때문에 같은 리소스이다. 그렇기 때문에, 여러 리소스 중 하나가 선택되었다고 말할 수 없다.
예외) 클라이언트가 선택하는 사후협상의 경우는 리소스중 하나를 선택한다고 볼수도 있다.
State는 웹 애플리케이션의 상태, Transfer는 이 상태의 전송을 의미한다.
웹페이지 A를 보고있던 사용자가 웹페이지 B로 가는 링크를 클릭하면, 웹브라우저는 링크가 가리키는 웹페이지 B를 렌더링해서 보여줄 것이다.
링크를 클릭함으로써 브라우저가 보여주던 페이지는 A에서 B로 바뀌었다.(웹 애플리케이션의 상태 변경) 이 상태의 변경은 representation의 전송을 통해 이뤄졌다.
여기서 주의할 두가지는,
1. Transfer는 상태의 전이를 의미하는 것이 아니다. 전이가 아니라 network component 사이에서의 전송을 말한다. 즉, 여기서는 서버에서 클라이언트로의 웹 페이지 전송을 의미하는 것이다.