분산 하이퍼미디어 시스템(WWW)을 위한 소프트웨어 아키텍처 스타일
아키텍처 스타일 : 제약조건의 집합
2000년 로이 필딩의 논문에서 소개된 개념
자원을 표현(URI)하고 상태 전달(HTTP Method)을 하는 아키텍처
REST 아키텍처 스타일의 제약조건을 모두 만족하는 시스템을 RESTful하다고 한다
- Client - Server
- Stateless
- Cache
- Uniform Interface
- Identification of Resources
- Manipulation of Resources through Representation
- Self-Descriptive Messages
- Hypermedia As The Engine Of Application State
- Layered System
- Code on Demand(Option)
서버나 클라가 변경되어도 메시지는 언제나 self-descriptive 하므로 해석이 가능하다
잘못된 예
GET / HTTP/1.1 # 목적지가 지정되지 않음
HTTP/1.1 200 OK # body 표현 방법을 알 수 없음
[ { "op": "remove", "path": "/a/b/c" } ]
옳은 예
GET / HTTP/1.1
Host: www.example.org
HTTP/1.1 200 OK
Content-Type: application/json-patch+json
[ { "op": "remove", "path": "/a/b/c" } ]
애플리케이션 상태 전이의 late binding. 상태 전이가 완료되고 나서야 다음 전이될 수 있는 상태가 결정된다. 덕분에 링크는 동적으로 변경될 수 있다.
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head></head>
<body><a href="/test">test</a></body>
</html>
HTTP/1.1 200 OK
Content-Type: application/json
Link: </articles/1>; rel="previous",
</articles/3>; rel="next";
{
"title": "2nd article",
"contents": "..."
}
웹 페이지 | HTTP API | |
---|---|---|
프로토콜 | HTTP | HTTP |
통신 | 사람-기계 | 기계-기계 |
Media Type | HTML | JSON |
HTML은 a태그로 하이퍼링크를 통해 다음 상태로 전이될 수 있고 HTML에 대한 명세가 존재한다. 하지만 JSON은 최소한의 파싱법만 존재한다.
HTML | JSON | |
---|---|---|
Self-descriptive | ✔️ | ✖️ |
HATEOAS | ✔️ | ✖️ |
HTTP/1.1 200 OK
Content-Type: application/vnd.todos+json
[
{"id": 1, "title": "회사 가기"},
{"id": 2, "title": "집에 가기"}
]
HTTP/1.1 200 OK
Content-Type: application/json
Link: <https://example.org/docs/todos>; rel="profile"
[
{"id": 1, "title": "회사 가기"},
{"id": 2, "title": "집에 가기"}
]
예1)
HTTP/1.1 200 OK
Content-Type: application/json
Link: <https://example.org/docs/todos>; rel="profile"
[
{
"link": "https://example.org/todos/1",
"title": "회사 가기"
},
{
"link": "https://example.org/todos/2",
"title": "집에 가기"
}
]
예2)
HTTP/1.1 200 OK
Content-Type: application/json
Link: <https://example.org/docs/todos>; rel="profile"
{
"links": {
"todo": "https://example.org/todos/{id}"
},
"data": [{
"id": 1,
"title": "회사 가기"
}, {
"id": 2,
"title": "집에 가기"
}]
}
HTTP/1.1 204 No Content
Location: /todos/1
Link: </todos/>; rel="collection"