Czy Mogę zmienić nagłówki żądania HTTP wysłanego przez przeglądarkę?

Przyglądam się projektowi restful i chciałbym użyć metod HTTP (POST, GET, ...) i nagłówków HTTP w miarę możliwości. Dowiedziałem się już, że metody HTTP PUT i DELETE nie są obsługiwane z przeglądarki.

Teraz chcę uzyskać różne reprezentacje tego samego zasobu i chciałbym to zrobić, zmieniając nagłówek Accept żądania. W zależności od tego nagłówka Accept, serwer może obsługiwać inny widok na tym samym zasobie.

Problem jest to, że nie znalazłem sposobu, aby powiedzieć mojej przeglądarce, aby zmienić ten nagłówek.

Znacznik <a..> ma atrybut type , który może mieć typ mime, wyglądał jak dobry kandydat, ale nagłówek nadal był domyślną przeglądarką (w Firefoksie można go zmienić w about:config za pomocą klucza network.http.accept.default).

Author: user66001, 2008-12-17

5 answers

Nie sądzę, że jest to możliwe, aby zrobić to w sposób, w jaki próbujesz to zrobić.

Wskazanie akceptowanego formatu danych odbywa się zazwyczaj poprzez dodanie rozszerzenia do nazwy zasobu. Tak więc, jeśli masz zasoby takie jak

/resources/resource

I GET /resources/resource zwraca reprezentację HTML, aby wskazać, że chcesz zamiast niej reprezentację XML, możesz użyć następującego wzoru:

/resources/resource.xml

Musisz więc po stronie serwera wykonać akceptowane określenie typu treści.

Lub użyj Javascript, jak sugeruje James.

 9
Author: Milan Novota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-17 15:44:45

Po części nie zgadzam się z sugestią Milana, by umieścić żądaną reprezentację w URI.

Jeśli jest to możliwe, Uri powinnytylko być używane do adresowania zasobów iNie do tunelowania metod HTTP/czasowników. Ostatecznie konkretne działania biznesowe (edycja, blokada itp. jeśli tylko create (POST) lub update (PUT) nie służą celowi, może być osadzone w URI: {]}

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

W przypadku wystąpienia o konkretną reprezentację w URI musiałby zakłócić twój projekt URI w końcu czyniąc go brzydszym, mieszając dwie różne koncepcje odpoczynku w tym samym miejscu (np. URI) i utrudniając ogólne przetwarzanie żądań po stronie serwera. Co sugeruje Milan i wielu robi to samo, w tym Flickr, to jest dokładnie to.

Zamiast tego, bardziej RESTful podejście byłoby za pomocą oddzielnego miejsca do kodowania preferowanej reprezentacji za pomocą Accept nagłówka HTTP, który jest używany do negocjacji zawartości, gdzie klient mówi serwer, którego treść może obsłużyć/przetworzyć i serwer próbuje spełnić żądanie klienta. Podejście to jest częścią standardu HTTP 1.1, zgodnego z oprogramowaniem i obsługiwanego również przez przeglądarki internetowe.

Porównaj to:

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

Do tego:

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

Z przeglądarki internetowej można zażądać dowolnego typu zawartości za pomocą metody setRequestHeader obiektu XMLHttpRequest. Na przykład:

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

Podsumowując: adres, czyli URI zasobu powinien być niezależny od jego metoda representation and XMLHttpRequest.setRequestHeader pozwala na zażądanie dowolnej reprezentacji za pomocą nagłówka HTTP Accept.

Zdrówko!
Shonzilla
 35
Author: Shonzilla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-29 17:35:54

Chciałem zrobić dokładnie to samo (RESTful web service) i natknąłem się na ten dodatek do Firefoksa, który pozwala modyfikować nagłówki accept (właściwie nagłówki żądań) dla żądań. Działa idealnie.

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

 11
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-11 16:01:35

Użyj javascript!

xmlhttp=new XMLHttpRequest();
xmlhttp.open('PUT',http://www.mydomain.org/documents/standards/browsers/supportlist)
xmlhttp.send("page content goes here");
 1
Author: James Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-17 15:36:47

Dobrym rozwiązaniem jest również rozszerzenie ModHeader dla Google Chrome. Możesz po prostu ustawić żądane nagłówki i po prostu wprowadzić adres URL w przeglądarce, automatycznie pobierze nagłówki z rozszerzenia po naciśnięciu adresu url. Jedyną rzeczą jest to, że wyśle nagłówki dla każdego adresu URL, który trafisz, więc musisz go wyłączyć lub usunąć po użyciu.

 0
Author: Jai Prak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 12:22:23