web-dev-qa-db-fra.com

Puis-je changer les en-têtes de la requête HTTP envoyé par le navigateur?

Je recherche un design reposant et voudrais utiliser les méthodes HTTP (POST, GET, ...) et les en-têtes HTTP autant que possible. J'ai déjà découvert que les méthodes HTTP PUT et DELETE ne sont pas prises en charge par le navigateur.

Maintenant, je cherche à obtenir différentes représentations de la même ressource et j'aimerais le faire en modifiant l'en-tête Accept de la demande. En fonction de cet en-tête Accept, le serveur peut afficher une vue différente sur la même ressource.

Le problème est que je n'ai pas trouvé le moyen de dire à mon navigateur de changer cet en-tête. 

La balise <a..> a un attribut type , qui peut avoir un type mime, ressemble à un bon candidat mais l’en-tête est toujours le navigateur par défaut (dans Firefox, il peut être modifié dans about:config avec la touche network.http.accept.default).

60
JeroenWyseur

Je ne pense pas qu'il soit possible de le faire de la manière que vous essayez de le faire.

L'indication du format de données accepté est généralement effectuée en ajoutant l'extension au nom de la ressource. Donc, si vous avez des ressources comme

/resources/resource

et GET /resources/resource renvoie sa représentation HTML. Pour indiquer que vous souhaitez utiliser sa représentation XML, vous pouvez utiliser le modèle suivant:

/resources/resource.xml

Vous devez alors effectuer la magie de détermination du type de contenu accepté côté serveur.

Ou utilisez Javascript comme le suggère James.

9
Milan Novota

Je suis en partie en désaccord avec la suggestion de Milan d'intégrer la représentation demandée dans l'URI.

Si possible, les URI devraient seulement être utilisé pour adresser des ressources et ne pas pour le tunneling des méthodes/verbes HTTP. Éventuellement, une action commerciale spécifique (édition, verrouillage, etc.) pourrait être intégrée à l'URI si la création (POST) ou la mise à jour (PUT) ne suffisait pas:

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

Dans le cas où vous demanderez une représentation particulière dans l’URI, vous devrez perturber votre conception d’URI, ce qui le rendra encore plus laid, mélangeant deux concepts REST distincts au même endroit (c.-à-d., URI) et rendant plus difficile le traitement générique des demandes sur le serveur. du côté serveur. Ce que Milan suggère et que beaucoup font de même, incl. Flickr, c'est exactement ça.

Au lieu de cela, une approche plus reposante serait en utilisant un endroit séparé pour encoder la représentation préférée en utilisant Accept en-tête HTTP utilisé pour la négociation de contenu, où le client indique au serveur les types de contenu qu'il peut gérer/traiter et le serveur tente de répondre à la demande du client. Cette approche fait partie de HTTP 1.1 standard , est compatible avec les logiciels et est également prise en charge par les navigateurs Web.

Comparez ceci:

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

pour ça:

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

Depuis un navigateur Web, vous pouvez demander n’importe quel type de contenu en utilisant la méthode setRequestHeader de l’objet XMLHttpRequest. Par exemple:

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

Pour résumer: l'adresse, c'est-à-dire l'URI d'une ressource, doit être indépendante de sa représentation et la méthode XMLHttpRequest.setRequestHeader vous permet de demander toute représentation à l'aide de l'en-tête HTTP Accept.

À votre santé!
Shonzilla

37
Shonzilla

Je cherchais à faire exactement la même chose (service Web RESTful) et je suis tombé sur cet addon firefox, qui vous permet de modifier les en-têtes d'acceptation (en fait, tous les en-têtes de demande) pour les demandes. Ça fonctionne parfaitement.

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

12
Chris

Utilisez du javascript!

 xmlhttp = new XMLHttpRequest (); 
 xmlhttp.open ('PUT', http: //www.mydomain.org/documents/standards/browsers/supportlist) 
 xmlhttp.send ("Le contenu de la page va ici");
1
James Anderson

ModHeader extension pour Google Chrome, est également une bonne option. Vous pouvez simplement définir les en-têtes de votre choix et entrer simplement l'URL dans le navigateur. Les en-têtes de l'extension seront automatiquement extraits lorsque vous cliquez sur l'URL. La seule chose à faire est qu’il va envoyer des en-têtes pour chaque URL que vous allez taper. Vous devez donc le désactiver ou le supprimer après utilisation.

0
Jai Prak