Os métodos PUT, DELETE, HEAD, etc estão disponíveis na maioria dos navegadores da web?

608

Eu já vi algumas perguntas por aqui, como Como depurar serviços RESTful , que menciona:

Infelizmente, o mesmo navegador não me permite testar HTTP PUT, DELETE e, até certo ponto, até HTTP POST.

Também ouvi dizer que os navegadores suportam apenas GET e POST, de algumas outras fontes, como:

No entanto, alguns testes rápidos no Firefox mostram que o envio PUTe as DELETEsolicitações funcionam conforme o esperado - a XMLHttpRequestconclusão é bem-sucedida e a solicitação é exibida nos logs do servidor com o método correto. Há algum aspecto disso ausente, como compatibilidade entre navegadores ou limitações não óbvias?

John Millikin
fonte
1
Não é apenas com o cliente que você precisa se preocupar; muitas estruturas do lado do servidor suportam apenas GET e POST.
Derby
7
John, algum motivo para você não querer a tag REST?
John Saunders
11
Embora as pessoas que leem isso provavelmente estejam investigando APIs RESTful.
djjeck
Não, todo navegador não suporta métodos PUT / DELETE e nem todas as tecnologias do lado do servidor não suportam PUT / DELETE. Somente o navegador compatível com HTML 5 suporta PUT / DELETE.
Jani Devang

Respostas:

463

Não. A especificação do HTML 5 menciona:

Os atributos de conteúdo do método e do método da forma são atributos enumerados com as seguintes palavras-chave e estados:

A palavra-chave get , mapeada para o estado GET, indicando o método HTTP GET. O método GET deve solicitar e recuperar dados apenas e não deve ter outro efeito.

A postagem da palavra-chave , mapeada para o estado POST, indicando o método HTTP POST. O método POST solicita que o servidor aceite os dados do formulário enviado para serem processados, o que pode resultar na adição de um item ao banco de dados, na criação de um novo recurso de página da web, na atualização da página existente ou em todos os resultados mencionados. .

O diálogo de palavra-chave , mapeado para o diálogo de estado, indicando que o envio do formulário se destina a fechar a caixa de diálogo na qual o formulário se encontra, se houver, e não enviar.

O valor inválido padrão para esses atributos é o estado GET

Ou seja, os formulários HTML suportam apenas GET e POST como métodos de solicitação HTTP. Uma solução alternativa para isso é encapsular outros métodos através do POST usando um campo de formulário oculto que é lido pelo servidor e a solicitação enviada de acordo.

No entanto, GET , POST , PUT e DELETE são suportados pelas implementações do XMLHttpRequest (chamadas AJAX) em todos os principais navegadores da Web (IE, Firefox, Safari, Chrome, Opera).

Matthew Murdoch
fonte
170
Não, eu HTML definitivamente média (eu estou falando sobre as capacidades de formulários HTML embora isso possa não ser claro no texto - eu vou editá-lo)
Matthew Murdoch
6
@ Matthew: isso significa que se eu usar o IE6 ou IE7, com o seguinte: - <form .. method = "PUT"> ... </form> não funcionará porque PUT não é válido para HTML 4?
Pure.Krome 2/08/08
6
@ Pure.Krome (apenas 14 meses depois) Não, você não pode fazer <form method = "put"> ou <form method = "delete"> nas especificações do HTML 4.01. Apenas GET e POST são suportados pelo IE8, Chrome3 ou FF3.5.
Jarrett Meyer 14/01
23
O @porneL @Alan HTML5 os adicionou e os removeu. Atualmente, apenas GET e POST são permitidos. goo.gl/8EuZk
Adam Lassek
13
O @porneL HTML5 os adicionou, removeu e agora o bug é reaberto. Curiosamente, eu vi alguma documentação que ainda os possui lá. Aqui está o bug se você quiser acompanhar em casa: w3.org/Bugs/Public/show_bug.cgi?id=10671
Emil Lerch
79

Os formulários HTML suportam GET e POST. (Em algum momento, o HTML5 adicionou PUT / DELETE, mas eles foram descartados.)

XMLHttpRequest suporta todos os métodos, incluindo CHICKEN, embora alguns nomes de métodos sejam comparados entre maiúsculas e minúsculas (os métodos diferenciam maiúsculas de minúsculas por HTTP) e alguns nomes de métodos não são suportados por razões de segurança (por exemplo, CONNECT).

Os navegadores estão lentamente convergindo para as regras especificadas pelo XMLHttpRequest, mas, como o outro comentário apontou, ainda existem algumas diferenças.

Anne
fonte
5
O rascunho mais recente do HTML5 parece ter descartado o suporte a PUT e DELETE: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov
3
Foi proposto um rascunho para recuperá-los: amundsen.com/examples/put-delete-forms #
Joost Baaij
26
FRANGO? O pássaro? Suponho que você quer dizer CHECKIN. Essa é uma troca de vogal engraçada.
218 JayC
52
Não, eu quis dizer FRANGO, ilustrar pode ser o que você quiser. Concordaram sobre a troca de vogal ser engraçado embora :-)
Anne
6
Para aqueles tão perplexo como eu estava com este negócio FRANGO .... w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm
n0nag0n
43

XMLHttpRequest é um objeto padrão no modelo de objeto JavaScript.

Segundo a Wikipedia, XMLHttpRequestapareceu pela primeira vez no Internet Explorer 5 como um objeto ActiveX, mas foi transformado em um padrão e foi incluído para uso em JavaScript na família Mozilla desde 1.0, Apple Safari 1.2, Opera Safari 1.2, Opera 7.60-p1 e IE 7.0 .

O open()método no objeto leva o método HTTP como um argumento - e é especificado como tomar qualquer método HTTP válido (ver o número do item 5 do link) - incluindo GET, POST, HEAD, PUTe DELETE, como especificado pela RFC 2616 .

Como observação lateral, o IE 7–8 permite apenas os seguintes métodos HTTP: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL" , "COPY", "LOCK", "UNLOCK" e "OPTIONS" .

Vihung
fonte
7
Eu esperava ver algumas peças de documentação para ler mais, não disse que não acredito em você. Os links na wikipedia são bastante legais, na verdade. Graças
naugtur
19

_method solução alternativa de campo oculto

Usado no Rails e pode ser adaptado a qualquer estrutura:

  • adicione um _methodparâmetro oculto a qualquer formulário que não seja GET ou POST:

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

    Isso pode ser feito automaticamente em estruturas através do método auxiliar de criação de HTML (por exemplo, Rails form_tag)

  • corrija o método de formulário real para POST ( <form method="post")

  • processos _methodno servidor e faça exatamente como se esse método tivesse sido enviado em vez do POST real

Justificativa / histórico do motivo pelo qual não é possível: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms

Ciro Santilli adicionou uma nova foto
fonte
Santilli, oi cara, já faz muito tempo desde que você ofereceu esta solução, e desde que eu sou iniciante em desenvolvimento web, tenho uma pergunta que espero que você responda. Então, você disse que "processa _method no servidor e faz exatamente como se esse método tivesse sido enviado em vez do POST real", você quis dizer que, se o método oculto com PUT (ou DELETE) for colocado na exibição, isso significaria realmente PUT (ou DELETE), certo? se sim, por que usar o método POST no início e, em seguida, use PUT ou DELETE oculto. Qual é a conexão entre POST e PUT (ou excluir) :)
Mirich
1
@Mirich, o formulário suporta apenas POST. Então, enviamos o POST com dados extras, que o servidor sabe que significa: ah, devo tratar isso como um PUT.
Ciro Santilli #
Obrigado Ciro pela atenção e resposta, então posso considerar este cenário como este: POST é uma coisa universal que contém POST, PUT, PATCH e DELETE reais em si e se você usar o POST no início sem ocultar, isso significaria real POSTAR. Mas se você usar o POST com oculto (PUT ou DELETE), informará ao servidor que deseja usar PUT ou DELETE que estão dentro do POST como seus filhos por dentro. Conheço uma analogia um pouco estranha, mas isso está correto? :)
Mirich
1
@ Simon sim, acho que você entendeu a idéia.
Ciro Santilli escreveu:
desculpe Ciro apenas a última coisa, gostaria de saber por que PUT e DELETE foram removidos do HTML5, pois não seria melhor se você pudesse apenas usar PUT ou DELETE no início da tag de formulário e simplesmente não usar oculto. Você pode explicar em breve e claramente qual foi o motivo real da remoção de PUT e DELETE. Agradecemos antecipadamente :)
Mirich
15

Acredito que esses comentários se refiram especificamente aos navegadores, ou seja, clicar em links e enviar formulários, não XMLHttpRequest. XMLHttpRequesté apenas um cliente personalizado que você escreveu em JavaScript que usa o navegador como tempo de execução.

ATUALIZAÇÃO: Para esclarecer, não quis dizer (apesar de escrever) que você escreveu XMLHttpRequest; Eu quis dizer que você escreveu o código que usa XMLHttpRequest. Os navegadores não oferecem suporte nativo XMLHttpRequest. XMLHttpRequestvem do tempo de execução JavaScript, que pode ser hospedado por um navegador, embora não seja necessário (consulte Rhino ). É por isso que as pessoas dizem que os navegadores não suportam PUTe, DELETEporque na verdade é o JavaScript que os suporta.

Hank Gay
fonte
XMLHttpRequest é um objeto padrão no modelo de objeto JavaScript.
Jacob Krall
9
@ Jacob True, mas navegadores diferentes têm mecanismos JavaScript diferentes. Saber qual deles suporta PUT ainda é útil.
senfo
1
it's actually JavaScript that is supporting them. Na verdade não é verdade. XMLHttpRequesté um 'objeto de host', o que significa que é um objeto que expõe a funcionalidade do host ao código Javascript. Não faz parte do próprio JS.
Stijn de Witt
9

SIM , PUT, DELETE, HEAD etc Os métodos HTTP estão disponíveis em todos os navegadores modernos.

Para estar em conformidade com o XMLHttpRequest, os navegadores de nível 2 devem oferecer suporte a esses métodos. Para verificar quais navegadores suportam XMLHttpRequest Nível 2, recomendo CanIUse:

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

Somente o Opera Mini está sem suporte para atm (julho '15), mas o Opera Mini não tem suporte para tudo. :)

Stijn de Witt
fonte
7

Apenas para adicionar - o Safari 2 e versões anteriores definitivamente não suportam PUT e DELETE. Tenho a impressão de que o fez 3, mas não tenho mais isso para testar. O Safari 4 definitivamente suporta PUT e DELETE.

jharlap
fonte
5
Alguém pode confirmar qual versão do Safari ganhou suporte para PUT e DELETE?
Mjs
1
Alguém pode explicar se todos os navegadores agora suportam PUT & DELETE - e aproximadamente quanto tempo isso está disponível. Observando no exemplo "CHICKEN", isso significa que depende inteiramente do servidor interpretar qual método é usado E que JavaScript não restringe o tipo de método ...?
Cody