Много вопросов в одном, я приведу краткие ответы с кучей ссылок на соответствующие статьи и справочную документацию.
Какой тип должен возвращать контроллер?
Зависит от вашей аннотации и RESTful-ness вашего сервиса. Есть три аннотации, которые вы можете использовать для контроллеры: @Controller
, @RestController
и @RepositoryRestController
.
Контроллер базовая аннотация, чтобы пометить ваш класс как контроллер. Тип возвращаемого значения методов конечной точки контроллера может быть разным, я приглашаю вас прочитать этот специальный пост, чтобы получить представление о Это. При разработке службы REST вы сосредоточитесь на использовании RestController и RepositoryRestController. RestController
is Controller
+ тело ответа. Он связывает возвращаемое значение метода конечной точки с телом веб-ответа:
@RestController
public ItemController {
@RequestMapping("/items/{id}")
public Item getItem(@PathVariable("id") String id) {
Item item = ...
return item;
}
}
При этом, когда вы нажимаете http:/.../api/items/foo
, Spring делает свое волшебство, автоматически преобразовывая элемент в ResponseEntity с соответствующим кодом состояния 40X и некоторыми заголовками HTTP по умолчанию.
В какой-то момент вам понадобится больше контроля над кодом состояния и заголовками, но при этом вы сможете воспользоваться настройками Spring Data REST. Вот когда вы будете использовать RepositoryRestController
с ResponseEntity<Item>
в качестве возвращаемого типа, см. пример ссылка Spring Data REST.
Какой код состояния http использовать в методе GET для определенного элемента, если данный элемент не существует?
Прямо сказано: используйте HttpStatus. НЕ НАЙДЕНО. Вы ищете несуществующий ресурс, там что-то не так.
При этом вам решать, как обращаться с отсутствующими ресурсами в вашем проекте. Если ваш рабочий процесс оправдывает это, отсутствующий ресурс может быть чем-то вполне приемлемым, что действительно возвращает 20-кратный ответ, хотя вы можете ожидать, что пользователи вашего API запутаются, если вы не предупредите их или не предоставите какую-либо документацию (мы люди привычек и конвенции). Но я бы все же начал с кода состояния 404.
(...) @Produces и @Consumes по методу WS, но какая от этого польза? Мое приложение и мои методы работают так, зачем указывать MediaType.APPLICATION_JSON_VALUE? Разве Spring/SpringBoot не конвертирует Item или ResponseEntity автоматически в json?
@Consumes
и @Produces
соответственно сопоставляются с заголовками content-type
и accept
из запроса. Это средство ограничения принимаемых входных данных и выходных данных, предоставляемых вашим методом конечной точки.
Поскольку мы говорим о службе REST, ожидается, что связь между клиентами API и службой будет в формате JSON. Благодаря Spring HATEOAS ответ фактически отформатирован с типом содержимого application/hal+json
. В этом случае вы действительно можете не беспокоиться об этих двух аннотациях. Они понадобятся вам, если вы разрабатываете сервис, который принимает различные типы контента (приложение/текст, приложение/json, приложение/xml...) и предоставляет, например, HTML-представления пользователям вашего веб-сайта и JSON или XML-ответ на автоматические клиенты вашего сервиса.
Для примеров из жизни:
- Facebook предоставляет Graph API, чтобы приложения могли читать/записывать его граф, в то время как пользователи с удовольствием (?) просматривают веб-страницы
- Google делает то же самое с API Карт Google.
person
Marc Tarin
schedule
05.02.2018