谈谈 HTTP 的方法

目录

方法及其作用

扩展方法

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方法允许客户端在最终将请求发送给服务器时查看它变成什么样了,可以查看原始报文是否被损坏或者修改了;主要用于诊断,验证请求是否如愿传输到终点
CONNECTHTTP/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',
}
  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子味的冰淇淋~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值