Resposta curta: nas solicitações POST, os valores são enviados no "corpo" da solicitação. Nos formulários da Web, eles provavelmente são enviados com um tipo de mídia application/x-www-form-urlencoded
ou multipart/form-data
. As linguagens de programação ou estruturas que foram concebidos para web-solicitações punho costuma fazer "a coisa certa ™" com tais pedidos e fornecer-lhe com fácil acesso aos valores facilmente decodificados (como $_REQUEST
ou $_POST
em PHP, ou cgi.FieldStorage()
, flask.request.form
em Python).
Agora vamos discordar um pouco, o que pode ajudar a entender a diferença;)
A diferença entre GET
e POST
solicitações é amplamente semântica. Eles também são "usados" de maneira diferente, o que explica a diferença de como os valores são passados.
Ao executar uma GET
solicitação, você solicita ao servidor uma ou um conjunto de entidades. Para permitir que o cliente filtre o resultado, ele pode usar a chamada "string de consulta" da URL. A cadeia de consulta é a parte após o ?
. Isso faz parte da sintaxe do URI .
Portanto, do ponto de vista do código do aplicativo (a parte que recebe a solicitação), será necessário inspecionar a parte da consulta URI para obter acesso a esses valores.
Observe que as chaves e os valores fazem parte do URI. Os navegadores podem impor um limite no comprimento do URI. O padrão HTTP afirma que não há limite. Mas, no momento da redação deste artigo, a maioria dos navegadores não limitar os URIs (Eu não tenho valores específicos). GET
As solicitações nunca devem ser usadas para enviar novas informações ao servidor. Documentos especialmente não maiores. É aí que você deve usar POST
ou PUT
.
Ao executar uma POST
solicitação, o cliente está realmente enviando um novo documento ao host remoto. Portanto, uma string de consulta não faz sentido (semanticamente). É por isso que você não tem acesso a eles no código do aplicativo.
POST
é um pouco mais complexo (e muito mais flexível):
Ao receber uma solicitação POST, você sempre deve esperar uma "carga útil" ou, em termos de HTTP: um corpo da mensagem . O corpo da mensagem em si é bastante inútil, pois não existe um formato padrão (tanto quanto eu sei. Talvez aplicativo / fluxo de octetos?). O formato do corpo é definido pelo Content-Type
cabeçalho. Ao usar um FORM
elemento HTML com method="POST"
, isso geralmente é application/x-www-form-urlencoded
. Outro tipo muito comum é multipart / form-data se você usar uploads de arquivos. Mas poderia ser qualquer coisa , variando text/plain
, acima application/json
ou até um costume application/octet-stream
.
De qualquer forma, se uma POST
solicitação for feita com uma Content-Type
que não possa ser tratada pelo aplicativo, ele deverá retornar um 415
código de status .
A maioria das linguagens de programação (e / ou web-estruturas) oferecem uma maneira de de / codificar o corpo da mensagem de / para a maioria dos tipos comuns (como application/x-www-form-urlencoded
, multipart/form-data
ou application/json
). Então é fácil. Tipos personalizados exigem potencialmente um pouco mais de trabalho.
Usando um documento codificado em formulário HTML padrão como exemplo, o aplicativo deve executar as seguintes etapas:
- Leia o
Content-Type
campo
- Se o valor não for um dos tipos de mídia suportados, retorne uma resposta com um
415
código de status
- caso contrário, decodifique os valores do corpo da mensagem.
Novamente, linguagens como PHP ou frameworks da web para outras linguagens populares provavelmente tratarão disso para você. A exceção a isso é o 415
erro. Nenhuma estrutura pode prever quais tipos de conteúdo seu aplicativo escolhe para dar suporte e / ou não. Isso é com você.
Uma PUT
solicitação é praticamente tratada da mesma maneira que uma POST
solicitação. A grande diferença é que uma POST
solicitação deve permitir que o servidor decida como (e se for o caso) criar um novo recurso. Historicamente (a partir do agora obsoleto RFC2616, era para criar um novo recurso como um "subordinado" (filho) do URI para onde a solicitação foi enviada).
Um PUT
pedido em contraste é suposto "depósito" um recurso exatamente no que URI, e com exatamente esse conteúdo. Nem mais nem menos. A idéia é que o cliente seja responsável por criar o recurso completo antes de "COLOCAR" nele. O servidor deve aceitá-lo como está no URL fornecido.
Como conseqüência, uma POST
solicitação geralmente não é usada para substituir um recurso existente. Uma PUT
solicitação pode criar e substituir.
Nota
Também existem " parâmetros de caminho " que podem ser usados para enviar dados adicionais ao controle remoto, mas são tão incomuns que não entrarei em muitos detalhes aqui. Mas, para referência, aqui está um trecho da RFC:
Além dos segmentos de pontos nos caminhos hierárquicos, um segmento de caminho é considerado opaco pela sintaxe genérica. Os aplicativos produtores de URI geralmente usam os caracteres reservados permitidos em um segmento para delimitar subcomponentes específicos do esquema ou do manipulador de desreferência. Por exemplo, os caracteres reservados de ponto-e-vírgula (";") e iguais ("=") são frequentemente usados para delimitar parâmetros e valores de parâmetros aplicáveis a esse segmento. O caractere reservado por vírgula (",") geralmente é usado para fins semelhantes. Por exemplo, um produtor de URI pode usar um segmento como "nome; v = 1.1" para indicar uma referência à versão 1.1 de "nome", enquanto outro pode usar um segmento como "nome, 1.1" para indicar o mesmo. Os tipos de parâmetros podem ser definidos pela semântica específica do esquema,
multipart/form-data
. Para os interessados, aqui está uma pergunta sobre isso .