У других людей могут быть возражения против этой концепции, но мне это кажется разумным:
HEAD /your/api HTTP/1.1
HTTP/1.1 200 OK
Date: Fri, 23 Oct 2009 00:58:17 GMT
Content-Type: application/xml; charset=UTF-8
Content-Length: 89
X-Result-Count: 100000000
А потом:
GET /your/api HTTP/1.1
HTTP/1.1 200 OK
Date: Fri, 23 Oct 2009 00:58:17 GMT
Content-Type: application/xml; charset=UTF-8
Content-Length: 89
X-Result-Count: 100000000
<?xml version="1.0" encoding="UTF-8"?>
<results>
100000000 results go here.
</results>
Примечание: Здесь используется запрос HEAD для получения количества без необходимости извлечения полного набора данных. Запросы HEAD извлекают только заголовки HTTP, а не тело ответа.
Это был бы самый RESTful способ, которым я могу придумать, чтобы указать, сколько результатов вы получите, прежде чем отправлять его по проводам. Основной трюк заключается в том, чтобы придумать лучшее название для него. X-Result-Count
вполне прилично, но если вы сможете найти предшествующий уровень техники и повторно использовать их выбор имени заголовка, это было бы еще лучше (если они не называли это действительно глупым). Тем не менее, я не ожидаю, что вам повезет, поэтому вам, вероятно, стоит придерживаться X-Result-Count
.
Кроме того, я думаю, что вы, возможно, неправильно поняли, что на самом деле означает "ОТДЫХ". Там нет причин, вы не можете дать представление по диапазону. Например:
GET /your/api?page=1&perpage=10 HTTP/1.1
HTTP/1.1 200 OK
Date: Fri, 23 Oct 2009 00:58:17 GMT
Content-Type: application/xml; charset=UTF-8
Content-Length: 101
X-Result-Count: 10
<?xml version="1.0" encoding="UTF-8"?>
<results>
First 10 results of 100000000 go here.
</results>
Однако, чтобы быть RESTful, вы должны быть в состоянии сообщить клиенту о представлении, обозначенном /your/api?range=0-9
или /your/api?page=1&perpage=10
, без использования внеполосной информации. Например, если ваша страница /your/api
выдаст слишком много результатов, выполните временное перенаправление на /your/api?page=1&perpage=10
и добавьте гиперссылки на /your/api?page=2&perpage=10
. Обратите внимание, что гиперссылка в этом контексте может быть чем-то простым, например:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<result>
This is a result.
</result>
<result>
This is also a result.
</result>
<link rel="next" href="/your/api?page=3&perpage=2" />
<link rel="prev" href="/your/api?page=1&perpage=2" />
</results>
Теперь информация для навигации по результатам ваших вызовов API является встроенной и фактически RESTful.
По сути, REST - это обычный старый HTTP с правильно выполненным кэшированием и обычно разумными URI, добавленными для хорошей меры. Это также «гипертекст как движок состояния приложения» (т.е. ресурсы должны ссылаться на другие ресурсы). Это не протокол, это архитектурный стиль. Любого, кто говорит вам по-другому, лучше назвать Роем Филдингом.
Addenda:
Если вы хотите указать общее количество в сравнении с количеством страниц, вы можете определить заголовок следующим образом:
X-Result-Count: 0-9/100000000
Или отрегулируйте при необходимости.