HttpMediaTypeNotAcceptableException в Spring MVC

HttpMediaTypeNotAcceptableException в Spring MVC

1. обзор

В этой быстрой статье мы рассмотрим исключениеHttpMediaTypeNotAcceptableException и разберемся, в каких случаях мы можем с ним столкнуться.

2. Эта проблема

При реализации конечной точки API с помощью Spring нам обычно необходимо указать типы потребляемых / производимых мультимедиа (через параметрыconsumes иproduces). Это сужает возможные форматы, которые 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 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, когда существует несоответствие между тем, что запрашивает клиент, и тем, что сервер действительно может произвести.

Как всегда, фрагменты кода, упомянутые в статье, можно найти вour GitHub repository.