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

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

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

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

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

Ответы [ 5 ]

39 голосов
/ 29 декабря 2008

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

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

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

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

Вместо этого более подход RESTful будет с использованием отдельного места для кодирования предпочтительного представления с использованием Accept HTTP-заголовка, который используется для согласования содержимого, когда клиент сообщает серверу, какие типы содержимого он может обработать / process и сервер пытается выполнить запрос клиента. Этот подход является частью 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
<b>Accept: application/xml</b>

Из веб-браузера вы можете запросить любой тип содержимого, используя 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 позволяет запрашивать любое представление, используя HTTP-заголовок Accept.

Ура!
Shonzilla

12 голосов
/ 11 сентября 2010

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

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

8 голосов
/ 17 декабря 2008

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

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

/resources/resource

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

/resources/resource.xml

Затем необходимо выполнить принятую процедуру определения типа контента на стороне сервера.

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

1 голос
/ 25 июля 2018

ModHeader расширение для Google Chrome, также является хорошим вариантом. Вы можете просто установить нужные заголовки и просто ввести URL-адрес в браузере, он автоматически извлечет заголовки из расширения, когда вы нажмете на URL. Единственное, что он будет отправлять заголовки для каждого URL, который вы нажмете, поэтому вы должны отключить или удалить его после использования.

1 голос
/ 17 декабря 2008

Используйте немного JavaScript!

xmlhttp=new XMLHttpRequest();
xmlhttp.open('PUT',http://www.mydomain.org/documents/standards/browsers/supportlist)
xmlhttp.send("page content goes here");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...