Статьи

RESTFul Design Patterns

Здесь я кратко изложу набор методов проектирования RESTful, которые я использовал довольно успешно.

Шаблоны объектов

Если имеется много объектов одного типа, URL-адрес объекта должен содержать идентификатор объекта.

http://www.xyz.com/library/books/668102 

Если этот объект является одноэлементным объектом этого типа, идентификатор не требуется.

http://www.xyz.com/library

Получить представление объекта

HTTP GET используется для получения представления объекта, который имеет необязательное соглашение о расширении, чтобы указать, какой формат необходим. HTTP-заголовок «Принять» также используется для указания ожидаемого формата содержимого. Также обратите внимание, что возвращается представление всего объекта. На уровне атрибутов отсутствует представление URL.

GET /library/books/668102.json HTTP/1.1
Host: www.xyz.com
Accept: application/json

Изменить существующий объект

HTTP PUT используется для изменения объекта, тело запроса содержит представление объекта после успешной модификации.

Создать новый объект

HTTP PUT также используется для создания объекта, если вызывающая сторона полностью контролирует назначение идентификатора объекта, тело запроса содержит представление объекта после успешного создания.

PUT /library/books/668102 HTTP/1.1
Host: www.xyz.com
Content-Type: application/xml
Content-Length: nnn

<book>
<title>Restful design</title>
<author>Ricky</author>
</book>

Если вызывающая сторона не имеет никакого контроля над идентификатором объекта, выполняется HTTP POST для родительского контейнера объекта, а тело запроса содержит представление объекта. Тело ответа должно содержать ссылку на URL созданного объекта.

POST /library/books HTTP/1.1
Host: www.xyz.com
Content-Type: application/xml
Content-Length: nnn

<book>
<title>Restful design</title>
<author>Ricky</author>
</book>
HTTP/1.1 301 Moved Permanently
Content-Type: application/xml
Location: /library/books/668102

<ref>http://www.xyz.com/library/books/668102</ref>

Вызовите метод объекта

HTTP POST используется для вызова метода объекта, метод указывается в обязательном параметре «действие». Аргументы метода также могут быть закодированы в URL (для примитивных типов) или в теле запроса (для сложных типов).

POST /library/books/668102?action=buy&user=ricky HTTP/1.1
Host: www.xyz.com

POST /library/books/668102?action=buy HTTP/1.1
Host: www.xyz.com
Content-Type: application/xml; charset=utf-8
Content-Length: nnn

<user>
<id>ricky</id>
<addr>175, Westin St. CA 12345</addr>
</user>

Уничтожить существующий объект

HTTP DELETE используется для уничтожения объекта. Это освободит все ресурсы, связанные с этим объектом.

DELETE /library/books/668102 HTTP/1.1
Host: www.xyz.com

Контейнерные паттерны

Непосредственным родителем контейнера должен быть объект (может быть одноэлементным объектом без идентификатора или объектом с идентификатором). Контейнер «содержит» другие объекты или контейнеры. Если контейнер уничтожен, все, что находится под ним, будет уничтожено автоматически рекурсивным способом.

http://www.xyz.com/library/books
http://www.xyz.com/library/dvds
http://www.xyz.com/library/books/668102/chapters

В операции GET по умолчанию контейнер возвращает только ссылку на URL своих непосредственных потомков. Необязательный параметр «раскрыть» может быть использован для запроса фактического представления всех дочерних элементов и потомков.

Более сложная операция GET может содержать параметр «критерий», чтобы показать только дочерние элементы, которые удовлетворяют определенным критериям.
GET http://www.xyz.com/library/book?query=(author=’ricky ‘)

Шаблоны ссылок

Длительные транзакции

Параллельные обновления (ETags)

С  http://horicky.blogspot.com/