Могу ли я изменить заголовки 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");