1. Обзор
В этой быстрой статье мы рассмотрим исключение HttpMediaTypeNotAcceptableException
и поймем, в каких случаях мы можем с ним столкнуться.
2. Проблема
При реализации конечной точки API с помощью Spring нам обычно необходимо указывать типы потребляемых/производимых носителей (с помощью параметров
потребления и производства
). Это сужает возможные форматы, которые API будет возвращать клиенту для этой конкретной операции.
HTTP также имеет специальный заголовок «Accept»
, который используется для указания типов мультимедиа, которые клиент распознает и может принять. Проще говоря, сервер отправит обратно представление ресурса, используя один из типов мультимедиа, запрошенных клиентом.
Однако если нет общего типа, с которым могут работать обе стороны, Spring выдаст исключение HttpMediaTypeNotAcceptableException
.
3. Практический пример
Давайте создадим простой пример, который продемонстрирует этот сценарий.
Мы собираемся использовать конечную точку POST, которая может работать только с «application/
json »
и также возвращает данные JSON обратно:
@PostMapping(
value = "/test",
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public Map<String, String> example() {
return Collections.singletonMap("key", "value");
}
Затем давайте отправим запрос с помощью CURL с нераспознанным типом контента:
curl -X POST --header "Accept: application/pdf" http://localhost:8080/test -v
> POST /test HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.51.0
> Accept: application/pdf
Ответ, который мы получили:
< HTTP/1.1 406
< Content-Length: 0
4. Решение
Решить проблему можно только одним способом — отправить/получить один из поддерживаемых типов.
Все, что мы можем сделать, это предоставить более описательное сообщение (по умолчанию Spring возвращает пустое тело) с пользовательским ExceptionHandler
, уведомляющим клиента обо всех допустимых типах мультимедиа.
В нашем случае это только «application/json»
:
@ResponseBody
@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
public String handleHttpMediaTypeNotAcceptableException() {
return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE;
}
5. Вывод
В этом руководстве мы рассмотрели исключение HttpMediaTypeNotAcceptableException
, создаваемое Spring MVC при несоответствии между тем, что запрашивает клиент, и тем, что на самом деле может создать сервер.
Как всегда, фрагменты кода, упомянутые в статье, можно найти в нашем репозитории GitHub .