Ответ 1
Другие люди могут возражать против этой концепции, но это кажется мне разумным:
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
.
Кроме того, я думаю, вы, возможно, неправильно поняли, что на самом деле подразумевает "REST". Нет причин, по которым вы не можете представить представление по диапазону. Например:
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, которые были выбраны для хорошей меры. Это также "гипертекст как механизм состояния приложения" (то есть ресурсы должны ссылаться на другие ресурсы). Это не протокол, это архитектурный стиль. Любой, кто говорит вам по-другому, лучше называться Роем Филдингом.
- http://roy.gbiv.com/untangled/2009/it-is-okay-to-use-post
- http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
- http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven#comment-718
Addenda:
Если вы хотите указать общий счетчик против количества страниц, вы можете определить заголовок следующим образом:
X-Result-Count: 0-9/100000000
Или отрегулируйте по мере необходимости.