Les méthodes PUT, DELETE, HEAD, etc. sont-elles disponibles dans la plupart des navigateurs Web?

608

J'ai vu quelques questions ici comme Comment déboguer les services RESTful , qui mentionne:

Malheureusement, ce même navigateur ne me permettra pas de tester HTTP PUT, DELETE et, dans une certaine mesure, même HTTP POST.

J'ai également entendu dire que les navigateurs ne prennent en charge que GET et POST, à partir d'autres sources telles que:

Cependant, quelques tests rapides dans Firefox montrent que l'envoi PUTet les DELETEdemandes fonctionnent comme prévu - le se XMLHttpRequesttermine avec succès et la demande apparaît dans les journaux du serveur avec la bonne méthode. Y a-t-il un aspect qui me manque, comme la compatibilité entre les navigateurs ou des limitations non évidentes?

John Millikin
la source
1
Ce n'est pas seulement le client dont vous devez vous soucier, de nombreux frameworks côté serveur ne prennent en charge que GET et POST.
derby
7
John, pour quelle raison vous ne voulez pas la balise REST?
John Saunders
11
Bien que les personnes qui lisent ceci soient susceptibles d'enquêter sur les API RESTful.
djjeck
Non, tous les navigateurs ne prennent pas en charge les méthodes PUT / DELETE et toutes les technologies côté serveur ne prennent pas en charge PUT / DELETE. Seul le navigateur pris en charge par HTML 5 prend en charge PUT / DELETE.
Jani Devang

Réponses:

463

Non. La spécification HTML 5 mentionne:

Les attributs de contenu de méthode et de méthode de formulaire sont des attributs énumérés avec les mots-clés et états suivants:

Le mot clé get , mappant à l'état GET, indiquant la méthode HTTP GET. La méthode GET doit uniquement demander et récupérer des données et ne doit avoir aucun autre effet.

Le mot clé post , mappant à l'état POST, indiquant la méthode HTTP POST. La méthode POST demande que le serveur accepte que les données du formulaire soumis soient traitées, ce qui peut entraîner l'ajout d'un élément à une base de données, la création d'une nouvelle ressource de page Web, la mise à jour de la page existante ou tous les résultats mentionnés .

La boîte de dialogue de mot-clé , mappée à la boîte de dialogue d'état, indiquant que la soumission du formulaire est destinée à fermer la boîte de dialogue dans laquelle le formulaire se trouve, le cas échéant, et sinon à ne pas envoyer.

La valeur par défaut non valide pour ces attributs est l'état GET

C'est-à-dire que les formulaires HTML ne prennent en charge que GET et POST en tant que méthodes de requête HTTP. Une solution de contournement pour cela consiste à tunneler d'autres méthodes via POST en utilisant un champ de formulaire masqué qui est lu par le serveur et la demande envoyée en conséquence.

Cependant, GET , POST , PUT et DELETE sont pris en charge par les implémentations de XMLHttpRequest (c'est-à-dire les appels AJAX) dans tous les principaux navigateurs Web (IE, Firefox, Safari, Chrome, Opera).

Matthew Murdoch
la source
170
Non, je veux vraiment dire HTML (je parle des capacités des formulaires HTML bien que cela ne soit pas clair dans le texte - je vais le modifier)
Matthew Murdoch
6
@Matthew: cela signifie-t-il que si j'utilise IE6 ou IE7, avec les éléments suivants: - <form .. method = "PUT"> ... </form> cela ne fonctionnera pas car PUT n'est pas valide pour HTML 4?
Pure.Krome
6
@ Pure.Krome (seulement 14 mois plus tard) Non, vous ne pouvez pas faire <form method = "put"> ou <form method = "delete"> sous la spécification HTML 4.01. Seuls GET et POST sont pris en charge par IE8, Chrome3 ou FF3.5.
Jarrett Meyer
23
@porneL @Alan HTML5 les a ajoutés, puis les a supprimés. Actuellement, seuls GET et POST sont autorisés. goo.gl/8EuZk
Adam Lassek
13
@porneL HTML5 les a ajoutés, puis les a supprimés, et maintenant le bogue est rouvert. Fait intéressant, j'ai vu des documents qui les contiennent encore. Voici le bug si vous voulez suivre à la maison: w3.org/Bugs/Public/show_bug.cgi?id=10671
Emil Lerch
79

Les formulaires HTML prennent en charge GET et POST. (HTML5 à un moment donné a ajouté PUT / DELETE, mais ceux-ci ont été supprimés.)

XMLHttpRequest prend en charge toutes les méthodes, y compris CHICKEN, bien que certains noms de méthode soient mis en correspondance avec la casse (les méthodes sont sensibles à la casse par HTTP) et certains noms de méthode ne sont pas du tout pris en charge pour des raisons de sécurité (par exemple CONNECT).

Les navigateurs convergent lentement sur les règles spécifiées par XMLHttpRequest, mais comme l'autre commentaire l'a souligné, il existe encore quelques différences.

Anne
la source
5
Le dernier brouillon HTML5 semble avoir abandonné le support PUT et DELETE: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov
3
Un brouillon a été proposé pour les récupérer: amundsen.com/examples/put-delete-forms
Joost Baaij
26
POULET? L'oiseau? Je suppose que vous voulez dire CHECKIN. C'est un échange de voyelles drôle.
JayC
52
Non, je voulais dire POULET, illustrant que cela peut être ce que vous voulez. Je suis d'accord pour dire que l'échange de voyelles est drôle :-)
Anne
6
Pour ceux aussi déconcertés que moi avec cette entreprise de POULET .... w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm
n0nag0n
43

XMLHttpRequest est un objet standard dans le modèle d'objet JavaScript.

Selon Wikipedia, XMLHttpRequestest apparu pour la première fois dans Internet Explorer 5 en tant qu'objet ActiveX, mais a depuis été transformé en standard et a été inclus pour être utilisé dans JavaScript dans la famille Mozilla depuis 1.0, Apple Safari 1.2, Opera 7.60-p1 et IE 7.0 .

La open()méthode de l'objet prend la méthode HTTP comme argument - et il est spécifié que la prise de toute méthode HTTP valide (voir le numéro de l' article 5 de la liaison) - y compris GET, POST, HEAD, PUTet DELETE, comme spécifié par le RFC 2616 .

En guise de remarque, IE 7–8 n'autorise que les méthodes HTTP suivantes: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL" , "COPIER", "VERROUILLER", "DÉVERROUILLER" et "OPTIONS" .

Vihung
la source
7
J'espérais voir quelques documents pour une lecture plus approfondie, je n'ai pas dit que je ne vous croyais pas. Les liens sur wikipedia sont plutôt sympas en fait. Merci
naugtur
19

_method solution de contournement de champ caché

Utilisé dans Rails et pourrait être adapté à n'importe quel framework:

  • ajoutez un _methodparamètre caché à tout formulaire qui n'est pas GET ou POST:

    <input type="hidden" name="_method" value="DELETE">

    Cela peut être fait automatiquement dans les frameworks via la méthode d'aide à la création HTML (par exemple Rails form_tag)

  • corriger la méthode de formulaire réelle à POST ( <form method="post")

  • processus _methodsur le serveur et faire exactement comme si cette méthode avait été envoyée au lieu du POST réel

Justification / historique des raisons pour lesquelles cela n'est pas possible: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
Santilli, salut mec, ça fait longtemps que tu n'as pas proposé cette solution, et depuis que je suis débutant en développement web j'ai une question à laquelle j'espère que tu répondras. Donc, vous avez dit que "traite _méthode sur le serveur et fait exactement comme si cette méthode avait été envoyée au lieu du POST réel", vous vouliez dire que si la méthode cachée avec PUT (ou DELETE) était mise dans la vue, cela signifierait en fait PUT (ou SUPPRIMER) demande à droite? si oui, alors pourquoi utiliser la méthode POST au début et ensuite utiliser PUT ou DELETE caché. Quel est le lien entre POST et PUT (ou DELETE) :)
Mirich
1
@Mirich, le formulaire ne prend en charge que POST. Nous envoyons donc POST avec des données supplémentaires, ce que le serveur connaît signifie: ah, je devrais traiter cela comme un PUT.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Merci Ciro pour votre attention et votre réponse, alors je peux considérer ce scénario comme ceci: le POST est une chose universelle qui contient le POST, le PUT, le PATCH et le DELETE en lui-même et si vous utilisez le POST au début sans le masquer, cela voudrait dire réel PUBLIER. Mais si vous utilisez POST avec caché (PUT ou DELETE), vous laissez le serveur savoir que vous voulez utiliser PUT ou DELETE qui sont à l'intérieur de POST comme ses enfants à l'intérieur Je connais une analogie un peu étrange, mais est-ce correct? :)
Mirich
1
@Mirich yup, je pense que vous avez compris l'idée.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
désolé Ciro juste la dernière chose, je me demande pourquoi PUT et DELETE ont été supprimés de HTML5 car cela ne serait pas mieux si vous pouviez simplement utiliser PUT ou DELETE au début de la balise de formulaire et ne pas utiliser caché. Veuillez expliquer brièvement et clairement quelle était la raison réelle de la suppression de PUT et DELETE. Merci d'avance :)
Mirich
15

Je crois que ces commentaires se réfèrent spécifiquement aux navigateurs, c'est-à-dire, en cliquant sur des liens et en soumettant des formulaires, non XMLHttpRequest. XMLHttpRequestest juste un client personnalisé que vous avez écrit en JavaScript et qui utilise le navigateur comme runtime.

MISE À JOUR: Pour clarifier, je ne voulais pas (bien que j'aie écrit) que vous avez écrit XMLHttpRequest; Je voulais dire que vous avez écrit le code qui utilise XMLHttpRequest. Les navigateurs ne prennent pas en charge nativement XMLHttpRequest. XMLHttpRequestprovient du moteur d'exécution JavaScript, qui peut être hébergé par un navigateur, bien qu'il ne soit pas obligatoire de le faire (voir Rhino ). C'est pourquoi les gens disent que les navigateurs ne prennent pas en charge PUTet DELETE— parce que c'est en fait JavaScript qui les prend en charge.

Hank Gay
la source
XMLHttpRequest est un objet standard dans le modèle d'objet JavaScript.
Jacob Krall
9
@Jacob True, mais différents navigateurs ont des moteurs JavaScript différents. Il est toujours utile de savoir lesquels prennent en charge PUT.
senfo
1
it's actually JavaScript that is supporting them. Pas vraiment vrai. XMLHttpRequestest un «hôte-objet», ce qui signifie que c'est un objet qui expose les fonctionnalités de l'hôte au code Javascript. Cela ne fait pas partie de JS lui-même.
Stijn de Witt
9

YES , PUT, DELETE, HEAD, etc. Les méthodes HTTP sont disponibles dans tous les navigateurs modernes.

Pour être compatible avec XMLHttpRequest, les navigateurs de niveau 2 doivent prendre en charge ces méthodes. Pour vérifier quels navigateurs prennent en charge XMLHttpRequest niveau 2, je recommande CanIUse:

http://caniuse.com/#feat=xhr2

Seul Opera Mini manque de support atm (juli '15), mais Opera Mini manque de support pour tout. :)

Stijn de Witt
la source
7

Juste pour ajouter - Safari 2 et les versions antérieures ne prenaient certainement pas en charge PUT et DELETE. J'ai l'impression que 3 l'ont fait, mais je ne l'ai plus à tester. Safari 4 prend définitivement en charge PUT et DELETE.

jharlap
la source
5
Quelqu'un peut-il confirmer quelle version de Safari a pris en charge PUT et DELETE?
mjs
1
Quelqu'un peut-il préciser si tous les navigateurs prennent en charge MAINTENANT PUT & DELETE - et à peu près depuis combien de temps cela est disponible? En notant l'exemple "POULET", cela signifie-t-il que c'est entièrement au serveur d'interpréter quelle méthode est utilisée ET que JavaScript ne restreint pas le type de méthode ...?
Cody