关于get请求和post请求

关于get请求和post请求

最后修改时间:a month ago

# get和post请求的参数格式

学习的路上,该踩的坑还是要踩的,再小的问题踩完就记录下来,让自己涨涨记性。

在做后台系统的项目中每次遇到请求数据时都想当然的以为参数的格式都一样,其实对于get和post请求时的参数格式是不一样的

//1.get请求

this.$http.get("接口/"+参数1+"/"+参数2+
  "/"+"参数n"
).then(res=>{
  //处理逻辑
})
1
2
3
4
5

//2.post请求

this.$http.post("接口",{
  键1:值1,
  键2:值2,
  ……
}).then(res=>{
  //处理逻辑
})
1
2
3
4
5
6
7

如果请求成功,res就是从后端获取的数据合集

# get和post的一些区别

  1. get在浏览器回退时不受影响而post会再次出发请求

  2. get请求会被浏览器自动缓存(cache),而post不会但可以手动设置

  3. get请求只支持URL编码,而post支持多种编码(

    application/x-www-form-urlencoded如果表单的 enctype 属性不设置则post默认以这种方式编码,

    multipart/form-data使用form表单上传文件时设置enctype 为这个属性即可,这种编码方式对各大服务端语言有着良好的支持,

    application/json这种编码方式大都用作请求头来告诉后端消息主体是序列化后的 JSON 字符串 ,

    text/xml 这是一种使用 HTTP 作为传输协议的编码方式是远程调用规范能很好的支持已有的 XML-RPC 服务

    )

  4. 使用get而产生的URL地址可以被Bookmark书签记录(再次访问之前访问的位置中间的一系列环节都可以略过),而post不可以

  5. get请求参数会被完整保留在浏览器历史记录里,而post中的参数不会被保留

  6. get请求在URL中传送的参数是有长度限制的,而post没有限制

  7. 对参数的数据类型,get只接受ASCII字符,而post没有限制

  8. get比post更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息

其实网络请求http的底层是 TCP/IP,而get和post的底层也是 TCP/IP ,换言之它们都是通过TCP链接的,所以它们能做的事也是一样的,如果给get加上request,给post加上url参数,在技术上是行得通的。

# 小故事

其实在万维网中, TCP就像轮船,我们用TCP来运输数据,它从不会丢失数据因此非常可靠。但是当所有运输数据的轮船都长得一模一样的时候就分不清谁是谁了。所以交通规则http就诞生了,它给轮船在运输时设定了几种服务区, 有get, post, put, delete等等 。http规定每当轮船要行使get服务区时,要给在船身贴上get标签( 设置method为get ),而且要求把数据放在最显眼的甲板位置(url中),如果要行使post服务区,就要在船身贴上post标签并且把数据放在船舱中,当然你在get服务区时也可以将数据不放在甲板,偷偷藏点放在船舱也行,虽然这样很不好。也可以傻傻在post服务区把数据放在甲板。毕竟http只负责开通服务区(get, post, put, delete等等),轮船(TCP)才是主导数据究竟是按哪种方式传输的。

而在万维网中还有一个重要的角色运输公司( 不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司 ), 你可以在甲板上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。

业界不成文的规定是,大多数浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。 如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然get可以带request body,也不能保证一定能被接收到。

所以get和post本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

# 结尾剧情反转

get和post还有一个重大区别:

get产生一个TCP数据包;post产生两个TCP数据包。

对于get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于post,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

也就是说使用get服务区,轮船只需要走一趟,而要使用post服务区,轮船要先去打一次招呼说我要走post服务区了,你安排一下,然后才会运货。

据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。 也并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

亲测有效,奔走相告!

- 全文完 -

留下一条留言?
默认颜色

主题颜色

标准颜色

更多颜色...