Перейти к основному содержимому

Исключение HttpMediaTypeNotAcceptableException в Spring MVC

· 2 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

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 .