Kann ich die Header der vom Browser gesendeten HTTP-Anfrage ändern?

70

Ich suche in einen erholsamen Design und möchte die HTTP - Methoden ( POST, GET, ...) und HTTP - Header so viel wie möglich. Ich habe bereits herausgefunden, dass die HTTP-Methoden PUTund DELETEvom Browser nicht unterstützt werden.

Jetzt suche ich nach verschiedenen Darstellungen derselben Ressource und möchte dies tun, indem ich den AcceptHeader der Anfrage ändere. Abhängig von diesem AcceptHeader kann der Server eine andere Ansicht für dieselbe Ressource bereitstellen.

Das Problem ist, dass ich keine Möglichkeit gefunden habe, meinen Browser anzuweisen, diesen Header zu ändern.

Das <a..>Tag hat ein Typattribut , das einen MIME-Typ haben kann. Es sah aus wie ein guter Kandidat, aber der Header war immer noch die Standardeinstellung des Browsers (in Firefox kann er about:configmit dem network.http.accept.defaultSchlüssel geändert werden ).

Jeroen Wyseur
quelle
Ich höre dich. Es wäre großartig, einige Header fest zu codieren und in Ihrem Browser-Tab einfach URLs zu besuchen, um Ihren Code zu testen. Ich möchte keine vollständige separate Benutzeroberfläche wie die Chrome Postman-App.
Sridhar Sarnobat
1
Diese Erweiterung funktioniert ganz gut für mich: chrome.google.com/webstore/detail/modify-headers-for-google/…
Sridhar Sarnobat

Antworten:

8

Ich denke nicht, dass es möglich ist, es so zu machen, wie Sie es versuchen.

Die Angabe des akzeptierten Datenformats erfolgt normalerweise durch Hinzufügen der Erweiterung zum Ressourcennamen. Also, wenn Sie Ressourcen wie haben

/resources/resource

und GET /resources/resourcegibt die HTML-Darstellung zurück. Um anzuzeigen, dass Sie stattdessen die XML-Darstellung wünschen, können Sie das folgende Muster verwenden:

/resources/resource.xml

Sie müssen dann die Magie zur Bestimmung des akzeptierten Inhaltstyps auf der Serverseite ausführen.

Oder verwenden Sie Javascript, wie James vorschlägt.

Milan Novota
quelle
42

Ich würde dem Vorschlag Mailands, die angeforderte Vertretung in die URI einzubetten, teilweise nicht zustimmen.

Wenn möglich, sollten URIs nur zum Adressieren von Ressourcen und nicht zum Tunneln von HTTP-Methoden / Verben verwendet werden. Eventuell können bestimmte Geschäftsaktionen (Bearbeiten, Sperren usw.) in den URI eingebettet werden, wenn das Erstellen (POST) oder Aktualisieren (PUT) allein nicht den Zweck erfüllt:

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

Wenn Sie eine bestimmte Darstellung in URI anfordern, müssen Sie Ihr URI-Design unterbrechen, um es schließlich hässlicher zu machen, zwei unterschiedliche REST-Konzepte an derselben Stelle (dh URI) zu mischen und die generische Verarbeitung von Anforderungen auf der Serverseite zu erschweren. Was Milan vorschlägt und viele das Gleiche tun, inkl. Flickr ist genau das.

Stattdessen würde ein REST-Ansatz einen separaten Ort zum Codieren der bevorzugten Darstellung verwenden, indem ein AcceptHTTP-Header verwendet wird, der für die Inhaltsverhandlung verwendet wird, wobei der Client dem Server mitteilt, welche Inhaltstypen er verarbeiten kann, und der Server versucht, die Anforderung des Clients zu erfüllen. Dieser Ansatz ist Teil des HTTP 1.1-Standards , Software-kompatibel und wird auch von Webbrowsern unterstützt.

Vergleichen Sie dies:

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

dazu:

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

In einem Webbrowser können Sie jeden Inhaltstyp mithilfe setRequestHeaderder XMLHttpRequestObjektmethode anfordern . Zum Beispiel:

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

Um es zusammenzufassen: Die Adresse, dh der URI einer Ressource, sollte unabhängig von ihrer Darstellung sein, und mit dieser XMLHttpRequest.setRequestHeaderMethode können Sie jede Darstellung über den AcceptHTTP-Header anfordern .

Prost!
Shonzilla

Shonzilla
quelle
3
Ein Nachteil ist, dass es unmöglich ist, die XMLRessource (Hyper-) direkt zu verknüpfen . Für einige Anwendungen ist dies möglicherweise erforderlich. Zum Beispiel in OpenCPU, Grafiken können in abgerufen werden PNG, PDFoder SVGFormat. Es ist jedoch unmöglich, das PNGBild in eine HTML-Seite einzubetten, wenn Acceptzum Abrufen ein Header erforderlich ist.
Jeroen
2
@Jeroen: Wenn der Browser SVG besser als PNG unterstützt, sollte er einen Accept-Header mit SVG senden, der höher als PNG gewichtet ist, und mit SVG antworten. Bei Browsern, die SVG nicht unterstützen, enthält der Accept-Header keine Anwendung / svg + xml, sodass der Server das PNG zurücksendet. Wenn Sie aus irgendeinem Grund der Ansicht sind, dass die PNG-Version eine höhere Wiedergabetreue aufweist als die PDF / SVG-Version (z. B. ein Foto mit Vektorverfolgung), sollte der Server ein höheres Gewicht für die PNG-Version festlegen, damit sie zurückgegeben wird, wenn der Browser alle unterstützt drei gleichermaßen. So soll die Aushandlung von Inhalten funktionieren.
Lie Ryan
Diese Antwort hat mich fast überzeugt, aber später habe ich diese Antwort zu einem ähnlichen Thema gesehen und stimme dem eher zu. In vielen (oder den meisten) Fällen sind die Formatinformationen tatsächlich Teil der Ressourcenidentität und können (oder sollten) in den URI aufgenommen werden, um unerwartete Ergebnisse nach dem Teilen eines solchen URI zwischen verschiedenen Clients zu vermeiden. In diesen Fällen sollte der Accepts-Header eine untergeordnete Rolle spielen. Es ist wichtig, diese Fälle zu unterscheiden.
ps_ttf
12

Ich wollte genau das Gleiche tun (RESTful-Webdienst) und bin auf dieses Firefox-Addon gestoßen, mit dem Sie die Accept-Header (eigentlich alle Anforderungsheader) für Anforderungen ändern können. Es funktioniert perfekt.

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

Chris
quelle
Chris, was ist, wenn die Erweiterung einen Fehler aufweist oder die Erweiterung nicht mit der gewünschten Browserversion funktioniert oder wenn die Entwickler die Aktualisierung der Erweiterungen einfach eingestellt haben? Ich sehe dies für die meisten, wenn nicht alle Firefox-Erweiterungen, mit denen Sie Anforderungsheader hinzufügen / ändern können. Add-Ons sind möglicherweise einfach und machen Sie produktiv, funktionieren jedoch nicht, wenn Probleme mit den Erweiterungen auftreten.
MasterJoe
Firefox & Chrome Addons sind nicht mehr aktiv
JRichardsz
3

Die ModHeader- Erweiterung für Google Chrome ist ebenfalls eine gute Option. Sie können einfach die gewünschten Header festlegen und die URL im Browser eingeben. Die Header werden automatisch aus der Erweiterung übernommen, wenn Sie auf die URL klicken. Das einzige ist, dass es Header für jede URL sendet, auf die Sie klicken, sodass Sie sie nach der Verwendung deaktivieren oder löschen müssen.

Jai Prak
quelle
arbeitete beim ersten Versuch !! Vielen Dank!!
JRichardsz
1

Verwenden Sie etwas Javascript!

xmlhttp = new XMLHttpRequest ();
xmlhttp.open ('PUT', http: //www.mydomain.org/documents/standards/browsers/supportlist)
xmlhttp.send ("Seiteninhalt geht hier");
James Anderson
quelle
Vielen Dank für die schnelle Antwort, aber die Frage betrifft das Ändern der Standard-Header, die in der HTTP-Anfrage gesendet werden. Insbesondere der Accept-Header.
Jeroen Wyseur
Nebenbei bemerkt sagt die Spezifikation ( w3.org/TR/2006/WD-XMLHttpRequest-20060405/#dfn-open ) nichts über PUT und DELETE aus, siehe den redaktionellen Hinweis. Auch gibt es in diesem Fall keine Übermittlung, was eine ajaxifizierte Benutzeroberfläche schön macht, aber sonst nicht.
Jeroen Wyseur