# GET和POST的区别 超文本传输协议`HTTP`的设计目的是保证客户端与服务端之间的通信,`HTTP`协议的工作方式是客户端与服务端之间的请求响应,在客户端与服务端进行请求响应时最常用的两种方法就是`GET`与`POST`。 ## 区别 * `GET`是安全的、幂等的,而`POST`是 不安全的、不幂等的。 * `GET`在浏览器回退或者刷新时是无害的,而`POST`会再次提交数据请求。 * `GET`产生的`URL`地址可以作为书签保存,而`POST`不行。 * `GET`请求会被浏览器主动`cache`,而`POST`不会主动缓存。 * `GET`请求只能进行`url`编码,而`POST`支持多种编码方式。 * `GET`请求参数会被完整保留在浏览器历史记录里,而`POST`中的参数不会被保留。 * `GET`请求在`URL`中传送的参数长度受`URL`长度限制,而`POST`的大小取决于后端配置。 * `GET`参数只接受`ASCII`字符的数据类型,而`POST`没有限制,可以传输二进制数据。 * `GET`比`POST`更不安全,因为参数直接暴露在`URL`上,所以不适合传递敏感信息。 * `GET`参数通过`URL`传递,直接可见,`POST`的参数放在`Request body`中,不直接可见。 ## 详解 上述的区别都是`GET`与`POST`在浏览器中的具体实现上的区别,例如现在广泛使用的`Promise`就是各种对于`Promise/A+`的规范`promisesaplus.com`的实现,在`HTTP/1.1`的规范的征求意见稿`RFC`中提到了语义这个词语,语义定义了一个类型的请求应该具有什么样的,例如`GET`的语义就应该是获取资源,`POST`的语义就是修改资源,如果在符合语法的前提下实现违背语义的行为也是可以做到的,例如使用`GET`修改资源或者使用`POST`获取资源,甚至使用`GET`发送`body`(这需要服务端能够配合解析),这是合法的请求但是这是不符合语义的请求,而且很有可能会带来一些副作用,所以在本质上`GET`与`POST`的区别是其语义的区别,甚至可以理解为`GET`与`POST`并没有什么区别,只要客户端与服务端能够配合发送与接收即可,一个敢发一个敢收就可以了,而上文所述的区别主要是在浏览器中具体实现上的区别。 关于安全性与幂等性,安全性是指访问接口时不会对服务端资源状态发生改变,幂等性是指对于同一接口的`URI`多次访问时,得到的资源状态是相同的。 * `GET`: 安全的,幂等的,用于读取资源。 * `POST`: 不安全的,不幂等的,用于服务端自动产生的实例号创建资源,更新部分资源。 * `PUT`: 不安全的,幂等的,用于客户端的实例号创建资源,更新资源。 * `DELETE`: 不安全的,幂等的,用于客户端实例号删除资源。 在浏览器点击后退操作时,如果将要返回的页面是`GET`请求的,那么将会安全的进行回退,如果将要返回的页面是`POST`请求的,例如使用`