我是写.net的,最近客户跟我说可能要搞web API,老大让我看看http。一说http必然要扯到get和post,在网上翻阅了很多回答和博客,最后整理出此文,如有不当之处,还望指正!感激不尽!
先谈一下什么是表单,我们来看百度的官方解释:
表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。
如需知详情,请移步百度百科:https://baike.baidu.com/item/%E8%A1%A8%E5%8D%95/5380322?fr=aladdin
以下是知乎网友关于get,post的回答整理
get 与 post的区别?
1.GET请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,
POST把提交的数据则放置在是HTTP包的包体中。
2.GET的长度受限于url的长度,而url的长度限制是特定的浏览器和服务器设置的,理论上GET的长度可以无限长。
3.POST是没有大小限制的,HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力
4.在ASP中,服务端获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form。
5.POST的安全性要比GET的安全性高
application json 与form表单的区别?
瀏覽器默認的提交方式就是表單。首先,Content-Type 被指定为 application/x-www-form-urlencoded,jQuery的Ajax请求默认方式,其次,数据以键值对形式?key1=value1&key2=value2的方式发送到服务器
1、post和get的选择?
私密性的信息请求使用post。
查询信息和可以想要通过url分享的信息使用get。
作者:技能树IT修真院
链接:https://www.zhihu.com/question/28586791/answer/621747763
来源:知乎
说到底,我觉得是要正确理解“GET的页面”和“POST的页面”的区别。
要说清楚这两个区别,首先要说清楚一个概念——你输入内容的页面和没输入内容的页面是两种东西。
当你进入一个有表单的页面时,假如其URL是"http://www.haha.com",你把这个URL分享给朋友,朋友进入这个页面看到的所有内容将和你看到的一摸一样;
此时你在表单里输入你的名字,没有提交,URL还是“www.haha.com”,此时有两种情况:
1.这个表单的method值是POST。你把这个URL分享给朋友,朋友看到的是和你不一样的页面(页面表单里没有你的名字,除此之外一摸一样)。
2.这个表单的method值是GET。你把这个URL分享给朋友,朋友看到的页面和你的还是不一样(GET能本地缓存(应该没有“联网缓存”)——在某些应用里,关闭网页后再次进入,你会看到一个有你名字的表单。QQ空间网页版就是这样,你在说说处输入内容但不发布,重新打开时你还能看到那个没发布的内容。当然,你清除浏览器的Cookie和网站记录后再次进入这个页面就看不到未发布的内容了)。
现在,你把表单提交了(注意,有时候你可能都不知道自己提交了这个表单,比如百度搜索里,回车就是提交~),有两种情况:
1.表单的method是POST,URL变成了“http://www.haha.com/nimei.php”。此时页面被刷新,你的数据被提交服务器脚本返回给你一个新页面。此时就算你“后退”到“www.haha.com”也看不到你原来输入了内容的那个表单了;你把这个网页分享给朋友,朋友是看不到你的页面的(你这个页面必须是提交相同的数据后才能看到),这也是为什么你登陆微博后,直接复制地址栏的URL发给别人,别人看不到这个网页的原因。
2.表单的method是GET,URL变成了“http://www.haha.com/nimei.php?name="haha"&.....”。此时页面被刷新,同样得到一个新页面。如果你“后退”,你能看到原来输入了内容的表单;你可以保存为书签,关闭后再次打开能看到保存书签时的网页(因为URL里有你发给服务器脚本的所有数据,就相当于再次发送给服务器脚本相同的数据,返回的页面自然也就一样——服务器脚本处理这些数据得到的结果还是一样的话);你可以把这个页面分享给朋友,朋友打开后能看到一摸一样的页面(理由和书签里说的一样)
作者:坑坑
链接:https://www.zhihu.com/question/28586791/answer/276679109
来源:知乎
大家现在度娘一下,查得最多的区别,可能就是:
“Get把参数写在URL中,Post通过请求体来传参的”
“GET没有POST安全,因为Get参数直接显示在URL上”
“Get请求在URL中传送的参数是有长度限制的,而POST是没有的”
但是,真相是这样的吗?!!!真相永远只有一个!!!
![](https://pic3.zhimg.com/80/v2-a1cc4f75f487430bc15bcdec6a274e20_720w.jpg)
1、GET和POST与数据如何传递没有关系??
GET和POST是由HTTP协议定义的。那么使用哪个方式与应用层的数据如何传输是没有相互关系的。从而,HTTP就没有要求,POST一定要放到请求体里面,GET就一定要放到URL里面。
在HTML标准中,是有着类似的定义。但这只是HTML标准对HTTP协议的用法的约定。也就是规范上说,无区别。
那么,这个说法是从何而来的呢?是因为有各种浏览器等软件的实现,就变成了我们现在熟知的现象,GET要用URL传参,POST用body传参。
2、HTTP协议对GET和POST有没有对长度的限制??
HTTP协议明确地指出了,HTTP请求头和请求体都没有长度的要求。
而对于URL长度上的限制,有两方面的原因造成:
1、浏览器。
据说IE对URL长度会限制在2048个字符内。但是就我所知,firefox是支持10W以上的长度。
2、服务器。
服务器处理超长的URL本身就是一种负担,更何况遭受恶意攻击呢?
因此,多数服务器出于安全、稳定等多方面的考虑,会给URL长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。
3、安全不安全和GET、POST有没有关系??
这个问题,首先你得确认面向对象。
举个例子:
1、你现在要让我爸爸妈妈去看看这个URL,你觉得安全吗?
2、你现在要让一个刚入门的初级功能测试工程师去测试这个链接,你觉得安全吗?
3、你现在要让安全测试工程师去看看get请求,你觉得安全吗?
所以,针对不同的人群,安全的定义就会不一样。
“如果你愿意一层一层一层的剥开我的心 ,你会发现你会讶异 ,你是我最压抑 ,最深处的秘密 ”
把Get和Post剥开后,他们的本质上就是TCP链接,并无差别。
只是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
那么真相到底是什么呢?
Get产生一个TCP数据包;Post产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
对于POST,浏览器先发送header,服务器响应100(continue),然后再发送data,服务器响应200(返回数据);
![](https://pic4.zhimg.com/80/v2-4e2cf65928be46dcacdb42628186b429_720w.jpg)
链接:https://www.zhihu.com/question/28586791/answer/571627708
来源:知乎
GET幂等,POST不幂等
幂等是指同一个请求方法执行多次和仅执行一次的效果完全相同。
1.按照RFC规范,PUT,DELETE和安全方法都是幂等的。虽说是规范,但服务端实现是否幂等是无法确保的。
2.引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退/刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。
3.比如在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。
作者:silence
链接:https://www.zhihu.com/question/28586791/answer/153556269
来源:知乎