HTTP方法的详解

GET 系列请求

GET

GET方法用来请求访问已被URL识别的资源

DELETE

从服务器上删除某些资源文件

HEAD

只想获取服务器返回的响应头信息(响应主体内容不需要获取)

POST系列请求

POST
PUT 向服务器中增加指定的资源文件

不管是哪一种请求方式,客户端都可以把信息传递给服务器,服务器也可以把信息返回给客户端,只是GET系列一般以获取为主(给的少,拿的多)而POST系列一般以推送为主(给的多,拿回来的少)

  • 我们想获取新闻列表信息(动态展示的信息),一般使用GET请求,因为只需要向服务器端发送请求,告诉服务器端我们想要什么,服务器端就会把需要的数据返回
  • 在实现注册功能的时候,我们需要把客户输入的信息发送给服务器进行存储的时候,服务器一般返回成功机或者失败,此时我们一般基于POST请求完成的。
GET和POST系列请求,在项目在项目实战中有很多区别
1 GET传递给服务器内容一般没有POST请求传递给服务器的内容多
原因:GET请求传递给服务器内容一般都是基于url地址问号传递参数的,来实现的。而POST请求一般都是基于‘设置请求主体’来实现的。各大浏览器都有自己的最大URL长度的限制(谷歌:8KB,火狐:7KB IE:2KB),超过限制长度的部分,浏览器会自动截取,导致传递给服务器的数据缺失

理论上POST请求通过请求主体传递是没有大小限制的。真实项目为了保证传输的速率,我们也会限制大小(比如,上传图片或者资料我们都会做大小限制)

2 GET请求很容易出现缓存(这个缓存不可控:一般我们都不需要),而POST不会出现缓存(除非自己做特殊处理,一般不会做)
原因:GET是通过URL问号传参传递给服务器信息,而POST设置请求主体

设置请求主体不会出现缓存,而URL就会


setTime(()=>{
    
    ajax({
        url:'getList?lx=news'
        
        .......
        
        success:result=?
        
    //第一次请求数据回来,间隔一分钟后,浏览器又发送一次请求,但是新发送的请求,不管是地址还是传递的参数都
    和第一次一样,浏览器很有可能把上一次数据获取,而不是获取最新的数据
    })
})

解决方案:

setTime(()=>{
    
    ajax({
        url:'getList?lx=news&_='+Math.random()
        
        .......
        
        success:result=?

每一次重新请求的时候,在URL的末尾追加一个随机数,保证每一次请求的地址不完全一致,就可以避免是从缓存中读取的数据.

3 GET请求没有POST请求安全,(POST只是相对安全)
原因是GET是URL传参

POST

POST方法用来传输实体的主体。
虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法;虽然GET方法和POST方法很相似,但是POST的主要目的并不是获取响应的主体内容。
POST请求的主体可以包含非常多的数据,而且格式不限。下面举一个例子:
xhr.open(“post”,“01.php”,true);
发送POST请求的第二步就是向send方法中传入某些数据,由于XHR最初的设计是为了处理XML,因此也可以在此处理XML DOM文档,传入的文档经过序列化之后将作为请求主体被提交到服务器。

POST和PUT区别

有的观点认为,应该用POST来创建一个资源,用PUT来更新一个资源;有的观点认为,应该用PUT来创建一个资源,用POST来更新一个资源;还有的观点认为可以用PUT和POST中任何一个来做创建或者更新一个资源。这些观点都只看到了风格,争论起来也只是争论哪种风格更好,其实,用PUT还是POST,不是看这是创建还是更新资源的动作,这不是风格的问题,而是语义的问题

首先引入副作用和幂等的概念

副作用是指对服务器上的资源做出改变,搜索是无副作用的,注册是无副作用的

幂等是指发送M和N次请求(两者不同都大于1),服务器上的资源的状态一直,比如注册10个账号和11个账号是不幂等的,
对文章进行更改10次和11次是幂等,因为前者多了一个账号(资源),后者只是更新同一个资源

在HTTP中,PUT被定义为幂等的方法,POST则不是,这是一个很重要的区别

举一个简单的例子,假如有一个博客系统提供一个Web API,模式是这样http://superblogging/blogs/post/{blog-name},很简单,将{blog-name}替换为我们的blog名字,往这个URI发送一个HTTP PUT或者POST请求,HTTP的body部分就是博文,这是一个很简单的REST API例子。我们应该用PUT方法还是POST方法?取决于这个REST服务的行为是否是idempotent的,假如我们发送两个http://superblogging/blogs/post/Sample请求,服务器端是什么样的行为?如果产生了两个博客帖子,那就说明这个服务不是idempotent的,因为多次使用产生了副作用了嘛;如果后一个请求把第一个请求覆盖掉了,那这个服务就是idempotent的。前一种情况,应该使用POST方法,后一种情况,应该使用PUT方法

GET和POST的区别
GET和POST本质上就是TCP连接,没有差别,但是由于HTTP的规定和浏览器/服务器的限定导致他们在应用过程中体现出一些不同

首先引入副作用和幂等的概念

副作用是指对服务器上的资源做出改变,搜索是无副作用的,注册是有副作用的

幂等是指发送M和N次请求(两者不同都大于1),服务器上的资源的状态一直,比如注册10个账号和11个账号是不幂等的,对文章进行更改10次和11次是幂等,因为前者多了一个账号(资源),后者只是更新同一个资源

GET,PUT,DELETE都是幂等操作,而POST不是,以下进行分析:

首先GET请求很好理解,对资源做查询多次,此实现的结果都是一样的。 
PUT请求的幂等性可以这样理解,将A修改为B,它第一次请求值变为了B,再进行多次此操作,最终的结果
还是B,与一次执行的结果是一样的,所以PUT是幂等操作。 
同理可以理解DELETE操作,第一次将资源删除后,后面多次进行此删除请求,最终结果是一样的,将资源删除掉了。

POST不是幂等操作,因为一次请求添加一份新资源,二次请求则添加了两份新资源,多次请求会产生不同的结果,
因此POST不是幂等操作。
在规范的应用上说GET多用于无副作用,幂等的场景,例如搜索关键了。POST多用于副作用,不幂等的场景,例如注册
GET产生一个数据包,POST产生两个数据包?

HTTP协议中没有明确说明POST会产生两个TCP数据包,而且实际测试发现,header和body不会分开发送

所以header和body分开发送只是部分浏览器和框架的请求方法,不属于POST必然行为

对于GET方式,浏览器会把http header和data一并发送出去,然后返回200

对于POST来说,浏览器先发送header,服务器响应100 浏览器在发送data。返回200

对染POST需要两步,开起来GET更高效,但是不能用GET来代替POST来优化网络性能:

  • GET和POST都有自己的语义,不能随便混用
  • 在网络环境好的情况下,发一次包和发两次包的时间差别基本可以无视,而在网络差的情况下,两次包的TCP在验证数据包的完整性,有非常大的优点
  • 并不是所有浏览器都会在POST中发送两次包。Firefox就只发送一次
GET请求能缓存,POST不能
POST相对GET安全一点点,因为GET请求都包含在URL中(当然你也可以写在body里面),且被浏览器保存历史记录,POST不会,但是在抓包的情况下都是一样的
URL长度限制,会影响GET请求,但是这个是有浏览器规定的

因为GET的请求都包含在URL中,URL无限长,对浏览器解析不友好。

POST支持更多的编码类型且不对数据类型限制

GET只允许ASCII POST没限制,也允许二进制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值