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