REST
{SOAP} vs {REST}
REST WIN!
{REST}
+ {HYPERMEDIA}
{RESOURCES}
{REPRESENTATION}
HTTP/1.1 200 OK
ETag: "f60e0978bc9c458989815b18ddad6d75"
Last-Modified: Thu, 10 Jan 2013 01:45:22 GMT
Content-Type: application/vnd.collection+json
{
"collection": {
"version": "1.0",
"href": "http://www.youtypeitwepostit.com/api/",
"items": [
{
"href": "http://www.youtypeitwepostit.com/api/messages/21818525390699506",
"data": [
{
"name": "text",
"value": "Test."
},
{
"name": "date_posted",
"value": "2013-04-22T05:33:58.930Z"
}
],
"links": []
}
]
},
"template": {
"data": [
{
"prompt": "Text of message",
"name": "text",
"value": ""
}
]
}
}
{“collection”: {}}
{“collection”: {“items: []”}}
{“collection”: {“items: [{}, {}, {}]”}}
Объект внутри себя содержит другой объект
Объект содержит список
Элементом списка может быть объект
{
"collection": {
"version": "1.0",
"href": "http://www.youtypeitwepostit.com/api/",
"items": [
{
"href": "http://www.youtypeitwepostit.com/api/messages/21818525390699506",
"data": [
{
"name": "text",
"value": "Test."
},
{
"name": "date_posted",
"value": "2013-04-22T05:33:58.930Z"
}
],
"links": []
}
]
}
}
Collection + JSON - это способ обслуживания списков
POST /api/ HTTP/1.1
Host: www.youtypeitwepostit.com
Content-Type: application/vnd.collection+json
{ "template":
{
"data": [
{"prompt": "Text of the message", "name": "text", "value": "Squid!"}
]
}
}
Запрос на сохранение
Ответ сервера
HTTP/1.1 201 Created
Location: http://www.youtypeitwepostit.com/api/47210977342911065
Ресурсы и представления
Ресурс - URL
Представление - объяснение текущего состояния ресурса
Семантика HTTP протокола
GET - Получить представление этого ресурса.
DELETE - Уничтожить этот ресурс.
POST - Создайте новый ресурс под этим ресурсом на основе данного представления.
PUT - Замените это состояние этого ресурса на состояние, описанное в данном представлении.
Эти два метода в основном используются в качестве клиента, исследующего API:
HEAD - Получите заголовки, которые будут отправлены вместе с представлением этого ресурса, но не с самим представлением.
OPTIONS - Определите, на какие методы HTTP отвечает этот ресурс.
Семантика HTTP протокола
PATCH - Изменение части состояния этого ресурса на основе данного представления. Если какой-то бит состояния ресурса не упоминается в данном представлении, оставьте его в покое. PATCH подобен PUT, но допускает точечные изменения состояния ресурса.
[
{
"op": "test", "path": "/a/b/c", "value": "foo"
},
{
"op": "remove", "path": "/a/b/c"
},
{
"op": "add", "path": "/a/b/c",
"value": ["foo", "bar"]
},
{
"op": "replace", "path": "/a/b/c", "value": 42
},
{
"op": "move", "from": "/a/b/c", "path": "/a/b/d"
},
{
"op": "copy", "from": "/a/b/d", "path": "/a/b/e"
}
]
Семантика HTTP протокола
Overloaded POST - Когда вы удаляете, обновляете, сохраняете через POST метод. Так можно делать, однако метод не идемпотентный и не семантический. Семантика может быть только на уровне приложения. Каждый клиент должен знать об этой семантике приложения.
Hypermedia
способ, с помощью которого сервер сообщает клиенту, какие запросы HTTP клиент может сделать в будущем.
HTML
как Hypermedia формат
<img rel="icon" src="http://www.example.com/logo.png" />
<form method="GET" action="/posts" />
<form method="POST" action="/posts" />
<a href="/posts">Posts</a>
Шаблоны URI
http://www.youtypeitwepostit.com/messages/{?query}
http://www.example.org/document#{+var}
http://www.example.org{+path}/status
http://www.example.org/greeting?g={+hello}
RFC 6570
Promises в ответах
<link rel="edit" href="http://example.org/posts/1"/>
<a href="/posts">Link</>
<img src="img.jpg">
<script>
alert('Hi')
</script>
<style>
h1 {color:red;}
p {color:blue;}
</style>
Специфичное использование
в рамках домена
Content-Type: application/vnd.amundsen.maze+xm
Как предоставить документацию по API клиенту?
Content-Type: text/html
Content-Type: application/json
Content-Type: application/atom+xml
Content-Type: application/vnd.collection+json
Content-Type: application/vnd.amundsen.maze+xml
Как предоставить документацию по API клиенту?
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head>
<link href="http://microformats.org/wiki/hcard" rel="profile">
</head>
<body>
</body>
</html>
Как предоставить документацию по API клиенту?
HTTP/1.1 200 OK
Content-Type: application/json
Link: <https://dev.twitter.com/docs>;rel="profile
Как предоставить документацию по API клиенту?
{
"@context":
{
"@type": "http://alps.io/schema.org/Person",
"n": "http://alps.io/schema.org/Person#name",
"photo_link":
{
"@id": "http://alps.io/schema.org/Person#image",
"@type": "@id"
}
}
}
JSON-LD
Обычный JSON
HTTP/1.1 200 OK
Content-Type: application/json
{
"n": "Jenny Gallegos",
"photo_link": "http://api.example.com/img/omjennyg"
}
Первая книга в основе этого доклада
Вторая книга в основе этого доклада
REST
By voolh
REST
- 27