Могу ли я изменить заголовки HTTP-запроса, отправленного браузером?

Я ищу спокойный дизайн и хотел бы как можно больше использовать HTTP-методы (POST, GET,...) и HTTP-заголовки. Я уже выяснил, что HTTP-методы PUT и DELETE не поддерживаются в браузере.

Теперь я хочу получить разные представления одного и того же ресурса и хотел бы сделать это, изменив заголовок Accept запроса. В зависимости от этого заголовка Accept сервер может использовать другое представление на том же ресурсе.

Проблема в том, что я не нашел способ сообщить моему браузеру об изменении этого заголовка.

Тег <a..> имеет атрибут , который может иметь тип mime, выглядел как хороший кандидат, но заголовок все еще был браузера по умолчанию (в Firefox его можно изменить в about:config с помощью клавиши network.http.accept.default).

Ответ 1

Я не думаю, что это возможно сделать так, как вы пытаетесь это сделать.

Индикация принятого формата данных обычно делается путем добавления расширения к имени ресурса. Итак, если у вас есть ресурс, например

/resources/resource

и GET /resources/resource возвращает свое представление HTML, чтобы указать, что вы хотите его представление XML, вы можете использовать следующий шаблон:

/resources/resource.xml

Затем вы должны сделать магию определения принятого типа контента на стороне сервера.

Или используйте Javascript, как предлагает Джеймс.

Ответ 2

Я бы частично не согласился с предложением Милана о включении запрошенного представления в URI.

Если возможно, URI должны использовать только для адресации ресурсов и not для туннелирования HTTP-методов/глаголов. В конце концов, конкретное деловое действие (редактирование, блокировка и т.д.) Может быть внедрено в URI, если только создание (POST) или обновление (PUT) не служат цели:

POST http://shonzilla.com/orders/08/165;edit

В случае запроса конкретного представления в URI вам нужно будет нарушить ваш дизайн URI, что в конечном итоге сделает его более уродливым, смешивая две разные концепции REST в одном и том же месте (то есть URI) и затрудняя процесс обработки запросов на сервере в целом -боковая сторона. Что Милан предлагает, и многие делают то же самое, в том числе. Flickr, именно это.

Вместо этого более RESTful-подход будет использовать отдельное место для кодирования предпочтительного представления с помощью Accept HTTP-заголовка, который используется для согласования контента, когда клиент сообщает серверу, какие типы содержимого он может обрабатывать/обрабатывать и сервер пытается выполнить запрос клиента. Этот подход является частью стандарта HTTP 1.1, совместим с программным обеспечением и поддерживается веб-браузерами.

Сравните это:

GET /orders/08/165.xml HTTP/1.1
or
GET /orders/08/165&format=xml HTTP/1.1

:

GET /orders/08/165 HTTP/1.1
Accept: application/xml

В веб-браузере вы можете запросить любой тип контента с помощью метода setRequestHeader объекта XMLHttpRequest. Например:

function getOrder(year, yearlyOrderId, contentType) {
 var client = new XMLHttpRequest();
 client.open("GET", "/order/" + year + "/" + yearlyOrderId);
 client.setRequestHeader("Accept", contentType);
 client.send(orderDetails);
}

Подводя итог: адрес, то есть URI ресурса должен быть независимым от его представления, а метод XMLHttpRequest.setRequestHeader позволяет запросить любое представление, используя заголовок Accept HTTP.

Ура!
Shonzilla

Ответ 3

Я хотел сделать то же самое (веб-сервис RESTful), и я наткнулся на этот аддон firefox, который позволяет вам изменять заголовки accept (фактически, любые заголовки запросов) для запросов. Он отлично работает.

https://addons.mozilla.org/en-US/firefox/addon/967/

Ответ 4

Используйте javascript!

xmlhttp=new XMLHttpRequest();
xmlhttp.open('PUT',http://www.mydomain.org/documents/standards/browsers/supportlist)
xmlhttp.send("page content goes here");