URL не делают API RESTful или нет. Более важно четко представлять ваши ресурсы и переходы между ними (через ссылки и формы) и избегать внеполосной информации, которая связывает клиентов с вашей реализацией. RESTful Hypermedia API в трех простых шагах охватывает эту концепцию прекрасно.
1) Создайте корневой ресурс, который обеспечивает хорошо известную отправную точку для всех клиентов и позволяет им обнаруживать доступные службы (это может быть тот же URL-адрес, который используется браузерами. Используйте заголовок Accept
, чтобы определить, является ли HTML или ваш Медиа-тип API должен быть возвращен).
GET: http://localhost/webapp
<webapp href="/webapp">
<invoices href="/webapp/invoices"/>
... any other services ...
</webapp>
2) Создайте ресурс коллекции для ваших счетов
GET: http://localhost/webapp/invoices
<invoices href="/webapp/invoices">
<invoice href="/webapp/invoices/555"/>
<invoice href="/webapp/invoices/554"/>
<invoice href="/webapp/invoices/553"/>
<invoice href="/webapp/invoices/552"/>
...
<search href="/webapp/invoices/" method="get">
<query type="xpath" cardinality="required"/>
</search>
<next href="/webapp/invoices?page=2" method="get"/>
<create-draft href="/webapp/invoices" method="post">
<total-price type="decimal" cardinality="optional"/>
... user should be picked up automatically based on the authorised user posting the form ...
... add other optional and required parameters here. ...
</create-draft>
</invoices>
Это коллекция, разбитая на страницы, с элементом next
, сообщающим клиенту, как получить следующую страницу. Если было недостаточно счетов (например, 5 счетов и каждая страница может содержать 10), тогда элемент next
не будет отображаться. Точно так же, если запрашивающая сторона не авторизована для создания счетов, то форма create-draft
не будет включена.
Получение следующей страницы будет выглядеть примерно так:
GET: http://localhost/webapp/invoices?page=2
<invoices href="/webapp/invoices">
<invoice href="/webapp/invoices/545"/>
<invoice href="/webapp/invoices/544"/>
<invoice href="/webapp/invoices/543"/>
<invoice href="/webapp/invoices/542"/>
...
<search href="/webapp/invoices/" method="get">
<query type="xpath" cardinality="required"/>
</search>
<next href="/webapp/invoices?page=3" method="get"/>
<prev href="/webapp/invoices" method="get"/>
<create-draft href="/webapp/invoices" method="post">
<total-price type="xs:decimal" cardinality="optional"/>
... user should be picked up automatically based on the authorised user posting the form ...
... add other optional and required parameters here. ...
</create-draft>
</invoices>
3) Создать ресурс для ваших счетов
GET: http://localhost/webapp/invoices/555
<invoice href="/webapp/invoice/555">
... details go here ...
<reject href="/webapp/invoices/555" method="delete">
<reason type="xs:string" cardinality="required"/>
</reject>
<approve href="/webapp/invoices/555" method="put">
... add approval parameters here ...
</approve>
</invoices>
Аналогичным образом, если пользователь не авторизован для отклонения или утверждения счетов-фактур, эти элементы не должны отображаться. То же самое происходит, если счет уже был утвержден (в этом случае, возможно, существует форма отмены).