GET和POST的区别

GET和POST请求的区别是一个老生常谈的问题,做个笔记汇总一下:

相同点

  1. 都是HTTP协议的一种请求类型。

    HTTP协议请求类型有以下几种:

    • GET:向特定的资源发出请求。
    • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
    • PUT:向指定资源位置上传其最新内容。
    • DELETE:请求服务器删除Request-URI所标识的资源。
    • PATCH: 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
    • TRACE:回显服务器收到的请求,主要用于测试或诊断。
    • OPTIONS:返回服务器针对特定资源-所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
    • HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息
    • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

以上这些类型常见的就是GET和POST,RESTful风格的API会用到 PUT、DELETE、PATCH,其他方法使用不多。
网上有说8种的也有说15种的,我找了下比较权威的是以上9种
文档链接: HTTP 请求方法

不同点

  1. 携带参数的方式不同

    • GET会把参数携带在URL(网址)中, POST会把参数携带在Request body中
  2. 携带参数的类型不同

    • GET请求类型只能将字符串通过URL编码后传递至后台,POST可以传递文件、字符串
  3. 携带参数的大小不同

    • GET请求参数大小不同浏览器标准不同,基本2KB-8KB之间,POST最大上传大小取决服务器设置(PHP默认设置一般是8M)
  4. 请求触发机制不同

    • GET请求发生后退页面不会重载,POST请求会在后退时提示是否重新提交表单,确定后发生重载
  5. 缓存机制不同

    • 浏览器会缓存GET请求(服务端可以通过Response中禁止缓存),而POST请求不会

争议点(仅个人观点)

  1. 安全性

    • 安全性差异本质是两者参数传递方式差异,GET请求会将用户发送的敏感信息暴露下网址中,用户可能会存在误发导致泄露
  2. 是否可以被Bookmark

    • 这项差异本质还是两者参数传递方式差异,Bookmark原理就是将网址保存起来。
  3. 请求次数

    • GET请求产生一个TCP数据包(浏览器会把HTTP header和data一并发送出去,服务器响应200);
    • POST请求产生两个TCP数据包(浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200)。
    • 这个差异和浏览器有关系,另外影响很小

扯淡点

  1. POST请求会加密数据
    • 看到过很多人有过POST请求会加密参数的说法,纯属扯淡。用F12看一眼就知道了(HTTPS的情况另行讨论)

PS:

  1. 一般在做分页和搜索时会用GET请求(比如百度搜索关键词就采用GET请求传递),功能操作会使用POST请求

发表评论

电子邮件地址不会被公开。 必填项已用*标注