NOTE
2.8 HTTP方法
1. 什么是HTTP方法 HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。 HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法 2. HTTP方法性质 2.1. 安全 指的是是否只读的。 GET, HEAD, OPTIONS 和 TRACE 这几个方法是安全的
这是历史学习笔记,可能存在过时或不完整的理解。
1. 什么是HTTP方法
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。 HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | GET | 请求指定的页面信息,并返回实体主体。 |
| 2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
| 3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
| 4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
| 5 | DELETE | 请求服务器删除指定的页面。 |
| 6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
| 7 | OPTIONS | 允许客户端查看服务器的性能。 |
| 8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
| 9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
2. HTTP方法性质
2.1. 安全
指的是是否只读的。 GET, HEAD, OPTIONS 和 TRACE 这几个方法是安全的
2.2. 幂等
- 同一个请求方法执行多次和仅执行一次的效果完全相同,引入幂等的原因是为了处理同一个请求重复发送的情况。
- HTTP GET 方法用于获取资源,不应有副作用,所以是幂等的。比如:
GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是 N 次 都没有副作用 - HTTP HEAD 和 GET 本质是一样的,区别在于 HEAD 不含有呈现数据,而仅仅是 HTTP 头信息,不应有副作用,也是幂等的。HEAD 方法可以用来做探活使用。
- HTTP OPTIONS 主要用于获取当前 URL 所支持的方法,所以也是幂等的。若请求成功,则它会在 HTTP 头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
- HTTP DELETE 方法用于删除资源,有副作用,但它应该满足幂等性。比如:
DELETE http://www.forum.com/article/4231,调用一次和 N 次对系统产生的副作用是相同的,即删掉 ID 为 4231 的帖子。因此,调用者可以多次调用或刷新页面而不必担心引起错误。 - HTTP POST 方法用于创建资源,所对应的 URI 并非创建的资源本身,而是去执行创建动作的操作者,有副作用,不满足幂等性。比如:
POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖子,HTTP 响应中应包含帖子的创建状态以及帖子的 URI。两次相同的 POST 请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST 方法不具备幂等性。 - HTTP PUT 方法用于创建或更新操作,所对应的 URI 是要创建或更新的资源本身,有副作用,它应该满足幂等性。比如:
PUT http://www.forum/articles/4231的语义是创建或更新ID 为 4231 的帖子。对同一 URI 进行多次 PUT 的副作用和一次 PUT 是相同的;因此,PUT 方法具有幂等性
2.3. 可缓存的
一个方法是否可以被缓存,此RFC里GET,HEAD和某些情况下的POST都是可缓存的
3. POST如何防止表单重复提交
进入到表单页面的时候调用后端的一个接口返回token放到隐藏域中一起提交,后端校验Redis中是否存在,存在则删除并提交;不存在则报错已提交
4. GET VS POST
| GET | POST | |
|---|---|---|
| 语义 | 请求获取指定的资源 | 根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同 |
| 安全 | √ | × |
| 幂等 | √ | × |
| 可缓存 | √(除非有 Cache-Control Header的约束) | × (大部分实现) |
| 参数位置 | 拼接在URL?号后面 | 放在body里 |
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看