Рекомендуемый способ справиться с такой ситуацией - использовать content negotiation.
Когда ответы передают информацию полезной информации, сервер происхождения часто имеет различные способы представления этой информации; например, в различных форматах. По этой причине HTTP предоставляет механизмы для согласования содержимого .
Apache HTTPD content negotiation documentation содержит несколько хороших примеров (вы можете игнорировать детали конфигурации, если вы не используете httpd). Это будет хорошо работать, если вы используете API для клиентов приложений.
Таким образом, когда клиент хочет представление JSon, он может запросить
GET /api/1/orders/1234 HTTP/1.1
Host: example.org
Accept: application/json
и когда клиент хочет представление PDF, он может запросить
GET /api/1/orders/1234 HTTP/1.1
Host: example.org
Accept: application/pdf
Однако, ситуация немного меняется если клиенты - это в основном браузеры, потому что они обычно отправляют общий заголовок Accept при вводе URL-адреса в адресной строке. Вы можете проверить эти значения для обычных браузеров, таких как Firefox, Safari, Chrome, Internet Explorer и Opera here.
Например, Chrome отправляет следующий заголовок Accept.
Accept: application/xml,application/xhtml+xml,text/html;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5
Таким образом, в этом случае, что браузер говорит, что он предпочитает XML и HTML, если не простой текст, PNG изображения или любые другие типы. В этом случае он не говорит о каких-либо предпочтениях ни в json, ни в pdf (и пользователь не может легко указать, что с помощью браузера).В этом случае было бы разумно иметь два URL-адреса, например/api/1/orders/1234 (или /api/1/orders/1234.json) и /api/1/orders/1234.pdf.
Таким образом, ваш выбор будет зависеть от того, какого типа клиентов вы ожидаете. Однако, если это два представления одного и того же ресурса, более подходящий способ сделать это с использованием HTTP будет заключаться в использовании согласования контента.
content-type: application/pdf –
@WonTonSoup Нет, 'Content-Type' указывает MIME тела запроса/ответа. Возможно, вы имели в виду 'Accept', но проблема в том, что некоторые клиенты не поддерживают пользовательские поля' Accept'. –