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 Mapexample() { 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 , уведомляющим клиента обо всех приемлемых типах носителей.
В нашем случае это только “приложение/json” :
@ResponseBody @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) public String handleHttpMediaTypeNotAcceptableException() { return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE; }
5. Заключение
В этом уроке мы рассмотрели исключение HttpMediaTypeNotAcceptableException , создаваемое Spring MVC, когда существует несоответствие между тем, что запрашивает клиент, и тем, что на самом деле может произвести сервер.
Как всегда, фрагменты кода, упомянутые в статье, можно найти в нашем репозитории GitHub .