小议Post与Get方法提交

来源:互联网 发布:黑暗之魂3低配置优化 编辑:程序博客网 时间:2024/04/20 09:56
                                                              Post和Get的区别

从一个页面转向另一个页面的请求方式有两种,Post和Get. 
所有的人都知道如下区别: 
1.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。 
2.Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度的限制,只能传递大约1024字节. 
3.Post顾名思义,就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post的信息作为http请求的内容,而Get是在Http头部传输的。 
下面就说说页面之间传值的方法:我们的form表单的method方法,有两个,post,get.它在页面传值的时候的区别也就是上面提到的三点. 

先来看一下post方法. 
1.在页面上新建一个form,不要加上runat="server"的标志,当然在这个窗体下的控件也就不用想用Viewstate来传值了.当在其他有runat="server"的窗体的中的按钮事件中,手动调用新建form的submit() 函数. 
传送页面代码如下: 

<form id="forPost" method="post" action="Default2.aspx"> <input type="text" id="SourceData2" runat="server" /><input id="Button1" type="button" onclick="post();" value ="post提交" /></form>接收页面 using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; public partial class ExpedientInfront_ExpCompany_Default2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { post(); } public void post() { Response.Write(Request.Form["SourceData2"].ToString()); } } 2.通过Session取值,在一个页面中赋值,在其他页面中共享,这个方式也被广泛应用,个人不倾向于用这种方式,我怕造成Session值的混乱无序,Session用来存一些公共的东西已经累得够呛了 3.通过Context传值,在传送页面之前,将需要传递到其他页面的值存在Context中。示例代码如下: 传送页面 //点击某个button时触发 private void btnTransfer_ServerClick(object sender, EventArgs e) { Context.Items["SourceData"]=SourceData.Value; Server.Transfer("DestinationPage.aspx"); } 接收页面 string a=Context.Items["SourceData"].ToString(); 4.通过Server.Transfer的方式。 这个方式在方法三种已经用到了,不过可以在调用页面为要传递到被调用页面的值创建属性(当然可以直接将它设成public),这样就可以在其他页面访问了。 传送页面 //要传送的值 private System.Web.UI.HtmlControls.HtmlInputText SourceData; public string getSourceData { get { return SourceData.Value; } } //传送页面 Server.Transfer("DestinationPage.aspx"); 接收页面 private SourceClass sourcePage; sourcePage=(SourceClass)Context.Handler; string aa=sourcePage.getSourceData; 以上就是Post的在不同页面传递数据的方式了。 下面是get方法 我常用的是 传送页面 aspx页面 <form id="Form1" runat="server"><input type="text" runat="server" id="SourceData" /><asp:Button ID="btnTransfer" runat="server" Text="get提交" nclick="btnTransfer_Click" /> </form> aspx.cs代码: protected void btnTransfer_Click(object sender, EventArgs e) { string bb = this.SourceData.Value; string url = "Default2.aspx?aa=" + bb; Response.Redirect(url); } 接收页面: using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; public partial class ExpedientInfront_ExpCompany_Default2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { get(); } public void get() { Response.Write(Request.QueryString["aa"].ToString()); } } 



Ajax, 选择GET还是POST?

  当我们不通过重新加载页面,用Ajax访问服务器的时候,有两个选择可以将请求信息传送到服务器上。这两个选择分别是GET和POST。

  在把请求信息发送到服务器上以加载新的页面时,这两个选择有两个不同之处。第一个区别是你是请求了信息的一小部分而不是整个页面。第二个区别也是最明显的区别是由于Ajax请求不会出现在地址栏中,因此当发送请求时,在访问者的屏幕上是看不出什么异同的。使用GET生成调用不会暴露域和它们的值,使用POST也不会暴露。因此,我们要怎样在这两者之间作出选择呢?

  初学者可能犯的一个错误是对于大多数的调用都使用GET命令,仅仅因为这一命令相对而言更容易编写。GET与POST调用之间最显著的差异是当发出加载新页面请求时,GET调用对于同样数量的数据有着相同的限制。唯一的区别是你处理的少量的Ajax请求数据,而你并不想通过这种长度运行的限制来完成页面的加载。初学者可能会在少数情况下,如他们确实需要传送更多信息时,使用POST。

  当我们有大量数据要传送时最好的办法是一次发出多个只传递少量信息的Ajax调用时。如果你正用一个Ajax调用发送大量数据,那么最好是结束这种做法,因为这样做并不能节约时间。

  因此,需要传送大量数据能成为我们在GET和POST之间犹豫不决的理由吗?这两个方法都是为不同的目的而设计的,两者的不同也在于其使用目的。这一说法不仅适用于GET和POST的使用,也适用于其他的方法。

  GET的目的就如同其名字一样是用于获取信息的。它旨在显示出页面上你要阅读的信息。浏览器会缓冲GET请求的执行结果,如果同样的GET请求再次发出,浏览器就会显示缓冲的结果而不是重新运行整个请求。这一流程不同于浏览器的处理过程,但是它是有意设计成这样以使GET调用更有效率。GET调用会检索要显示在页面中的数据,数据不会在服务器上被更改,因此重新请求相同数据的时候会得到相同的结果。

  POST方法应该用于你需要更新服务器信息的地方。如某调用要更改保存在服务器上的数据,而从两个同样的POST调用返回的结果或许会完全不同,因为第二个POST调用的值与第一个的值不相同,这是由于第一个调用已经更新了其中一些值。POST调用通常会从服务器上获取响应而不是保持前一个响应的缓冲。

  因此,不要用数据的量来决定是要选择GET还是POST,而应该按照目的在两者间作出选择。如果调用是要检索服务器上的数据则使用GET。如果要检索的值会随时间和更新进程的改变而改变则要在GET调用中添加一个当前时间参数,这样后面的调用才不会使用先前的不正确的缓冲。如果调用是向服务器上发送任意数据,就可以使用POST。

  事实上,我们不应该不仅仅只将这个标准作为选择怎样使用GET和POST调用的标准,在处理页面处理形式的时候也可以将它作为取舍这两个调用的标准。

例:Ajax 进行Post传值和Get传值

以下AJAX post 传值 

<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Untitled Document</title></head><script language="javascript">function saveUserInfo(){//获取接受返回信息层var msg = document.getElementById("msg");//获取表单对象和用户信息值var f = document.user_info;var userName = f.user_name.value;var userAge   = f.user_age.value;var userSex   = f.user_sex.value;//接收表单的URL地址var url = "/ajax_output.php";//需要POST的值,把每个变量都通过&来联接var postStr   = "user_name="+ userName +"&user_age="+ userAge +"&user_sex="+ userSex;//实例化Ajax//var ajax = InitAjax();          var ajax = false;         //开始初始化XMLHttpRequest对象         if(window.XMLHttpRequest) { //Mozilla 浏览器                 ajax = new XMLHttpRequest();                 if (ajax.overrideMimeType) {//设置MiME类别                         ajax.overrideMimeType("text/xml");                 }         }         else if (window.ActiveXObject) { // IE浏览器                 try {                         ajax = new ActiveXObject("Msxml2.XMLHTTP");                 } catch (e) {                         try {                                 ajax = new ActiveXObject("Microsoft.XMLHTTP");                         } catch (e) {}                 }         }         if (!ajax) { // 异常,创建对象实例失败                 window.alert("不能创建XMLHttpRequest对象实例.");                 return false;         }                                                //通过Post方式打开连接ajax.open("POST", url, true);//定义传输的文件HTTP头信息ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//发送POST数据ajax.send(postStr);//获取执行状态ajax.onreadystatechange = function() {    //如果执行状态成功,那么就把返回信息写到指定的层里   if (ajax.readyState == 4 && ajax.status == 200) {     msg.innerHTML = ajax.responseText;    } } }</script><body ><div id="msg"></div><form name="user_info" method="post" action="">姓名:<input type="text" name="user_name" /><br />年龄:<input type="text" name="user_age" /><br />性别:<input type="text" name="user_sex" /><br /><input type="button" value="提交表单" onClick="saveUserInfo()"></form></body> 以下是AJAX get传值 <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Untitled Document</title></head><script language="javascript">function saveUserInfo(){//获取接受返回信息层var msg = document.getElementById("msg");//获取表单对象和用户信息值var f = document.user_info;var userName = f.user_name.value;var userAge   = f.user_age.value;var userSex   = f.user_sex.value;//接收表单的URL地址var url = "/ajax_output.php? user_name="+ userName +"&user_age="+ userAge +"&user_sex="+ userSex";//实例化Ajax//var ajax = InitAjax();          var ajax = false;         //开始初始化XMLHttpRequest对象         if(window.XMLHttpRequest) { //Mozilla 浏览器                 ajax = new XMLHttpRequest();                 if (ajax.overrideMimeType) {//设置MiME类别                         ajax.overrideMimeType("text/xml");                 }         }         else if (window.ActiveXObject) { // IE浏览器                 try {                         ajax = new ActiveXObject("Msxml2.XMLHTTP");                 } catch (e) {                         try {                                 ajax = new ActiveXObject("Microsoft.XMLHTTP");                         } catch (e) {}                 }         }         if (!ajax) { // 异常,创建对象实例失败                 window.alert("不能创建XMLHttpRequest对象实例.");                 return false;         }                                                //通过Post方式打开连接ajax.open("GET", url, true);//发送GET数据,已经在URL中赋了值所以send那里只要加个空参.ajax.send(null);//获取执行状态ajax.onreadystatechange = function() {    //如果执行状态成功,那么就把返回信息写到指定的层里   if (ajax.readyState == 4 && ajax.status == 200) {     msg.innerHTML = ajax.responseText;    } } }</script><body ><div id="msg"></div><form name="user_info" method="post" action="">姓名:<input type="text" name="user_name" /><br />年龄:<input type="text" name="user_age" /><br />性别:<input type="text" name="user_sex" /><br /><input type="button" value="提交表单" onClick="saveUserInfo()"></form></body>