GET 和 POST 请求的区别()

HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,HTTPS的默认端口为443。

1. HTTP请求的方法

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

序号 方法 说明 支持的HTTP协议版本
1 GET 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中。 1.0;1.1
2 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。可能会导致新的资源的建立和/或已有资源 的修改。 1.0;1.1
3 HEAD 只获取响应头的信息,不获取响应主体内容。向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回,可用于欲判断某个资源是否存在。 1.0;1.1
4 OPTIONS 试探性请求,在CORS跨域请求中,所以正常请求发送前,先发送一个试探请求,验证是否可以和服务器正常的建立连接。 1.1
5 PUT 向指定资源位置上传其最新内容。 1.0;1.1
6 DELETE 请求服务器删除Request-URI所标识的资源。 1.0;1.1
7 TRACE 回显服务器收到的请求,主要用于测试或诊断。 1.1
8 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 1.1
9 LINK 请求服务器建立链接关系。 1.0
10 UNLINE 断开链接关系 1.0

注意:
  方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,返回状态码501(Not Implemented)。

2. GET 和 POST 请求方法的区别

GET 和 POST 最本质的区别是“约定和规范”上的区别,在规范中,定义 GET 请求是用来获取资源的,也就是进行查询操作的,而 POST 请求是用来传输实体对象的,因此会使用 POST 来进行添加、修改和删除等操作。

GET POST
请求参数 url 可见性 可见 不可见
传递参数方式 一般是通过 ? 跟在 URL 后面的,多个参数通过 & 连接,即请求参数在 URL 中传输 一般是包含在 request body 体传输
缓存机制
  • 会被浏览器主动;
  • 被完整保留在浏览器历史记录里;
  • URL 地址可以被 Bookmark;
  • 回退刷新时是无害的
  • 默认不会主动缓存;
  • 不会保留浏览器历史记录;
  • 不会被Bookmark;
  • 回退刷新时会再次提交请求
  • 时间消耗
  • 产生一个 TCP 数据包;
  • 对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);
  • 产生两个 TCP 数据包;
  • 对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
  • 请求报文 第一行是:GET /uri HTTP/1.1 \r\n 第一行则是:POST /uri HTTP/1.1 \r\n
    请求编码 只进行 url 编码(application/x-www-form-urlencoded),只接受ASCII字符的数据类型 支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data),可以传输二进制数据
    传输的数据大小 URL 的长度是有限制的,通常为 2k-4k 存放在请求正文(request body)中,取决于后端配置
    时间消耗
  • 产生一个 TCP 数据包;
  • 对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);
  • 产生两个 TCP 数据包;
  • 对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
  • 请求过程
    1. 浏览器请求 TCP 连接(第一次握手)
    2. 服务器答应进行 TCP 连接(第二次握手)
    3. 浏览器确认,并发送 POST 请求头(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)
    4. 服务器返回100 Continue响应
    5. 浏览器发送数据
    6. 服务器返回 200 OK响应
    1. 浏览器请求 TCP 连接(第一次握手)
    2. 服务器答应进行 TCP 连接(第二次握手)
    3. 浏览器确认,并发送 GET 请求头和数据(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)
    4. 服务器返回 200 OK响应
    安全性 请求底层都是基于 TCP/IP 协议实现的,均为明文传输
    • 会被浏览器主动;
    • 被完整保留在浏览器历史记录里;
    • URL 地址可以被 Bookmark;
    • 回退刷新时是无害的
    • 默认不会主动缓存;
    • 不会保留浏览器历史记录;
    • 不会被Bookmark;
    • 回退刷新时会再次提交请求
    • 产生一个 TCP 数据包;
    • 对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);
    • 产生两个 TCP 数据包;
    • 对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
    • 产生一个 TCP 数据包;
    • 对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);
    • 产生两个 TCP 数据包;
    • 对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
    • 浏览器请求 TCP 连接(第一次握手)
    • 服务器答应进行 TCP 连接(第二次握手)
    • 浏览器确认,并发送 POST 请求头(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)
    • 服务器返回100 Continue响应
    • 浏览器发送数据
    • 服务器返回 200 OK响应
    • 浏览器请求 TCP 连接(第一次握手)
    • 服务器答应进行 TCP 连接(第二次握手)
    • 浏览器确认,并发送 GET 请求头和数据(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)
    • 服务器返回 200 OK响应

    3. URL中特殊字符的处理

    URI 中的保留字不参与编码。保留字符一共有两大类:

    gen-delims:: / ? # [ ] @
    sub-delims:! $ & ' ( ) * + , ; =
    

    URI 的编码规则:把非限定范围的字符转为 16 进制,然后前面加百分号。
    如:空格字符转为十六进制是 0x20,前面再加上百分号,就是 %20。

    URL字符转义

    字符 含义 转义
    + URL 中+号表示空格 %2B
    空格 URL中的空格可以用+号或者编码 %20
    / 分隔目录和子目录 %2F
    ? 分隔实际的URL和参数 %3F
    % 指定特殊字符 %25
    # 表示书签 %23
    & URL 中指定的参数间的分隔符 %26
    = URL 中指定参数的值 %3D

    注:
    表单提交的空格转换后的编码是加号;

    ————————

    HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,HTTPS的默认端口为443。

    1. HTTP请求的方法

    HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
    HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

    序号 方法 说明 支持的HTTP协议版本
    1 GET 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中。 1.0;1.1
    2 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。可能会导致新的资源的建立和/或已有资源 的修改。 1.0;1.1
    3 HEAD 只获取响应头的信息,不获取响应主体内容。向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回,可用于欲判断某个资源是否存在。 1.0;1.1
    4 OPTIONS 试探性请求,在CORS跨域请求中,所以正常请求发送前,先发送一个试探请求,验证是否可以和服务器正常的建立连接。 1.1
    5 PUT 向指定资源位置上传其最新内容。 1.0;1.1
    6 DELETE 请求服务器删除Request-URI所标识的资源。 1.0;1.1
    7 TRACE 回显服务器收到的请求,主要用于测试或诊断。 1.1
    8 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 1.1
    9 LINK 请求服务器建立链接关系。 1.0
    10 UNLINE 断开链接关系 1.0

    注意:
      方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,返回状态码501(Not Implemented)。

    2. GET 和 POST 请求方法的区别

    GET 和 POST 最本质的区别是“约定和规范”上的区别,在规范中,定义 GET 请求是用来获取资源的,也就是进行查询操作的,而 POST 请求是用来传输实体对象的,因此会使用 POST 来进行添加、修改和删除等操作。

    GET POST
    请求参数 url 可见性 可见 不可见
    传递参数方式 一般是通过 ? 跟在 URL 后面的,多个参数通过 & 连接,即请求参数在 URL 中传输 一般是包含在 request body 体传输
    缓存机制
  • 会被浏览器主动;
  • 被完整保留在浏览器历史记录里;
  • URL 地址可以被 Bookmark;
  • 回退刷新时是无害的
  • 默认不会主动缓存;
  • 不会保留浏览器历史记录;
  • 不会被Bookmark;
  • 回退刷新时会再次提交请求
  • 时间消耗
  • 产生一个 TCP 数据包;
  • 对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);
  • 产生两个 TCP 数据包;
  • 对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
  • 请求报文 第一行是:GET /uri HTTP/1.1 \r\n 第一行则是:POST /uri HTTP/1.1 \r\n
    请求编码 只进行 url 编码(application/x-www-form-urlencoded),只接受ASCII字符的数据类型 支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data),可以传输二进制数据
    传输的数据大小 URL 的长度是有限制的,通常为 2k-4k 存放在请求正文(request body)中,取决于后端配置
    时间消耗
  • 产生一个 TCP 数据包;
  • 对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);
  • 产生两个 TCP 数据包;
  • 对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
  • 请求过程
    1. 浏览器请求 TCP 连接(第一次握手)
    2. 服务器答应进行 TCP 连接(第二次握手)
    3. 浏览器确认,并发送 POST 请求头(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)
    4. 服务器返回100 Continue响应
    5. 浏览器发送数据
    6. 服务器返回 200 OK响应
    1. 浏览器请求 TCP 连接(第一次握手)
    2. 服务器答应进行 TCP 连接(第二次握手)
    3. 浏览器确认,并发送 GET 请求头和数据(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)
    4. 服务器返回 200 OK响应
    安全性 请求底层都是基于 TCP/IP 协议实现的,均为明文传输
    • 会被浏览器主动;
    • 被完整保留在浏览器历史记录里;
    • URL 地址可以被 Bookmark;
    • 回退刷新时是无害的
    • 默认不会主动缓存;
    • 不会保留浏览器历史记录;
    • 不会被Bookmark;
    • 回退刷新时会再次提交请求
    • 产生一个 TCP 数据包;
    • 对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);
    • 产生两个 TCP 数据包;
    • 对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
    • 产生一个 TCP 数据包;
    • 对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);
    • 产生两个 TCP 数据包;
    • 对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)
    • 浏览器请求 TCP 连接(第一次握手)
    • 服务器答应进行 TCP 连接(第二次握手)
    • 浏览器确认,并发送 POST 请求头(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)
    • 服务器返回100 Continue响应
    • 浏览器发送数据
    • 服务器返回 200 OK响应
    • 浏览器请求 TCP 连接(第一次握手)
    • 服务器答应进行 TCP 连接(第二次握手)
    • 浏览器确认,并发送 GET 请求头和数据(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)
    • 服务器返回 200 OK响应

    3. URL中特殊字符的处理

    URI 中的保留字不参与编码。保留字符一共有两大类:

    gen-delims:: / ? # [ ] @
    sub-delims:! $ & ' ( ) * + , ; =
    

    URI 的编码规则:把非限定范围的字符转为 16 进制,然后前面加百分号。
    如:空格字符转为十六进制是 0x20,前面再加上百分号,就是 %20。

    URL字符转义

    字符 含义 转义
    + URL 中+号表示空格 %2B
    空格 URL中的空格可以用+号或者编码 %20
    / 分隔目录和子目录 %2F
    ? 分隔实际的URL和参数 %3F
    % 指定特殊字符 %25
    # 表示书签 %23
    & URL 中指定的参数间的分隔符 %26
    = URL 中指定参数的值 %3D

    注:
    表单提交的空格转换后的编码是加号;