Получение количества возвратов, видимых запросом RESTful - PullRequest
17 голосов
/ 23 октября 2009

Итак, я хотел бы знать, сколько результатов я получу от запроса RESTful uri GET. Я не знаю ни одного способа сделать это на данный момент. Есть способ сделать это? Так как REST просто выбрасывает свойства, я не знаю, сможет ли он подсчитать свои результаты, но он может пропустить результаты и получить подмножество результатов.

У кого-нибудь есть предложения?

О, моя установка - это LINQ to SQL, которая заполняет запрашиваемый общий список. Служба данных делает этот список доступным. Я пытался получить счетчик в списке, но я всегда получаю максимальное количество строк в базе данных, а это не то, что я ищу.

Ответы [ 4 ]

20 голосов
/ 23 октября 2009

У других людей могут быть возражения против этой концепции, но мне это кажется разумным:

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

Или отрегулируйте при необходимости.

0 голосов
/ 23 октября 2009

Почему вы не заставляете свой ресурс обрабатывать запросы для метаданных этого типа? Предположим, что

GET /items

возвращает ваш список предметов, как это:

<items count="5" modified="2009-10-22">
  <item url="/items/first" name="First Item" />
  <item url="/items/second" name="Second Item" />
  ...
</items>

Тогда что-то вроде:

GET /items?info

может вернуть пустой список, например так:

<items count="5" modified="2009-10-22" type="info" />

или, возможно, документ с общей информацией, подобный этому:

<info>
  <items count="5" modified="2009-10-22" url="/items" />
</info>

Вы также можете реализовать информационный ресурс, подобный этому:

GET /info?items&users

, который может вернуть:

<info>
  <items count="5" modified="2009-10-22" url="/items" />
  <users count="8" modified="2009-10-05" url="/users" />
</info>
0 голосов
/ 23 октября 2009

Вы должны быть в состоянии позаботиться об этом в своем дизайне имени ресурса REST. Вы бы начали с чего-то вроде:

  • / widget / 12345 (представление виджета 12345)
  • / widgets (список всех имен ресурсов виджетов, т.е. ссылок)

Вы можете быстро решить, что "/ widgets" будет огромным списком, и принять решение о поддержке страниц, что-то вроде

  • / widgets / page / 43 (здесь могут быть ссылки на виджеты с 4200 по 4299 и дополнительная информация, например общее количество страниц или количество виджетов.)

В других случаях вы можете подразделить большой набор на естественную иерархию:

  • / widgets / красное дерево, / widgets / oak, ...
  • / фильмы / драмы, / фильмы / мелодрамы, ...
  • / компьютеры / жесткие диски / seagate, / компьютеры / usbdrives / kingston

И вы также можете определять запросы:

  • / виджетов? Maxprice = 200 & maxweight = 4 * * одна тысяча двадцать восемь
0 голосов
/ 23 октября 2009

Почему бы не сделать, чтобы веб-сервис REST просто возвращал данные в виде JSON или XML, и там вы можете иметь свойство длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...