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-urlencodedou 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 $_REQUESTou $_POSTem PHP, ou cgi.FieldStorage(), flask.request.formem Python).
Agora vamos discordar um pouco, o que pode ajudar a entender a diferença;)
A diferença entre GETe POSTsolicitaçõ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 GETsolicitaçã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). GETAs solicitações nunca devem ser usadas para enviar novas informações ao servidor. Documentos especialmente não maiores. É aí que você deve usar POSTou PUT.
Ao executar uma POSTsolicitaçã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-Typecabeçalho. Ao usar um FORMelemento 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/jsonou até um costume application/octet-stream.
De qualquer forma, se uma POSTsolicitação for feita com uma Content-Typeque não possa ser tratada pelo aplicativo, ele deverá retornar um 415có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-dataou 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-Typecampo
- Se o valor não for um dos tipos de mídia suportados, retorne uma resposta com um
415có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 415erro. Nenhuma estrutura pode prever quais tipos de conteúdo seu aplicativo escolhe para dar suporte e / ou não. Isso é com você.
Uma PUTsolicitação é praticamente tratada da mesma maneira que uma POSTsolicitação. A grande diferença é que uma POSTsolicitaçã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 PUTpedido 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 POSTsolicitação geralmente não é usada para substituir um recurso existente. Uma PUTsolicitaçã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 .