it-swarm.com.de

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

Ich schaue mir ein ruhiges Design an und möchte möglichst die HTTP-Methoden (POST, GET, ...) und HTTP-Header verwenden. Ich habe bereits herausgefunden, dass die HTTP-Methoden PUT und DELETE vom Browser nicht unterstützt werden.

Nun möchte ich verschiedene Repräsentationen derselben Ressource erhalten und möchte dies durch Ändern des Accept-Headers der Anforderung tun. Abhängig von diesem Accept-Header kann der Server eine andere Ansicht für dieselbe Ressource bereitstellen.

Das Problem ist, dass ich keinen Weg gefunden habe, meinem Browser mitzuteilen, dass er diesen Header ändern soll. 

Das <a..>-Tag hat ein Attribut type , das einen Mime-Typ haben kann, sah aus wie ein guter Kandidat, aber der Header war immer noch der Standard des Browsers (in Firefox kann er in about:config mit der network.http.accept.default-Taste geändert werden).

60
JeroenWyseur

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

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

/resources/resource

und GET /resources/resource gibt seine HTML-Darstellung zurück, um anzuzeigen, dass stattdessen seine XML-Darstellung verwendet werden soll, können Sie das folgende Muster verwenden:

/resources/resource.xml

Sie müssen dann die akzeptierte Bestimmung des Inhaltstyps auf der Serverseite durchführen.

Oder benutze Javascript, wie James vorschlägt.

9
Milan Novota

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

Wenn immer möglich, sollten URIs nur für die Adressierung von Ressourcen und verwendet werden nicht zum Tunneln von HTTP-Methoden/Verben. Eventuell kann eine bestimmte Geschäftsaktion (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 Repräsentation in URI anfordern, müssen Sie Ihren URI-Entwurf unterbrechen und schließlich hässlicher machen, indem Sie zwei unterschiedliche REST -Konzepte an derselben Stelle (dh URI) mischen und die generische Verarbeitung von Anforderungen auf dem Server erschweren serverseitig. Was Milan vorschlägt und viele machen dasselbe, inkl. Flickr ist genau das.

Stattdessen wäre ein RESTful-Ansatz möglich verwenden einer separaten Stelle zum Kodieren der bevorzugten Darstellung mit Accept einem HTTP-Header, der für die Inhaltsverhandlung verwendet wird, wobei der Client dem Server mitteilt, welche Inhaltstypen er verarbeiten kann, und der Server versucht, die Clientanforderung zu erfüllen. Dieser Ansatz ist Teil des HTTP 1.1-Standards , der Software-kompatibel ist und auch von Webbrowsern unterstützt wird.

Vergleichen Sie dies:

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

zu diesem:

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

In einem Webbrowser können Sie jeden Inhaltstyp mithilfe der setRequestHeader-Methode des XMLHttpRequest-Objekts anfordern. Zum Beispiel:

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

Um es zusammenzufassen: Die Adresse, d. H. Die URI einer Ressource sollte unabhängig von ihrer Darstellung sein, und mit der XMLHttpRequest.setRequestHeader-Methode können Sie eine beliebige Darstellung unter Verwendung des Accept-HTTP-Headers anfordern.

Prost!
Shonzilla

37
Shonzilla

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

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

12
Chris

Verwenden Sie etwas Javascript!

 xmlhttp = new XMLHttpRequest (); 
 xmlhttp.open ('PUT', http://www.mydomain.org/documents/standards/browsers/supportlist) Hier");
1
James Anderson

ModHeader Erweiterung für Google Chrome ist auch eine gute Option. Sie können einfach die gewünschten Header festlegen und die URL einfach in den Browser eingeben. Die URL wird automatisch von der Erweiterung übernommen, wenn Sie auf die URL klicken. Das einzige ist, es werden Header für jede URL gesendet, die Sie treffen werden, so dass Sie sie nach der Verwendung deaktivieren oder löschen müssen.

0
Jai Prak