Em uma solicitação HTTP GET , os parâmetros são enviados como uma sequência de consultas :
http://example.com/page ? parameter = value & also = outro
Em uma solicitação HTTP POST , os parâmetros não são enviados junto com o URI.
Onde estão os valores? No cabeçalho da solicitação? No corpo da solicitação? Com o que se parece?
multipart/form-data
. Para os interessados, aqui está uma pergunta sobre isso .multipart/form-data
ou se você é responsável pela construção do pedido, a mudança do tipo de conteúdo paraapplication/json
e colar texto JSON em http corpo diretamenteO conteúdo é colocado após os cabeçalhos HTTP. O formato de um HTTP POST é ter os cabeçalhos HTTP, seguidos por uma linha em branco, seguida pelo corpo da solicitação. As variáveis POST são armazenadas como pares de valores-chave no corpo.
Você pode ver isso no conteúdo bruto de uma postagem HTTP, mostrada abaixo:
Você pode ver isso usando uma ferramenta como o Fiddler , que pode ser usada para observar as solicitações de HTTP brutas e as cargas de resposta sendo enviadas através da conexão.
fonte
application/x-www-form-urlencoded
, o que nem sempre é o caso.From
cabeçalho lá?From
cabeçalho. A IMO está lá em cima com o código de status HTTP 418.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
oumultipart/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, oucgi.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
ePOST
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.GET ( seção RFC relevante )
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 usarPOST
ouPUT
.POST ( seção RFC relevante )
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 umFORM
elemento HTML commethod="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 , variandotext/plain
, acimaapplication/json
ou até um costumeapplication/octet-stream
.De qualquer forma, se uma
POST
solicitação for feita com umaContent-Type
que não possa ser tratada pelo aplicativo, ele deverá retornar um415
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
ouapplication/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:
Content-Type
campo415
código de statusNovamente, 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ê.PUT ( seção RFC relevante )
Uma
PUT
solicitação é praticamente tratada da mesma maneira que umaPOST
solicitação. A grande diferença é que umaPOST
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. UmaPUT
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:
fonte
PUT
seção, verá que ele é idempotente.POST
em contraste, não pode - por definição - não ser.POST
sempre criará um novo recurso.PUT
substituirá se um recurso idêntico existir. Portanto, se você ligarPOST
10 vezes, criará 10 recursos. Se você ligarPUT
10 vezes, ele (talvez) criará apenas um. Isso responde à sua pergunta?Você não pode digitá-lo diretamente na barra de URL do navegador.
Você pode ver como os dados do POST são enviados na Internet com os Cabeçalhos HTTP Ativos, por exemplo. Resultado será algo parecido
Onde diz
serão os valores da postagem.
fonte
Content-Length
deveria estar29
aqui? Esse é o comprimento real da stringusername=zurfyx&pass=password
.O tipo de mídia padrão em uma solicitação POST é
application/x-www-form-urlencoded
. Este é um formato para codificar pares de valores-chave. As chaves podem ser duplicadas. Cada par de chave-valor é separado por um&
caractere e cada chave é separada de seu valor por um=
caractere.Por exemplo:
É codificado como:
Isso é colocado no corpo da solicitação após os cabeçalhos HTTP.
fonte
Os valores do formulário nos POSTs HTTP são enviados no corpo da solicitação, no mesmo formato que a string de consulta.
Para mais informações, consulte a especificação .
fonte
?
por exemplo?application/x-www-form-urlencoded
, o que nem sempre é o caso.Alguns dos serviços da web exigem que você coloque os dados e os metadados da solicitação separadamente. Por exemplo, uma função remota pode esperar que a sequência de metadados assinada seja incluída em um URI, enquanto os dados são postados em um corpo HTTP.
A solicitação POST pode parecer semanticamente semelhante a esta:
Essa abordagem combina logicamente QueryString e Body-Post usando uma única
Content-Type
que é uma "instrução de análise" para um servidor da web.Observe: o HTTP / 1.1 é agrupado com o
#32
(espaço) à esquerda e com#10
(Alimentação de linha) à direita.fonte
/user/john
e/?user=john
é meramente semântica (o HTTP realmente não dá um tratamento especial às seqüências de caracteres de consulta), então eu tomo isso como razoavelmente esperado. Mas o que você quer dizer com "envolto por espaço à esquerda"? Não há espaços antes do método HTTP. Você quer dizer a linha em branco do corpo da postagem?...Ym04
eHTTP/1.1
no código acima. Portanto, um QueryString simplesmente reside entre o verbo e a versão do protocolo.?
mesma forma que fazemos com asGET
solicitações.Primeiro de tudo, vamos diferenciar entre
GET
ePOST
Obter: é a
HTTP
solicitação padrão feita ao servidor e é usada para recuperar os dados do servidor e a sequência de consultas que vem depois?
em aURI
é usada para recuperar um recurso exclusivo.este é o formato
aqui
data=value
está o valor da string de consulta passado.POST: É usado para enviar dados para o servidor com segurança, para que tudo o que for necessário, este seja o formato de uma
POST
solicitaçãoPor que POST sobre GET?
No
GET
valor enviado aos servidores, geralmente são anexados à URL base na string de consulta, agora existem duas consequências disso.GET
pedidos são salvos no histórico do navegador com os parâmetros. Portanto, suas senhas permanecem não criptografadas no histórico do navegador. Esse era um problema real para o Facebook nos dias de hoje.URI
pode ser. Se houver muitos parâmetros sendo enviados, você poderá receber414 Error - URI too long
Em caso de solicitação posterior, seus dados dos campos são adicionados ao corpo. O comprimento dos parâmetros de solicitação é calculado e adicionado ao cabeçalho para o comprimento do conteúdo e nenhum dado importante é diretamente anexado ao URL.
Você pode usar a seção de rede das Ferramentas do desenvolvedor do Google para ver informações básicas sobre como as solicitações são feitas aos servidores.
e você sempre pode adicionar mais valores em sua
Request Headers
comoCache-Control
,Origin
,Accept
.fonte
HTTPS
conexão, nãoHTTP
.HTTPS
criptografa ambosURL
(incluindo parâmetros de consulta) e oRequest Body
, quandoHTTP
criptografa / protege nenhum. O problema descrito vem do fato de muitos navegadores armazenarem oURIs
(inclusiveURLs
) em seus bancos de dados de histórico (geralmente não criptografados). Portanto, use apenas oRequest Body
+HTTPS
para qualquer coisa sensível.