网络请求中GET和POST的区别

news/2024/6/18 22:34:53 标签: http, https, 网络, 万维网, 网址

get和post是HTTP与服务器交互的方式,URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,其实总共有四种:put,delete,post,get。它们的作用分别是对服务器资源的增、删、改、查。所以,get是获取数据,post是修改数据。但是现在只用一个方式就可以做增删改查的操作。

getpost
用途从服务器上获取数据信息用于修改服务器上的资源的请求,向服务器传送数据
本质发送请求和接收结果
浏览器请求后退/刷新无害,后退/刷新则会导致重新提交数据,会再次提交请求。
书签可被收藏,产生的URL地址可以被Bookmark书签不可收藏
缓存能被缓存,请求会被浏览器主动cache请求不能被缓存,  无法使用缓存文件(更新服务器上的文件或数据库),除非手动设置
编码类型application/x-www-form-url常见encodedapplication/x-www-form-urlencoded或multipart/form-data
历史参数保留在浏览器历史中,请求参数会被完整保留在浏览器历史记录里参数不会保存在浏览器历史中,不会被保留
地址通过我们自己做的网站也是可以追踪到,GET提交的数据,用户名和密码将会明文出现在URL上,这样就给一些人一个机会,当别人拿到你的账号和密码之后后果不堪设想,把参数包含在URL中通过request body传递参数
发送格式    get把请求的数据放在url上,即HTTP协议头上,其格式为:
    以?分割URL和传输数据,参数之间以&相连。
    数据如果是英文字母/数字,原样发送,
    如果是空格,转换为+,
    如果是中文/其他字符,则直接把字符串用BASE64加密,及“%”加上“字符串的16进制ASCII码”。
    post把数据放在HTTP的包体内(requrest body)
get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。因为get设计成传输小数据,而且最好是不修改服务器的数据,所以浏览器一般都在地址栏里面可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。post一般都用来传递大数据,或比较隐私的数据,所以在地址栏看不到,能不能看到不是协议规定,是浏览器规定的。
TCP包产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
数据长度有限制(url限制2k=2048个字符)(原则上url长度无限制,那么get提交的数据也没有限制咯?限制实际上取决于浏览器,(大多数)浏览器通常都会限制url长度在2K个字节,即使(大多数)服务器最多处理64K大小的url。也没有卵用。post理论上无限制。理论上,IIS4中最大量为80KB,IIS5中为100KB(只不过要修改form里面的那个type参数)
只允许ASCII字符的参数的数据类型,只能进行url编码没有限制,也允许二进制数据,发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠,而POST支持多种编码方式
被强制服务器支持
• 浏览器对URL的长度有限制,所以GET请求不能代替POST请求发送大量数据
• GET请求发送数据更小
服务器端用Request.QueryString获取变量的值服务器端用Request.Form获取提交的数据
安全性请求是不安全的,

所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

* 注意:这里安全的含义仅仅是指是非修改信息。

相对安全(如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。)
幂等性幂等(意味着对同一URL的多个请求应该返回同样的结果)
效率

如图1,网络世界中,TCP就像汽车,使用TCP来运输数据非常可靠,几乎不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那将会引起混乱,送急件的汽车可能被前面满载货物的汽车堵在路上,造成整个交通系统瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输规定了好几种运输服务类型(车型),有GET, POST, PUT, DELETE等等,当执行GET请求的时候,要选择GET的车型(设置method为GET),即平板车型,这样就可以把传送的数据放在开放式车厢(url)中以方便记录。如果是POST请求,就要选择POST的车型,并把货物放在封闭式车厢里。当然,你也可以在GET的时候将货物包裹起来不让被人看到;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP相当于运输服务订单,规定了运输服务的输入输出,只是一个行为准则,而TCP才是GET和POST怎么实现的根本。HTTP对GET和POST参数的传送渠道(url还是requrest body)提出了要求。“标准答案”里关于参数大小的限制又是从哪来的呢?网络世界中,还有另一个重要的角色:运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司。虽然理论上,你可以在车顶上无限堆货物(url中无限加参数)。但运输公司需要通过调整装货和卸货量来控制成本和降低风险,方式就是限制单次运输量,数据量太大对浏览器和服务器都是很大负担。

https://img-blog.csdnimg.cn/19e87b03ee7847a78818be2faefc362f.png" width="1200" />关于数据传输量的规定,有一种说法是大多数浏览器通常都会限制url长度在2000Bytes,而大多数服务器最多处理64000大小的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需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这可能是一个坑,需谨慎使用,原因如下:

1. GET与POST都有自己的语义,不能随便混用。

2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以忽略。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

参考资料链接:

GET和POST两种基本请求方法的区别 - 不断努力的青春 - 博客园


 


http://www.niftyadmin.cn/n/800450.html

相关文章

WebDAV服务漏洞利用工具DAVTest

WebDAV服务漏洞利用工具DAVTestWebDAV是基于Web服务的扩展服务。它允许用户像操作本地文件一样,操作服务器上的文件。借助该功能,用户很方便的在网络上存储自己的文件。为了方便用户使用,通常会提供给用户较大的文件权限,如上传、…

java 泛型 视频_JavaSE系列视频课程之泛型和内部类(七)

1)编写代码更加方便2)增加安全性二、声明1)在类上声明类名如果多个,使用逗号隔开在整个类中都可以使用,除了静态方法2)在方法上声明返回值类型如果多个,使用逗号隔开在方法上的泛型仅在方法中有效方法的返回值,方法参数,方法一次都可以使用泛型3)范围约束三、赋值1)类上泛型赋值…

第 7 章 处理文本数据【Python机器学习基础教程】

第 7 章 处理文本数据 表示数据属性的三种类型的特征: 1)连续特征:用于描述数量; 2)分类特征:固定列表中的元素; 3)文本特征: 如果我们想要判断一封电子邮件是合法邮件还是垃圾邮件,那么邮件内容一定会包含对这个分类任务非常重要的信息。我们可能想要了解一位政治…

jquery中bind和live方法的差别

差别:.bind()是直接绑定在元素上.live()则是通过冒泡的方式来绑定到元素上的。更适合列表类型的,绑定到document DOM节点上。和.bind()的优势是支持动态数据。.delegate()则是更精确的小范围使用事件代理,性能优于.live().on()则是最新的1.9版…

Java数字小游戏

最近看到网络视频上有一些有趣的小游戏,于是想到用Java代码实现一下: 游戏玩法:由计算机随机产生1~100的整数。用户猜测计算机产生的数字(即答案),用户输入数字,如果输入的数字与答案相同则获胜…

[C++ Primer] 第3章: 字符串, 向量和数组

标准库类型string string初始化 string s2(s1); string s2 s1; string s3("value"); string s3 "value"; string s4(n, c); // n个连续的c组成的字符串 读写string对象 读写未知数量的string对象 int main() {string word;while(cin >> word)cout…

Chrome浏览器安装路径移动与错误代码释义

一、Chrome移动安装路径方法 在安装软件的时候,软件一般会在安装之前提示用户配置自定义安装路径,但是Chrome浏览器(Chrome)居然没有提供自定义安装路径设置,即下载好Chrome后点击安装,直接默认安装在C盘&a…

java 接口 练习题_Java接口练习题

1.说出下面程序的执行结果:interface InterfaceA{String S "good ";void f();}abstract class ClassA{abstract void g();}class ClassB extends ClassA implements InterfaceA{void g(){System.out.print(S);}public void f(){System.out.print(" " S);}…