REST Проверьте, существует ли ресурс, как обращаться на стороне сервера? - PullRequest
0 голосов
/ 12 июня 2018

как обрабатывать проверку ресурсов на стороне сервера?Например, мой API выглядит следующим образом:

/books/{id}

После поиска в Google я обнаружил, что должен использовать метод HEAD, чтобы проверить, существует ли ресурс.https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

Я знаю, что могу использовать конечную точку GET и использовать метод HEAD для получения информации о ресурсе, и в этом случае сервер не возвращает тело.

Но что мне делать на серверебоковая сторона?У меня есть два варианта.

  1. Одна конечная точка помечена как GET.В этой конечной точке я могу использовать метод GET для извлечения данных и HEAD для проверки доступности ресурса.

  2. Две конечные точки.Один помечен как GET, второй - как HEAD.

Почему я рассматриваю второе решение?Предположим, что GET-запрос извлекает некоторые данные из базы данных и обрабатывает их некоторым образом, что занимает некоторое время, например.10 мс

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

select count(*) from BOOK where id = :id

и немедленно вернуть статус 200, если результат запроса равен 1. В этом случае мне не нужно обрабатывать данные, поэтому я получаю более быстрое время ответа.

Но ... ресурс в REST - это объект, который передается по HTTP, поэтому, возможно, мне следует обрабатывать данные, но не возвращать их при использовании метода HEAD?

Заранее спасибо за ваш ответ!

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Вы можете просто делегировать обработчик HEAD существующему обработчику GET и возвращать только код состояния и заголовки (игнорируя полезную нагрузку ответа).

Это то, что делают некоторые фреймворки, такие как Spring MVC и JAX-RS.


См. Следующую цитату из документации Spring MVC :

@GetMapping - а также @RequestMapping(method=HttpMethod.GET) неявно отображаются и также поддерживают HTTP HEAD.Запрос HTTP HEAD обрабатывается так, как если бы он был HTTP GET, за исключением того, что вместо записи тела подсчитывается количество байтов и устанавливается заголовок "Content-Length.

[...]

@RequestMapping метод может быть явно отображен на HTTP HEAD и HTTP OPTIONS, но в общем случае это не обязательно.

И смотрите следующую цитату изДокументация JAX-RS :

HEAD и OPTIONS получает дополнительную автоматическую поддержку. При получении запроса HEAD реализация ДОЛЖНА либо:

  1. Вызовите метод, аннотированный указателем метода запроса для HEAD, или, если его нет,
  2. Вызовите метод, аннотированный указателем метода запроса для GET, и отбросьте любую возвращенную сущность.

Обратите внимание, что вариант 2 может привести к снижению производительности при значительном создании объекта.


Примечание: Неиспользуйте старый RFC 2616 в качестве эталона. Это было устаревшимарендованный новым набором RFC: 7230-7235.О семантике протокола HTTP см. RFC 7231 .

0 голосов
/ 12 июня 2018

Ваша ссылка на методы HTTP устарела;вы должны ссылаться на RFC 7231, раздел 4.3.2

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН отправлять тело сообщения в ответе (т. е.ответ заканчивается в конце раздела заголовка).

Этот метод может использоваться для получения метаданных о выбранном представлении без передачи данных представления и часто используется для проверки гипертекстовых ссылок на предмет действительности, доступности и недавней модификации..

Вы спросили:

Ресурс в REST - это объект, который передается по HTTP, поэтому, возможно, мне следует выполнять обработку данных, но не возвращать их при использовании метода HEAD?

Это верно - основное различие между GET и HEAD заключается в том, возвращает ли сервер тело сообщения в качестве части ответа.

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

Мое предложение будет использовать новый ресурс для tшапка.«Ресурсы» - это создание базы данных, похожей на веб-сайт.В REST совершенно нормально иметь много URI, которые сопоставляются запросам, использующим тот же самый предикат.

Джим Уэббер выразился так:

Сеть - это не ваш домен, это система управления документами.Все глаголы HTTP применяются к домену управления документами.URI НЕ отображаются на доменные объекты - это нарушает инкапсуляцию.Работа (например: выдача команд для модели предметной области) является побочным эффектом управления ресурсами.Другими словами, ресурсы являются частью антикоррупционного уровня.Вы должны ожидать, что в вашем домене интеграции будет гораздо больше ресурсов, чем в бизнес-объектах.

0 голосов
/ 12 июня 2018

Конечная точка должна быть такой же, и сценарий на стороне сервера должен принимать решение о том, что делать в зависимости от метода.Если метод HEAD, просто верните подходящий код HTTP:

  • 204, если контент существует, но сервер не возвращает его
  • 404, если не существует
  • 4xx или 5xx при другой ошибке

Если метод GET, обработать запрос и вернуть содержимое с HTTP-кодом:

  • 200, если содержимоесуществует и сервер возвращает его
  • 404, если не существует
  • 4xx или 5xx при другой ошибке

Важно то, что URL должен бытьТо же самое, просто метод должен быть другим.Если URL будет другим, то мы говорим о разных ресурсах в контексте REST.

...