在HTML中,form元素用method属性来指定有两种不同的提交方法,即"get"(默认值)和"post"。
1. get和post的定义
W3C的HTML 4.01 specification说,form元素的method属性用来指定发送form的HTTP方法。
- 使用get时,form的数据集(形如control-name=current-value的键值对)被附加到form元素的action属性所指定的URI后面;
- 使用post时,form的数据集(形如control-name=current-value的键值对)被包装在请求的body中并被发送。
这可以简单地理解为,get仅仅是拼接一个URI,然后直接向服务器请求数据(需要提交给服务器的数据集包含在URI中)。比如:
这个form在提交的时候,会产生这样能够一个get请求:FormGet.aspx?ProductID=1。
而post会把form的数据集,即ProductID=1这个键值对包装在请求的body中,发送给服务器,然后向服务器请求数据。对于:
这样一个form在提交时,我们将看到一个干净的URI:FormPost.aspx。因为数据不是拼接在URI中。
2. get和post的区别
2.1 安全性
如果用get提交一个验证用户名和密码的form,一般认为是不安全的。因为用户名和密码将出现在URL上,进而出现在浏览器的历史记录中。显然,在对安全性有要求的情况下,应该使用post。
2.2 编码
HTML 4.01 specification指出,get只能向服务器发送ASCII字符,而post则可以发送整个ISO10646中的字符(如果同时指定enctype="multipart/form-data"的话)。
注意get和post对应的enctype属性有区别。enctype有两个值,默认值为application/x-www-form-urlencoded,而另一个值multipart/form-data只能用于post。
2.3 提交的数据的长度
HTTP specification并没有对URL长度进行限制,但是IE将请求的URL长度限制为2083个字符,从而限制了get提交的数据长度。测试表明如果URL超出这个限制,提交form时IE不会有任何响应。其它浏览器则没有URL的长度限制,因此其它浏览器能通过get提交的数据长度仅受限于服务器的设置。
而对于post,因为提交的数据不在url中,所以通常可以简单地认为数据长度限制仅受限于服务器的设置。
2.4 缓存
由于一个get得到的结果直接对应到一个URI,所以get的结果页面有可能被浏览器缓存。而post一般则不能,参考5。
2.5 引用和SEO
出于和上面相同的原因,我们可以用一个URI引用一个get的结果页面,而post的结果则不能,所以必然不能被搜索引擎搜到。
3. 服务端的处理
在服务端的ASP.NET程序中,对于get,我们用Request.QueryString[control-name]来取得对应的=current-value;对于post,我们用Request.Form[control-name]。
我们也可以笼统地使用Request[control-name]。但这样做的效率不如前者。我们可以用下面的程序比较Request.QueryString和Request的效率:
<script runat="server"> <br /> protected void Page_PreInit(object sender, EventArgs e) <br /> { <br />if(Request["InputString"] != null) <br /> { <br />int count = 1000000; <br /> DateTime start; <br /> DateTime end; <br /> string value = ""; <br /> start = DateTime.Now; <br />for(int i = 0;i < count;i++) <br /> { <br /> value = Request.QueryString["InputString"]; <br /> } <br /> end = DateTime.Now; <br />double requestGet = (end - start).TotalSeconds; <br /> start = DateTime.Now; <br />for(int i = 0;i < count;i++) <br /> { <br /> value = Request["InputString"]; <br /> } <br /> end = DateTime.Now; <br />double request = (end - start).TotalSeconds; <br /> compare.InnerHtml = requestGet.ToString() + " / " + request.ToString() + " = " + (requestGet / request).ToString(); <br /> get.InnerHtml = value; <br /> } <br /> } <br /></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Request.QueryString / Request
Get:
Request.QueryString / Request:
同样的办法我们可以比较Request.Form和Request。
最后得到的结果(Request.QueryString[control-name] / Request[control-name]和Request.Form[control-name] / Request[control-name])大多数时候是小于1的。因此,我们因该尽量用Request.QueryString或Request.Form来代替Request。
4. 正确地使用get和post
W3C的官方建议是:当且仅当form是幂等(idempotent)的时候,使用get。幂等是一个数学上的术语,其定义是:对于一个函数f : D -> D,如果D中的所有x满足f (f x) = f x,那么这个函数是幂等的。HTTP specification(比如RFC 2616)中,将幂等解释为:多次相同请求产生的副作用,和一次请求的副作用相同。
打个比方,如果你提交一个form会从Google上查询一个关键词,那么我们可以认为这个form是幂等的,因为1次提交和10次提交的副作用是差不多的(10次查询可能会多消耗一些电能);如果你提交一个form是订购一个终极大黄蜂(Utimate bumblebee),那么这就不是幂等的:要是你不小心多提交了1次form的话,你可能会被老婆乱骂,你不小心又提交了10次的话,你可能就破产了——一次提交和多次提交的副作用明显不同,所以这不是幂等的。
所以,一般来说,如果提交这个请求纯粹只是从服务端获取数据而不进行其他操作,并且多次提交不会有明显的副作用,应该使用get。比如:
如果提交这个请求会产生其它操作和影响,就应该使用post。比如:
- 修改服务器上数据库中的数据;
- 发送一封邮件;
- 删除一个文件。
另一个要考虑的因素是安全性。见2.1。
5. 浏览器差异
- IE 6:URL长度限制为2083个字符;post之后,刷新页面不会自动重新post数据,会出现警告;
并且,在后退的过程中有可能出现“Page has Expired”(通常是向自己post,然后后退时):
微软的技术支持人员号称“this is not a bug or problem specified to the ASP.NET but a security feature of the IE Browser”,并且说“You can also inform your users of this”,实在是荒唐。另外,一篇KB也提到这个问题,说将Response.CacheControl设为"Public"即可,经测试仅在第一次后退时有效。 - IE 7:和IE 6相同;
- Firefox 2.0.0.11:刷新页面不会自动重新post数据,会出现警告;
- Opera 9.24:正常(自动post数据);
- Safari 3.0.4:post之后,刷新页面、前进、后退都不会自动重新post数据,会出现警告。
6. 参考
分享到:
相关推荐
NULL 博文链接:https://lukejin.iteye.com/blog/591646
C# 使用Get和Post请求获取数据,Get Post 请求, POST传值
一个很简单很实用的将html中的a标签的get提交转换成form的post提交的小插件
本资源是一个封装类,采用异步方式解决了Wininet不能设置超时的问题,当前异步采用C++...MFC程序中通过HttpGet和HttpPost方式向WebService发送请求,WebService以Json的方式返回数据,MFC程序解析Json,得到指定数据。
C#-HTTP请求(Post,GET,表单)
post和get 方法的比较 ? Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法。二者主要区别如下:
对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。 get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。 get...
1.网页打不开的post不了,不存在的属性post不了,属性不区分大小写 ...3.get模式下url=不能少 4.header 200表示响应成功,post 的内容要用web services readpostdata,两个VI一起打开,然后点击web开始就可以了
实验一:HTTP协议POST 实验目的 通过ajax实例深入理解http协议之post方法。 二、实验用到的工具软件 ...<form action="a2.php" name="form1" method="post"> 姓名: 年龄: <input type="submit" value="
Power Builder 12.5,使用ole MSXML2.ServerXMLHTTP方式,对接WEB API,以选用JSON和x-www-form-urlencoded方式提交数据,POST/GET方式均可。
Form提供了两种数据传输的方式—get和post,Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法,感兴趣的朋友可以了解下,或许对你学习get/post有所帮助
如下所示: form表单ID:postform 设置表单请求url document.postform.action = SaveReturnInfo...以上就是小编为大家带来的js 提交form表单和设置form表单请求路径的实现方法全部内容了,希望大家多多支持软件开发网~
1 method是指定数据如何发送到服务器的一个属性 2 只可能是post和get post:官方解释是把数据通过post会话传送到服务器。实际就是提交数据。 get:将表单中数据的按照variable=value的形式,添加到action所指向的URL...
今天小编就为大家分享一篇基于Django URL传参 FORM表单传数据 get post的用法实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
java HttpClient 发送GET请求和带有表单参数的POST请求教程例子
参看文档:http://blog.csdn.net/sinat_29398599/article/details/52880036
Java 发送get,post请求的工具类,支持小文件发送
Retrofit Okhttp辅助类的简单封装,vesion 1.0.X 实现了Get,Post-Form、Post-Json 三种形式的网络请求,后续版本会实现文件上传下载and各类raw的请求方式。
C#-HTTP请求接收(Post数据流,GET,表单)