Давайте начнем с самого начала: типы медиа существуют для того, чтобы предоставить клиенту формат, который он может использовать, чтобы решить, что делать дальше. Без HTML-страницы в браузере нет ссылок для перехода. Без рендера html браузер не может отобразить страницу и не знает, что делать.
Без типа носителя клиент не имеет ни малейшего понятия, сможет ли он что-либо делать с потоком байтов. Действительно, когда клиент получает заголовки, указывающие application / xml, он не знает, что делать, кроме как получить анализатор xml.
Таким образом, вопрос на самом деле заключается в том, сможет ли клиент принять решение на основе http-сообщения, не заглядывая внутрь сообщения, или он должен заглянуть внутрь сообщения (или, что еще хуже, сначала проанализировать сообщение), чтобы знать, что делать.
Отсутствие типов мультимедиа означает, что вашему клиенту придется выполнить дополнительную работу по просмотру или, что еще хуже, обработать само тело сущности, прежде чем он сможет принять решение, будь то для рендеринга или для обработки. Теперь вам нужно добавить множество пользовательских поведений для каждого из ваших форматов, которые вы, возможно, захотите обработать, и вы потеряете немного связи в процессе.
Также является фундаментальным для http, что посредники должны иметь возможность обрабатывать запросы без проверки тела, и там также существует проблема с application / xml.
Теперь, когда вы говорите, что семантика типов мультимедиа является частью или не является частью API ... Что представляет собой API?
С точки зрения клиента, API не существует. Существует первоначальное представление, которое позволяет клиенту принять решение о том, что делать дальше. Тип носителя действительно там, где клиент получает информацию, необходимую ему для навигации по «API», и поэтому не может быть API без представлений.
Кроме того, клиент должен знать только три бита: местоположение начальной загрузки, протокол HTTP и типы мультимедиа. Первый - это всего лишь URI, и он не передает ничего, кроме расположения репрезентации, необходимой для продолжения. Второй имеет уже очень четкую семантику. Третий - тот, где у вас есть контроль, поскольку у вас есть контракт с вашим клиентом.
Это противоречие говорит о том, что всякий раз, когда вы хотите что-то сделать, у чего-то будет семантика: чтобы добавить клиента, отправьте приложение / vnd.acme.customer + xml для / клиентов с помощью POST.
Отсюда мой ответ: разработка архитектуры REST основывается на двух этапах: моделирование ресурсов (на концептуальном уровне) и построение медиа-типов. Что-нибудь еще, и вы, вероятно, делаете это неправильно.