一次 POST请求发送多个请求

3,491 阅读1分钟

一、概述

又看到这篇文章:juejin.cn/post/684490…

这边篇文章的结论是:

GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。

  • 对于 GET 方式的请求,浏览器会把 http headerdata 一并发送出去,服务器响应 200 (返回数据);

  • 对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 (返回数据)。

那么就想着动手来验证一下。

先说实验结果:

  1. 简单 POST 请求,产生一个 TCP 包(相对应概念)
  2. 请求的数据过大,客户端会先发 header请求并携带Expect: 100-continue,服务端响应会返回 HTTP/1.1 100 ,之后才会发送真正请求数据
  3. 概念上:TCP 是流式


二、实验

实验步骤:

  1. 启动服务,端口 8081
  2. 启动 wireshark,过滤对应端口
    • GET 请求
    • POST 请求

(1) 启动服务,端口 8081

使用springboot ,启动服务:

Tips : 是在本地启动的。

@RestController
class HelloController {

    @GetMapping("/test/1")
    public String test1() {

        return "123";
    }

    @PostMapping("/test/2")
    public String test2(@RequestBody Object o) {

        System.out.println(o.toString());

        return "456";
    }
}

(2)启动 wireshark,过滤对应端口

因为是本地请求访问本地服务,所以要选择 loopback接口(本地还回),如图:

2021-03-1211-04-33.png

过滤端口:port 8081,如图:

举例的是一次 GET 请求

2021-03-1209-56-47.png

  • [] : 表示一次连接
  • -> : 表示请求
  • <- : 表示返回
  1. GET 请求

请求:

donald@donald-pro:~$ curl http://localhost:8081/test/1 -i
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 3
Date: Fri, 12 Mar 2021 01:51:35 GMT

123

wireshark 抓包结果如图: 2021-03-1209-56-47.png

  1. POST 请求

请求:

donald@donald-pro:~$ curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"name": "donald"}' http://localhost:8081/test/2 -i
HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Content-Length: 3
Date: Fri, 12 Mar 2021 02:08:27 GMT

456

wireshark 抓包如图:

2021-03-1210-34-40.png

那包是不是不够大?

那再请求一次:

donald@donald-pro:~$ curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"name": "donald", "data": "iVBORw0KGgoAAAANSUhEUgAAAhwAAAHkCAIAAAD6tWHCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOzdd1wT5x8H8OcuO4SwNwioiOBCBbd1b61ba7V1oNZta20VF4K21lVrHWirVisO1J+Kq7bOuq0DB0NFEZANCZC97p7fH1fTCIjYxkTN9/3yj+TJc5fvnZAPd89zFwJjjAAAAABzIK1dAAAAiVBORw0KGgoAAAANSUhEUgAAAhwAAAHkCAIAAAD6tWHCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOzdd1wT5x8H8OcuO4SwNwioiOBCBbd1b61ba7V1oNZta20VF4K21lVrHWirVisO1J+Kq7bOuq0DB0NFEZANCZC97p7fH1fTCIjYxkTN9/3yj+TJc5fvnZAPd89zFwJjjAAAAABzIK1dAAAAiVBORw0KGgoAAAANSUhEUgAAAhwAAAHkCAIAAAD6tWHCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOzdd1wT5x8H8OcuO4SwNwioiOBCBbd1b61ba7V1oNZta20VF4K21lVrHWirVisO1J+Kq7bOuq0DB0NFEZANCZC97p7fH1fTCIjYxkTN9/3yj+TJc5fvnZAPd89zFwJjjAAAAABzIK1dAAAAiVBORw0KGgoAAAANSUhEUgAAAhwAAAHkCAIAAAD6tWHCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOzdd1wT5x8H8OcuO4SwNwioiOBCBbd1b61ba7V1oNZta20VF4K21lVrHWirVisO1J+Kq7bOuq0DB0NFEZANCZC97p7fH1fTCIjYxkTN9/3yj+TJc5fvnZAPd89zFwJjjAAAAABzIK1dAAAAiVBORw0KGgoAAAANSUhEUgAAAhwAAAHkCAIAAAD6tWHCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOzdd1wT5x8H8OcuO4SwNwioiOBCBbd1b61ba7V1oNZta20VF4K21lVrHWirVisO1J+Kq7bOuq0DB0NFEZANCZC97p7fH1fTCIjYxkTN9/3yj+TJc5fvnZAPd89zFwJjjAAAAABzIK1dAAAAiVBORw0KGgoAAAANSUhEUgAAAhwAAAHkCAIAAAD6tWHCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOzdd1wT5x8H8OcuO4SwNwioiOBCBbd1b61ba7V1oNZta20VF4K21lVrHWirVisO1J+Kq7bOuq0DB0NFEZANCZC97p7fH1fTCIjYxkTN9/3yj+TJc5fvnZAPd89zFwJjjAAAAABzIK1dAAAA"}' http://localhost:8081/test/2 -i
HTTP/1.1 100 

HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Content-Length: 3
Date: Fri, 12 Mar 2021 02:45:16 GMT

456

wireshark 抓包如图:

2021-03-1210-51-14.png

可以看到是有一个 http 100

然而 http 状态码 100 的语义是:

  • 100 Continue :上传大文件前使用

由客户端发起请求中携带 Expect: 100-continue 头部触发。

确实是会先发送 header, 并携带 Expect: 100-continue,如图:

2021-03-1211-00-00.png