目录
方法及其作用
扩展方法
GET 和 POST 的区别
PUT 和 POST 都是给服务器发送新增资源,有什么区别?
PUT和PATCH都是给服务器发送修改资源,有什么区别?
方法及其作用
- HTTP/0.9 只有1种请求方法:GET
- HTTP/1.0 新增请求⽅法:POST 和 HEAD
- HTTP/1.1 新增请求⽅法:OPTIONS, PUT, DELETE, PATCH, TRACE 和 CONNECT
方法 | 作用 |
GET | 通常⽤于请求服务器发送某些资源 |
POST | 向服务器输入数据,通常用来支持 HTML 的表单,表单填好的数据由服务器发送到其他地方 |
HEAD | 与 GET 类似,但是响应中只返回首部,不会返回实体的主体部分。通常用于在不获取资源的情况下对资源进行检查,比如下载⼀个⼤⽂件前先获取其⼤⼩再决定是否要下载, 以此可以节约带宽资源 |
PUT | 发送资源到服务器,并存储在指定位置,要求客户端提前知道该位置,HTML 表单不支持 |
OPTIONS | 用于询问服务器通常支持哪些方法,允许客户端查看服务器的性能 |
DELETE | 请服务器删除请求URL所指定的资源,但是客户端无法保证一定删除,服务端可以不通知客户端并撤销请求 |
PATCH | ⽤于对资源进⾏部分修改 |
TRACE | 客户端发送的HTTP请求在传输过程中可能会修改,trace方法允许客户端在最终将请求发送给服务器时查看它变成什么样了,可以查看原始报文是否被损坏或者修改了;主要用于诊断,验证请求是否如愿传输到终点 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道⽅式的代理服务器 |
扩展方法
- Lock 允许用户锁定资源,其他人不能更改
- Mkcol 允许用户创建资源
- Copy 便于在服务器上复制资源
- Move 在服务器上移动资源
上述方法便于用 HTTP 将 web 内容发布到 web 服务器上
GET 和 POST 的区别
- 数据传输方式不同:GET 请求通过 URL 传输数据,⽽POST的数据通过请求体传输
- 大小不同:GET 提交的数据比较少,因为 GET 是附在 URL 之后的,而 URL 会受不同环境的限制大小;而 POST 可以传送更多数据
- 安全性不同:POST 的数据因为在请求主体内,可以进行多种编码加密,所以有⼀定的安全性保证;⽽ GET 的数据在 URL 中,只能进行 URL 编码,通过历史记录,缓存很容易查到数据信息
- 数据类型不同:GET 只允许 ASCII 字符,⽽ POST ⽆限制
- 数据包,GET 产生1个 TCP 数据包,POST 产生2个 TCP 数据包;GET 请求,浏览器会把HTTP header 和数据一并发送出去,服务器响应200;对于 POST 请求,浏览器先发送header,服务器响应100,然后浏览器发送数据,服务器返回200
- GET无害: 刷新、后退等浏览器操作GET请求是⽆害的,POST可能重复提交表单
补充:POST 为什么要分成两个数据包发送请求?
其实这么说不够严谨,这是由客户端对 GET 和 POST 的策略决定的。目的是为了避免浪费资源,如带宽、传输时间等。客户端发送 header 的时候添加 expect 100 探探路,如果失败了就不用继续发送 data,从而减少资源浪费。
PUT 和 POST 都是给服务器发送新增资源,有什么区别?
- PUT ⽅法是幂等的,⽽ POST ⽅法是⾮幂等的。
- 通常情况下,PUT 的 URI 指向是具体单⼀资源,⽽ POST 可以指向资源集合。
幂等是指同⼀个请求⽅法执⾏多次和仅执⾏⼀次的效果完全相同
举个例⼦,我们在开发⼀个博客系统,当我们要创建⼀篇⽂章的时候往往⽤ POST https://www.jianshu.com/articles ,这个请求的语义是,在 articles 的资源集合下创建⼀篇新的⽂章,如果我们多次提交这个请求会创建多个⽂章,这是⾮幂等的。
⽽ PUT https://www.jianshu.com/articles/820357430 的语义是更新对应⽂章下的资源(⽐如修改作者名称等),这个 URI 指向的就是单⼀资源,⽽且是幂等的,⽐如你把『刘德华』修改成『刘亦菲』,提交多少次都是修改成『刘亦菲』。
ps: 『POST表示创建资源,PUT表示更新资源』这种说法是错误的,两个都能创建资源,根本区别就在于幂等性。
PUT和PATCH都是给服务器发送修改资源,有什么区别?
PUT 和 PATCH 都是更新资源,⽽ PATCH ⽤来对已知局部资源进⾏更新。
⽐如我们有⼀篇⽂章的地址 https://www.jianshu.com/articles/820357430
,这篇⽂章可以表示为:
article = {author: 'dxy',creationDate: '2019-6-12',content: '温暖和煦的一天',id: 820357430
}
当我们要修改⽂章的作者时,我们可以直接发送PUT https://www.jianshu.com/articles/820357430
,这个时候的数据应该是:
{author:'Jasmine',creationDate: '2019-6-12',content: '温暖和煦的一天',id: 820357430
}
这种直接覆盖资源的修改⽅式应该⽤put,但是你觉得每次都带有这么多⽆⽤的信息,那么可以发送 PATCH https://www.jianshu.com/articles/820357430
,这个时候只需要:
{author:'Jasmine',
}