Explicação detalhada de quatro maneiras de enviar dados em POST em HTTP

Explicação detalhada de quatro maneiras de enviar dados em POST em HTTP

Em primeiro lugar, deixe-me falar sobre por que escrevi este artigo. Quando escrevi o cliente antes, costumava chamar a interface de back-end. Geralmente, as interfaces de muitas empresas usam o método de envio POST unificado.

A resposta do servidor é uma string no formato JSON, o que é conveniente para o gerenciamento unificado. Naquela época, eu não era muito claro sobre o POST. No início, não achei que houvesse algo de errado com ele.

Mas quando você realmente espera até escrever uma comunidade técnica independente, ou seja  www.helloworld.net , você precisa fazer upload, enviar um formulário, etc.

Acabei de perceber que se não entendo essas coisas, quando as uso é muito trabalhoso e demorado.

A seguir está uma revisão, aprenda sobre  GET esses  POST dois métodos de envio mais comumente usados

Quais são os métodos de envio HTTP?

Existem 9 métodos de solicitação HTTP, a saber

número de série método descrever
1 PEGAR Solicite as informações da página especificada e retorne o corpo da entidade.
2 CABEÇA Semelhante a uma solicitação GET, exceto que não há conteúdo específico na resposta retornada, que é usada para obter o cabeçalho
3 PUBLICAR Envie dados a um recurso especificado para processar uma solicitação (como enviar um formulário ou fazer upload de um arquivo). Os dados são incluídos no corpo da solicitação. As solicitações POST podem resultar na criação de novos recursos e/ou na modificação de recursos existentes.
4 COLOCAR Os dados enviados do cliente para o servidor substituem o conteúdo do documento especificado.
5 EXCLUIR Solicita ao servidor que exclua a página especificada.
6 CONECTAR Reservado no protocolo HTTP/1.1 para servidores proxy que podem canalizar conexões.
7 OPÇÕES Permite que os clientes visualizem o desempenho do servidor.
8 VESTÍGIO Ecoa as solicitações recebidas pelo servidor, principalmente para testes ou diagnósticos.
9 CORREÇÃO Complementar ao método PUT para atualizações parciais de recursos conhecidos.

O mais comumente usado ainda é  GET , POST

Componentes de HTTP

Sabemos que http é um protocolo de comunicação, como se chama 通信协议, comunicação significa que duas pessoas querem se comunicar, protocolo significa como se comunicar

Por exemplo, se eu disser A, você sabe que estou com fome e quero comer, e se eu disser novamente  A 米饭, você saberá que estou com fome e quero comer arroz.

Sim, o acordo é o formato do conteúdo da comunicação que as duas partes discutiram previamente

O protocolo de comunicação HTTP é   o formato estipulado por ambas HTTP客户端as partes HTTP服务端

Então, quais são as partes desta mensagem HTTP?

Muito simplesmente, uma mensagem HTTP consiste em duas partes

  • cabeçalho da solicitação
  • corpo da solicitação

Por exemplo, se enviarmos uma solicitação para pressionar Enter no navegador  www.helloworld.net , estamos enviando uma solicitação GET neste momento

Então o cabeçalho da solicitação é:

GET / HTTP/2
Host: www.helloworld.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: Hm_lvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379; Hm_lpvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
If-None-Match: "d696-1nnZwKI6/LZalqvEzQx9IFil/tw"
TE: trailers

Observação:  as solicitações HTTP GET não possuem corpo de solicitação, e é por isso que algumas empresas empacotam solicitações uniformemente como POST em vez de GET

Como o POST possui um corpo de solicitação e pode transportar uma grande quantidade de dados, como o GET não possui um corpo de solicitação, os parâmetros transportados só podem ser colocados na URL e a quantidade de dados que podem ser transportados é relativamente pequena.

Método de solicitação GET

GET O método de acesso é o mais utilizado e o mais simples. Assim como sua semântica, GET significa obter o arquivo

Portanto, uma solicitação GET serve para obter um determinado recurso no servidor e é muito simples de usar. Só precisamos lembrar os dois pontos a seguir

  • Os parâmetros GET só podem ser seguidos por parâmetros após o URL, como http://www.helloworld.net?name=tom&age=23

Depois de receber a solicitação, o servidor pode analisar os parâmetros após a url, nome = tom, idade = 23

  • Outro ponto, pouca gente fala, é o que falamos acima, a requisição GET não tem corpo de requisição

Vamos nos concentrar na solicitação POST

Método de solicitação POST

POST significa envio. Se precisarmos enviar alguns dados ao servidor, podemos usar o método POST

Embora POST signifique enviar, e o protocolo estipule que os dados devem ser enviados com POST, mas agora muitas empresas não fazem isso

A consulta também usa POST, que na verdade é apenas uma palavra. Depois que o servidor recebe a solicitação, seja para consultar recursos, excluir recursos ou enviar

Está tudo bem, depende apenas de como estão as regulamentações de front-end e back-end da sua empresa.

Vamos dar uma olhada nas formas de envio de dados no POST

O primeiro application/x-www-form-urlencoded

Este também é o método padrão do POST, e o cabeçalho da solicitação correspondente  Content-Type é application/x-www-form-urlencoded

www.helloworld.net Pegamos vários métodos de solicitação do navegador  , por exemplo, como segue

## 请求头
POST /v1/special/getSpecialCateList HTTP/2
Host: tiger-api.helloworld.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Authorization: 
token: 
ts: 1668407094
sign: d41d8cd98f00b204e9800998ecf8427e
deviceType: pc
Origin: https://www.helloworld.net
Connection: keep-alive
Referer: https://www.helloworld.net/
Cookie: Hm_lvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379; Hm_lpvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406398
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Content-Length: 0

## 请求体
action=10&pageNum=1&pageSize=10&uuid=15139897

Desta forma, geralmente são apresentados os valores de chave e valor.

O segundo tipo:multipart/form-data

Eu usei isso como acima antes, e quando escrevi e carreguei o arquivo, verifiquei e descobri que não era

Este método de envio geralmente é usado para fazer upload de arquivos. Geralmente é usado para transmitir dados de arquivos grandes, como imagens ou arquivos, do cliente para o servidor.

Primeiro, vamos explicar seu método de codificação. Primeiro, uma  boundary linha de limite de string muito longa será gerada, indicando que o seguinte é o conteúdo do formulário, seguido pelo nome no primeiro par de valores-chave no formulário e, em seguida, uma nova linha , seguido pelo valor. Em seguida, gere uma  boundary linha divisória de string para separar diferentes valores-chave. Depois disso, repita a operação acima. Para o processo detalhado, consulte o exemplo abaixo.

Da mesma forma, vamos dar  www.helloworld.net um exemplo, vamos encontrar uma interface interna, pegá-la e ver

# 请求头
POST http://www.helloworld.net/xyz HTTP/1.1
Host: www.helloworld.net
User-Agent: python-requests/2.24.0
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: multipart/form-data; boundary=e42346452as650adf2345fadade
Content-Length: 222
Connection: keep-alive

# 请求体
--e42346452as650adf2345fadade
Content-Disposition: form-data; name="field0"

value1
--e42346452as650adf2345fadade
Content-Disposition: form-data; name="field1"

value2
--e42346452as650adf2345fadade--
Content-Disposition: form-data; name="field2"; filename="filename"
Content-Type: text/plain

--e42346452as650adf2345fadade--

Pelo exposto, podemos saber que no cabeçalho da solicitação  Content-Type , existe um boundary=e42346452as650adf2345fadade

As strings atrás do limite são geradas aleatoriamente. Usado para segmentação de dados no corpo da solicitação.

Na verdade, é o papel de um separador.

O terceiro tipo:application/json

Este é o que mais usamos agora e também é muito conveniente.

Se definido no cabeçalho da solicitação  content-type=application/json, significa que o formato do conteúdo no corpo da solicitação está no formato JSON

Da mesma forma, quando o servidor responder, ele também adicionará um content-type=application/json

O mesmo é informar ao cliente que o conteúdo do corpo da resposta que respondo a você também está no formato json

Da mesma forma, também nos referimos a  www.helloworld.net uma solicitação em , como segue

## 请求头
POST /v1/special/getSpecialList HTTP/2
Host: tiger-api.helloworld.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
Authorization: 
token: 
ts: 1668408188
sign: 08fab32346193fa92037b5ca5f9ed592
deviceType: pc
Content-Length: 30
Origin: https://www.helloworld.net
Connection: keep-alive
Referer: https://www.helloworld.net/
Cookie: Hm_lvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379,1668408042,1668408051; Hm_lpvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668408051
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
TE: trailers

## 请求体
action=10&pageNum=1&sortType=0

Vejamos o corpo da resposta:

{
  "code": 1,
  "data": {
    "hasMore": false,
    "list": [
      {
        "uuid": "5441523000",
        "title": "区块链原理和应用",
        "totalCount": 0,
        "chapterCount": 1,
        "readCount": 0,
        "subscribeCount": 1,
        "createTime": "0001-01-01T00:00:00Z",
        "status": 0,
        "profile": "1037883613",
        "nicker": "小天",
        "avatar": "https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/d04d513fbea19f6cb7c3b4beee3c7f5e.jfif",
        "subscribed": false
      },
      {
        "uuid": "bbatgp",
        "title": "C语言编程(初级)",
        "totalCount": 0,
        "chapterCount": 19,
        "readCount": 2938,
        "subscribeCount": 1,
        "createTime": "0001-01-01T00:00:00Z",
        "status": 0,
        "profile": "80662724",
        "nicker": "Suzhou",
        "avatar": "https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/d04d513fbea19f6cb7c3b4beee3c7f5e.jfif",
        "subscribed": false
      }
    ]
  },
  "message": "获取数据成功",
  "errMessage": ""
}

O quarto tipo:text/xml

Nunca encontrei isso antes e raramente é usado

Na verdade, na mensagem de solicitação, o formato do conteúdo no corpo da solicitação é o formato xml de texto simples

Não vamos apresentar esse tipo

Se você estiver interessado, você mesmo pode verificar as informações abaixo

Resumindo, os quatro métodos de HTTP POST e a breve introdução de GET, resumimos da seguinte forma:

  • Uma solicitação GET só pode transportar parâmetros na URL, sem mencionar que os parâmetros também podem ser transportados no cabeçalho da solicitação. Todos os métodos podem transportar parâmetros no cabeçalho da solicitação e não é considerado um método GET.

  • Solicitações GET não possuem corpo de solicitação

  • Existem quatro maneiras de enviar dados por POST, como segue:

      1. `application/x-www-form-urlencoded` , 也是默认的方式,主要提交的数据是key, value 形式的
      2. `multipart/form-data` ,此种方式 是客户端向服务端提交大数据用的,一般上传文件等用到。
    

​ Observe que desta forma, um campo de limite será gerado no cabeçalho da solicitação, e seu valor correspondente é uma string gerada aleatoriamente usada para separar os dados no corpo da solicitação

  1. application/json Este método é o método mais usado e mais comumente usado, mas  www.helloworld.net raramente o uso no processo de escrita

    Porque esse método tem uma desvantagem, ou seja, o servidor precisa criar um grande número de estruturas ou classes durante a análise. Então finalmente escolhi o primeiro método de envio

  2. text/xml Isso não é muito útil, o corpo da solicitação está no formato xml

Uma breve introdução a alguns conhecimentos de HTTP GET e POST, espero que seja útil para você.

おすすめ

転載: blog.csdn.net/APItesterCris/article/details/131128172