Как мне реализовать глагол COUNT в моем веб-сервисе RESTful? - PullRequest
29 голосов
/ 22 марта 2011

Я написал веб-сервис RESTful, который поддерживает стандартные операции CRUD и который может возвращать набор объектов, соответствующих определенным критериям (глагол ПОИСК), но я хотел бы добавить глагол COUNT более высокого порядка, поэтому клиенты могут считать ресурсы, соответствующие критериям поиска, без необходимости извлекать их все.

Несколько вариантов, которые мне приходят в голову:

  • Игнорирование спецификации HTTP и возвращение количества объектов в теле ответа на запрос HEAD.

  • Дублирование логики глагола SEARCH, но создание запроса HEAD вместо запроса GET. Затем сервер закодирует количество объектов в заголовке ответа.

  • Определение нового HTTP-метода COUNT, который возвращает количество объектов в теле ответа.

Я бы предпочел API первого подхода, но мне нужно воспользоваться этим вариантом, потому что он не соответствует требованиям. Второй подход кажется наиболее семантически правильным, но API не очень удобен: клиентам придется иметь дело с заголовками ответов, когда большую часть времени они хотят сделать что-то простое, например response.count. Поэтому я склоняюсь к третьему подходу, но меня беспокоят потенциальные проблемы, связанные с определением нового метода HTTP.

Что бы вы сделали?

Ответы [ 3 ]

18 голосов
/ 22 марта 2011

Вы можете использовать HEAD, не нарушая спецификации HTTP, и вы можете указать количество, используя заголовок HTTP Range в ответе:

HEAD /resource/?search=lorem

Ответ службы, при условии, что вы возвращаете первые 20 результатов по умолчанию:

...
Content-Range: resources 0-20/12345
...

Таким образом, вы передаете количество ресурсов клиенту в заголовке ответного сообщения без необходимости возвращать тело сообщения.

Обновление:
Предлагаемое решение Yannick Loiseau будет работать нормально. Просто хотел предложить еще один альтернативный подход, который можно использовать для достижения того, что вам нужно, без необходимости определять новый ресурс глагола.

Вы можете использовать GET и добавить счет в тело сообщения. Затем, если ваш API позволяет клиентам запрашивать диапазон результатов, вы можете использовать его, чтобы ограничить размер тела сообщения до минимума (так как вам нужен только счетчик). Один из способов сделать это - запросить пустой диапазон (от 0 до 0), например:

GET /resource/?search=lorem&range=0,0

Служба может затем ответить следующим образом, указывая, что в наборе результатов имеется 1234 совпадающих ресурса:

<?xml version="1.0" encoding="UTF-8" ?>
<resources range="0-0/1234" />
16 голосов
/ 22 марта 2011

Основная цель отдыха - определить набор ресурсов, с которыми вы взаимодействуете, используя четко определенные глаголы.Таким образом, вы должны избегать определять свои собственные глаголы.Количество ресурсов следует рассматривать как другой ресурс с его собственным URI, который вы можете просто получить.Например:

GET resources?crit1=val1&crit2=val2

возвращает список ресурсов, а

GET resources/count?crit1=val1&crit2=val2

Другой вариант заключается в использовании подключения: например, Accept: text/uri-list возвращает список ресурсов, а Accept: text/plain возвращает толькокол

5 голосов
/ 22 марта 2011

Игнорирование спецификации HTTP и возвращение количества объектов в теле ответа на запрос HEAD.

ИМХО, это очень плохая идея.Это может не сработать просто потому, что у вас могут быть посредники, которые не игнорируют спецификацию HTTP.

Определение нового метода HTTP, COUNT, который возвращает количество объектов в теле ответа.

Нет проблем с этим подходом.HTTP расширяем, и вы можете определить свои собственные глаголы.Некоторые брандмауэры запрещают это, но обычно они также запрещают POST и DELETE, и широко поддерживается заголовок X-HTTP-Method-Override.

Другой вариант, чтобы добавить параметр запроса к вашему URL, что-то вроде:? CountOnly= верно

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