HTTP POSTAR solicitações fornecem dados adicionais do cliente (navegador) para o servidor no corpo da mensagem. Em contraste, OBTER solicitações incluem todos os dados necessários no URL. Os formulários em HTML podem usar qualquer um dos métodos, especificando método = "POST" ou method = "GET" (padrão) no elemento. O método especificado determina como os dados do formulário são enviados ao servidor. Quando o método é GET, todos os dados do formulário são codificados na URL, anexados ao açao URL como parâmetros de sequência de caracteres de consulta. Com o POST, os dados do formulário são exibidos no corpo da mensagem da solicitação HTTP.
OBTER | POSTAR | |
---|---|---|
História | Os parâmetros permanecem no histórico do navegador porque fazem parte do URL | Os parâmetros não são salvos no histórico do navegador. |
Marcado como favorito | Pode ser marcado como favorito. | Não pode ser marcado como favorito. |
Comportamento do botão VOLTAR / reenviar | Solicitações GET são reexecutadas, mas não podem ser reenviadas ao servidor se o HTML estiver armazenado no cache do navegador. | O navegador geralmente alerta o usuário que os dados precisarão ser reenviados. |
Tipo de codificação (atributo enctype) | application / x-www-form-urlencoded | multipart / form-data or application / x-www-form-urlencoded Use codificação multipart para dados binários. |
Parâmetros | pode enviar, mas os dados do parâmetro são limitados ao que podemos inserir na linha de solicitação (URL). Mais seguro para usar menos de 2K de parâmetros, alguns servidores lidam com até 64K | Pode enviar parâmetros, incluindo upload de arquivos, para o servidor. |
Hackeado | Mais fácil de hackear para crianças de script | Mais difícil de invadir |
Restrições no tipo de dados do formulário | Sim, apenas caracteres ASCII permitidos. | Sem restrições. Dados binários também são permitidos. |
Segurança | GET é menos seguro comparado ao POST, porque os dados enviados fazem parte da URL. Por isso, é salvo no histórico do navegador e nos logs do servidor em texto sem formatação. | POST é um pouco mais seguro que GET porque os parâmetros não são armazenados no histórico do navegador ou nos logs do servidor da web. |
Restrições no comprimento dos dados do formulário | Sim, como os dados do formulário estão no URL e o comprimento do URL é restrito. Um limite de tamanho de URL seguro geralmente possui 2048 caracteres, mas varia de acordo com o navegador e o servidor da web. | Sem restrições |
Usabilidade | O método GET não deve ser usado ao enviar senhas ou outras informações confidenciais. | Método POST usado ao enviar senhas ou outras informações confidenciais. |
Visibilidade | O método GET é visível para todos (será exibido na barra de endereços do navegador) e tem limites na quantidade de informações a serem enviadas. | Variáveis do método POST não são exibidas na URL. |
Em cache | Pode ser armazenado em cache | Não armazenado em cache |
A diferença fundamental entre MÉTODO = "GET" e MÉTODO = "POST" é que eles correspondem a pedidos HTTP diferentes, conforme definido nas especificações HTTP. O processo de envio para os dois métodos começa da mesma maneira - um conjunto de dados de formulário é construído pelo navegador e depois codificado da maneira especificada pelo enctype atributo. Para MÉTODO = "POST a enctype atributo pode ser multipart / form-data ou application / x-www-form-urlencoded, considerando que para MÉTODO = "GET", só application / x-www-form-urlencoded é permitido. Esse conjunto de dados do formulário é transmitido ao servidor.
Para envio de formulários com METHOD = "GET", o navegador constrói um URL usando o valor do açao atributo, anexando um ? anexando o conjunto de dados do formulário (codificado usando o tipo de conteúdo application / x-www-form-urlencoded). O navegador processa esse URL como se seguisse um link (ou como se o usuário tivesse digitado o URL diretamente). O navegador divide o URL em partes e reconhece um host e envia a esse host uma solicitação GET com o restante do URL como argumento. O servidor leva a partir daí. Observe que esse processo significa que os dados do formulário estão restritos aos códigos ASCII. Cuidado especial deve ser tomado para codificar e decodificar outros tipos de caracteres ao transmiti-los pela URL no formato ASCII.
O envio de um formulário com METHOD = "POST" faz com que uma solicitação POST seja enviada, usando o valor do açao atributo e uma mensagem criada de acordo com o tipo de conteúdo especificado pelo enctype atributo.
Como os dados do formulário são enviados como parte da URL quando OBTER é usado --
Em princípio, o processamento de dados de um formulário enviado depende se ele é enviado com MÉTODO = "GET" ou MÉTODO = "POST". Como os dados são codificados de maneiras diferentes, diferentes mecanismos de decodificação são necessários. Assim, de um modo geral, alterar o MÉTODO pode exigir uma alteração no script que processa a submissão. Por exemplo, ao usar a interface CGI, o script recebe os dados em uma variável de ambiente (QUERYSTRING) quando OBTER é usado. Mas quando POSTAR é usado, os dados do formulário são transmitidos no fluxo de entrada padrão (stdin) e o número de bytes a serem lidos é fornecido pelo cabeçalho Content-length.
Recomenda-se o GET ao enviar formulários "idempotentes" - aqueles que 'não alteram significativamente o estado do mundo'. Em outras palavras, formulários que envolvem apenas consultas ao banco de dados. Outra perspectiva é que várias consultas idempotentes terão o mesmo efeito que uma única consulta. Se houver atualizações de banco de dados ou outras ações, como acionar emails, recomenda-se o uso do POST.
No blog do desenvolvedor do Dropbox:
um navegador não sabe exatamente o que um formulário HTML específico faz, mas se o formulário for enviado via HTTP GET, o navegador saberá que é seguro tentar o envio automaticamente novamente se houver um erro de rede. Para formulários que usam HTTP POST, pode não ser seguro tentar novamente, portanto o navegador solicita a confirmação do usuário primeiro.
Uma solicitação "GET" geralmente é armazenável em cache, enquanto uma solicitação "POST" dificilmente pode ser. Para sistemas de consulta, isso pode ter um impacto considerável na eficiência, especialmente se as cadeias de consulta forem simples, pois os caches podem servir as consultas mais frequentes.
Em certos casos, usar POSTAR é recomendado mesmo para consultas idempotentes:
Atualizado em 15 de maio de 2015: Especificamente ao usar HTTPS (HTTP sobre TLS / SSL), o POST oferece mais segurança que GET?
Esta é uma pergunta interessante. Digamos que você faça uma solicitação GET para uma página da web:
GET https://www.example.com/login.php?user=mickey&passwd=mini
Supondo que sua conexão com a Internet esteja sendo monitorada, quais informações sobre essa solicitação estarão disponíveis para o bisbilhoteiro? Se o POST for usado, e os dados do usuário e da senha forem incluídos nas variáveis do POST, será mais seguro no caso de conexões HTTPS?
A resposta é não. Se você fizer uma solicitação GET, apenas as seguintes informações serão conhecidas pelo invasor que monitora seu tráfego na Web:
A parte do caminho da URL - ou seja, a página real solicitada, bem como os parâmetros da string de consulta - são protegidos (criptografados) enquanto estão "sem fio", ou seja, em trânsito a caminho do servidor de destino. A situação é exatamente a mesma para solicitações POST.
Obviamente, os servidores da Web tendem a registrar a URL inteira em texto sem formatação nos registros de acesso; portanto, enviar informações confidenciais pelo GET não é uma boa ideia. Isso se aplica independentemente de HTTP ou HTTPS ser usado.