En regardant autour de moi, je ne peux pas nommer une seule application Web (pas un service Web) qui utilise autre chose que des requêtes GET et POST. Y a-t-il une raison spécifique à cela? Certains navigateurs (ou serveurs) ne prennent-ils pas en charge d'autres types de demandes? Ou est-ce seulement pour des raisons historiques? Je voudrais utiliser les requêtes PUT et DELETE pour rendre ma vie un peu plus facile côté serveur, mais je suis réticent à le faire parce que personne d'autre ne le fait.Y a-t-il une raison pour ne pas utiliser HTTP PUT et DELETE dans une application Web?
Répondre
En fait, un nombre important de personnes utilise PUT et DELETE, principalement pour les API non-navigateur. Quelques exemples sont le protocole de publication Atom et les API Google Data:
Au-delà, vous ne voyez pas PUT/DELETE dans l'usage courant, car la plupart des navigateurs ne le font pas support PUT et DELETE à travers les formulaires. HTML5 semble fixer ceci:
La façon dont cela fonctionne pour les applications de navigateur est: les gens conçoivent des applications RESTful avec PUT et DELETE à l'esprit, alors ces demandes « tunnel » à travers POSTs de la navigateur. Par exemple, voir cette question SO sur la façon dont Ruby on Rails accomplit cela en utilisant des champs cachés:
Donc, vous ne seriez pas sur votre propre conception de votre application avec le plus grand ensemble de HTTP les verbes en tête. En passant, si vous êtes curieux de savoir pourquoi les messages de formulaire basés sur un navigateur ne contiennent pas de PUT/DELETE, il n'y a pas vraiment de bonne raison technique. La lecture autour de ce fil sur le reste-discuss liste de diffusion, en particulier les commentaires de Roy Fielding, est intéressant pour un certain contexte:
EDIT: Il y a des commentaires sur si les bibliothèques AJAX prennent en charge toutes les méthodes . Cela revient à l'implémentation du navigateur XMLHttpRequest. Je pensais que quelqu'un pourrait trouver ce lien pratique, qui teste votre navigateur pour voir à quel point l'objet HttpRequest est compatible avec diverses options HTTP.
Malheureusement, je ne sais pas d'une référence qui recueille ces résultats.
Certains serveurs proxy avec des stratégies de sécurité strictes peuvent les supprimer. J'utilise PUT et DELETE de toute façon.
J'ai lu que certains navigateurs ne prennent pas en charge d'autres méthodes HTTP correctement, bien que je ne puisse pas donner de détails. Rails, en particulier, va compresser vos formulaires avec un paramètre de méthode pour le paramétrer explicitement même si le navigateur ne supporte pas ces méthodes. Cela semble être une précaution raisonnable si vous faites cela.
Tout simplement, la HTML 4.01 form
element ne permet que les valeurs « POST
» et « GET
» dans son method
attribut
Hmm, ça aurait du sens ... Mais ça ne s'applique pas aux requêtes Ajax, non? Je peux utiliser la méthode que je veux? –
Si le navigateur est construit selon la spécification HTML 4.01, il ne comprendra rien d'autre que la spécification. C'est tout ce que vous pouvez supposer qu'un navigateur peut faire – Gareth
Les navigateurs sont généralement construits avec plus qu'une simple spécification HTML - JavaScript ne fait pas partie de HTML 4.01. – aehlke
Cela dépend de votre navigateur et de la bibliothèque Ajax. Par exemple, jQuery prend en charge toutes les méthodes HTTP, même si le navigateur ne le fait pas. Voir par exemple le jQuery "ajax" documentation sur l'attribut "type".
L'infrastructure Java Restlet vous permet de mettre en tunnel des requêtes PUT et DELETE via des opérations HTML POST. Pour ce faire, vous ajoutez juste method = mettre ou méthode = supprimer votre chaîne de requête de l'URI, par exemple:
http://www.example.com/user=xyz?method=delete ...
C'est le même que Ruby on approche de Rails (tel que décrit par @ars ci-dessus).
De la documentation de jQuery: "D'autres méthodes de requête HTTP, telles que PUT et DELETE, peuvent également être utilisées ici, mais elles ne sont pas supportées par tous les navigateurs." Donc vous avez tort à ce sujet. –
Je dis utiliser toutes les fonctionnalités de HTTP, les navigateurs soient damnés, lol. Peut-être que cela va inspirer une utilisation plus complète et correcte du protocole HTTP. Il se passe plus de choses sur le net que juste des POST et GET. À propos des implémentations de navigateur temporel reflétées cela.
Haha, je souhaite. Malheureusement, je ne pense pas que faire de mon application web * ne fonctionne pas * fera tout sauf mettre en colère mes utilisateurs. :) –
hmmm ... oui, je suppose que vous avez un point. Eh bien, c'était une bonne idée. – codemonkey
mais attendez ... cela fonctionne pour Microsoft ... – codemonkey
Personnellement, je ne vois vraiment pas l'utilité d'utiliser PUT ou DELETE dans une application Web. Toutes les opérations effectuées par une application sont en lecture ou en écriture, autrement dit en entrée. Pourquoi avez-vous besoin de distinguer la nature de l'opération dans l'en-tête de la requête HTTP? Je pourrais faire des appels ajax avec le même url de formulaire/objet/object_id et faire plusieurs opérations comme supprimer, mettre à jour, obtenir la valeur ou créer. Juste en regardant l'URL, je n'ai aucune idée de laquelle il s'agit. En utilisant GET et POST seulement, mes urls seront:
/objet/id/supprimer
/objet/id/créer
/objet/id/mise à jour
/objet/id -> GET implicite
etc.
sur la base de mon expérience limitée, cela est beaucoup plus propre que les types de demande d'en-tête cachés dans de nombreux cas. Je ne dis pas qu'on ne devrait jamais utiliser PUT ou DELETE, en disant simplement, utilisez-les seulement si absolument nécessaire. Reportez-vous à "RESTful Web API" de Leonard Richardson pour en savoir plus sur différents cas d'utilisation et conventions concernant les méthodes de requête HTTP dans une API web RESTful.
Devinez quoi? Dans la dernière version (19 octobre 2010), le support PUT/DELETE en HTML5 semble être supprimé. http://www.w3.org/TR/html5/forms.html#form-submission-0 –
@Xie: Recherche intéressante. Ça me semble contre-productif ... –