О чём говорит 415
Код 415 показывает, что сервер понял запрос, но не готов работать с тем форматом, в котором отправлены данные. Формат указывается заголовком Content-Type: например, JSON, данные формы или файл определённого типа. Если сервер ожидает одно, а получает другое, он отвечает 415.
Ошибка касается именно тела запроса. Если бы проблема была в формате желаемого ответа, сервер использовал бы другой код, связанный с согласованием содержимого. Поэтому при 415 нужно смотреть на то, что вы отправляете, а не на то, что получаете.
Наиболее вероятные причины: HTTP 415 Unsupported Media Type
Первая: клиент вообще не указал Content-Type или указал неверный. Например, отправляет JSON, но заголовок сообщает, что это обычная форма. Вторая: сервер поддерживает только один формат, а клиент шлёт другой, скажем, XML вместо JSON.
Третья причина — загрузка файла в неподдерживаемом формате: сервис принимает изображения, а вы выбрали документ другого типа или файл с переименованным расширением. Четвёртая — неверная кодировка или сжатие содержимого, которых сервер не ожидает. Пятая — обращение к неправильному адресу, где обработчик поддерживает иной формат, чем нужный.
Проверка для пользователя сайта
Если ошибка возникла при загрузке файла на обычном сайте, проверьте требования к формату в подсказке возле кнопки. Многие сервисы принимают лишь несколько типов. Убедитесь, что расширение соответствует реальному содержимому: файл, у которого поменяли только окончание имени, сервер распознаёт по внутренней структуре и отвергает.
Попробуйте пересохранить файл в допустимом формате стандартными средствами графической или офисной программы. Если загрузка идёт через мобильное приложение, обновите его: устаревшая версия могла отправлять данные в формате, который сервер больше не принимает.
Проверка для разработчика
Откройте вкладку сети в инструментах браузера или включите подробный вывод в утилите командной строки и сравните заголовки отправляемого запроса с документацией сервиса. Убедитесь, что Content-Type точно совпадает с ожидаемым значением, включая необязательную кодировку, если она требуется.
Частая ошибка — автоматическая подстановка заголовка библиотекой. Одни инструменты сами выставляют нужный тип, другие оставляют значение по умолчанию. Если вы отправляете файлы, проверьте, что запрос действительно составной, с границей между частями, а не обычный текстовый.
Частые сценарии на практике
Классический пример: скрипт отправляет JSON, но забывает указать соответствующий Content-Type, и сервер, ожидающий именно этот тип, отвечает 415. Исправляется одной строкой в настройках запроса. Обратный пример: интерфейс принимает данные формы, а клиент шлёт JSON.
Отдельный случай — загрузка изображений. Сервис принимает, скажем, только несколько популярных форматов, а телефон сохранил снимок в другом, более новом формате. Пользователь видит непонятный отказ, хотя файл открывается на устройстве без проблем. Решение — экспортировать снимок в широко поддерживаемый формат или изменить настройки камеры.
Стоит помнить и о вложенных проверках: даже когда общий тип разрешён, сервер может отклонить конкретный подтип, сжатие или кодировку. Поэтому сообщение 415 всегда лучше читать вместе с документацией сервиса, где перечислены допустимые форматы, размеры и ограничения. Если документации нет, пробуйте самый распространённый вариант и сравнивайте заголовки с работающим примером.
Что исправить на сервере
Если сервер отклоняет формат, который по замыслу должен принимать, проверьте настройки обработчиков и промежуточных модулей. Иногда 415 появляется из-за того, что фреймворк не подключил разбор нужного формата или список разрешённых типов не включает вариант с указанием кодировки.
Хорошая практика — возвращать в теле ответа перечень поддерживаемых типов. Так клиентам не приходится гадать, и число обращений в поддержку сокращается.
Если вы отвечаете за сервис, добавьте в документацию таблицу поддерживаемых форматов с примерами запросов. Проверяйте формат по заголовку и по фактическому содержимому, но не полагайтесь только на расширение файла. Для незнакомого типа возвращайте понятное сообщение со списком допустимых значений, тогда пользователи и разработчики интеграций сами быстро исправят запрос.