文档章节

get、post的区别

o
 osc_nd0lr8gs
发布于 2019/03/25 17:19
字数 1254
阅读 18
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

Get、post请求的区别

前言

不论是get还是post方式,都是属于http协议,只是http的两种不同的传输方式,而http协议是基于TCP传输协议的,所以无论是get还是post,在传输层的意义上来说是完全一样的。使用哪一种方式,由技术指定,结合不同的情况择优选择

 

一、传参方式的区别

GET请求会将参数跟在URL后进行传递,POST请求则是作为HTTP消息的实体(放在request body中)内容发送给WEB服务器。

疑问:使用get方式是否可以将参数写在request body中,使用post是否可以将参数写在url中?

答案是可以的,但是不同的服务器处理的方式也是不同的,但有些服务器会忽略get服务中的requestbody数据,有而些服务器可以读出来,所以不一定能被接收到,所以正常情况下还是得尊重行为准则。

 

二、发送数据大小区别

GET的请求长度受限于浏览器和web服务器,如IE对URL长度的限制是2083字节(2K+35)。其他浏览器(如火狐、谷歌)对GET的请求的长度会比IE长,但是,还是有限制。

POST发送数据受限于服务端设置,比GET长得多,PHP默认POST的最大长度为8M。

疑问:限制的原因?

控制数据运输成本以及服务器成本,限制2k大小其实也只是个不成文的规定,因为如果超过2K,服务器可能直接丢弃不处理,与http协议是没有关系的,具体可以使用postman模拟

 

三、安全性的区别

POST请求相对于GET请求来说,会安全一些,因为GET发送的数据可以从url中看出来,而浏览器本身会缓存GET方式的请求

比如登录的时候,如果用get请求方式,那么请求的地址就是http://127.0.0.1/login.php?username=用户名&password=密码,用户名和密码都体现在url中了,其他人就可以从浏览器的历史记录中读取到这些数据,这样,账户密码就被人知道了,会带来安全问题(也就是敏感信息泄漏),POST方式就不存在这个问题(不会出现在浏览器的历史记录中)

 

补充:安全是相对的,http传输属于明文传输,在传输过程的任何一个节点,都有可能被截获,因此就需要加上传输加密,如对称加密、非对称加密等安全加密方式传输~get还受限于浏览器URL的自动转码,对于有歧义的字符,URL会进行自动转码处理

 

 

四、性能上

1、get会将数据缓存起来,而post不会,所以,加载静态资源(如图片、js这类)都是用get请求,浏览器会缓存这些资源,第二次加载的时候,会快很多

 

2、post会别get慢一些(原因可以让他们自己去百度,不用讲,也没必要明白,原因如下:)

post在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据

post请求的过程:

1)浏览器请求tcp连接(第一次握手)

2)服务器答应进行tcp连接(第二次握手)

3)浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

4)服务器返回100 Continue响应

5)浏览器发送数据

6)服务器返回200 OK响应

get请求的过程:

1)浏览器请求tcp连接(第一次握手)

2)服务器答应进行tcp连接(第二次握手)

3)浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

4)服务器返回200 OK响应

也就是说,目测get的总耗是post的2/3左右

疑问1部分网站上说,Get请求会将header和data一次性传输到位,而Post是header和body分开发送,只有等Post发送成功后才发送body,,这个没有想明白,因为通过模拟post请求,发现没有中间没有返回过100,是否可以证明它也是一次性发送

疑问2get的效率会比post高,在小型网站中是否可以使用get来替换post以达到提高性能?

 

四、设计用途的区别

get用来查询-不操作数据,参数量小

post用来插入、更新数据 -- 安全要求高,数据量大

比喻:get像轿车,能送货,能力有限;post像货车,有货箱(请求正文)。运输量大且安全性高

 

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Redis 分片实现--Redis Shard

redis-shard 是 Redis 分区的 Python API ,基于对 key 和 key tag 进行 CRC32 checksum 计算,可参考文章 http://antirez.com/post/redis-presharding.html . 该项目由知乎网开发。 使用限制...

匿名
2012/10/24
5.6K
0
J360-cloud SpringCloud系列一:分布式配置服务器ConfigServer

j360开源博客之 ---------------------------------------------------------- J360-Cloud系列 spring-cloud快速入门工程之j360-cloud-all:(欢迎star、fork) https://github.com/xuminwl......

Hi徐敏
2015/10/08
4K
14
通过Ajax进行POST提交JSON类型的数据到SpringMVC Controller的方法

现在在做的项目用到了SpringMVC框架,需要从APP接收请求的JSON数据,为了测试方便,所以直接先用AJAX进行测试,不过刚开始用平时用的ajax方法,提交请求会出现415或者400错误,经过研究,终于...

zchuanzhao
2015/10/10
1.6W
4
Elasticsearch 2.3.0 新增:查询更新接口update-by-query

查询更新接口是2.3.0增加新接口,这个接口目前是实验性的。此接口可能会在未来的版本中改变。此接口在索引中更新每一个文档,而文档的内容并没有改变的情况下使用,这在增加新的属性或者修改...

赛克蓝德
2016/04/07
5.2K
0
LET'S DJ:web.py无缝迁移到django

DO: 前提是必须要配置好django使用jinja2模版,保持与老项目模版引擎一致。 Django通用视图最基础的类是View,其他如TemplateView、RedirectView等都继承自它,具体用法参见:Django 通用视...

cwalet
2016/04/29
281
0

没有更多内容

加载失败,请刷新页面

加载更多

什么是TypeScript?为什么我要用它代替JavaScript? [关闭]

问题: Closed . 已关闭 。 This question needs to be more focused . 这个问题需要更加集中 。 It is not currently accepting answers. 它当前不接受答案。 Want to improve this questio......

法国红酒甜
20分钟前
19
0
键盘输入限制

// 用户输入的时候替换:nativeOnInput 替换负数setInputValue(e, row, prop) { if(e.target.value.includes('-')) { e.target.value = '-'+e.target.value.replace(/-/g, ......

赤月三号
23分钟前
13
0
软件工程国家标准

软件工程国家标准分为六大类:专业基础标准、过程标准、质量标准、技术与管理标准、工具与方法标准 和 数据标准。 软考大纲将软件工程标准分为四大类:基础标准、开发标准、文档标准 和管理标...

LitStone
32分钟前
13
0
优化HBASE有感

今天终于把这一块完成了,有点慢,我告诉自己别慌,别急,慢下来。 这是产后回来做的第一个小项目,我有点急,有点慌。 起始于对HBASE一无所知的小白。 接到任务,有点头大。 先把任务分析了...

_小茗同学_
36分钟前
15
0
HashMap如何解决hash冲突

1、HashMap如何解决hash冲突? HashMap是通过 拉链法来处理冲突的 2. hash冲突的几种解决方法? 1)、开放地址法: 当 p=H(key) 出现冲突的话,那再次计算 p=H(key+1) 这样每次 加1 直到没有冲...

加油加油再加油
45分钟前
29
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部