get和post讲解

 

表单的提交方式POST和GET有什么区别

解决思路
   两者的区别需要通过提交表单后才看得出来,主要是在数据发送方式和接收方式上。

具体步骤
Post和Get都是表单属性Method的可选值,Method的默认值为Get,两者的主要区别在于:
1.在客户端,Get方式在通过URL提交数据,提交后在地址栏中的地址如图1.4.3所示。

 

 

图1.4.3 Get方式提交表单后的地址栏

而Post提交后地栏不变,如图1.4.4所示。

 

 

图1.4.4 Post方式提交表单后的地址栏不变
2.在服务器端只能用Request.QueryString来获取Get方式提交来的数据,用Post方式提交的数据只能用Request.Form来获取:

<%@language="VBScript" Codepage="936"%>
<html>
<head>
<title> 表单提交方式测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form method="post" action="<%=Request.ServerVariables("Script_Name")%>">
  提交数据:
  <input name="oStr" type="text">
    <br>
    提交方式:
    <select name="select" οnchange="this.form.method=this.value">
      <option value="Post" selected>Post</option>
      <option value="Get">Get</option>
    </select>
    <br>
  <input type="submit" name="Submit" value="提交">
</form>
<%
 if Request("Submit")<>"" then
        Response.Write "通过"&Request.ServerVariables("Request_Method")&"方式提交的数据为:"
    if Request.ServerVariables("Request_Method")="GET" then
          Response.Write Request.QueryString("oStr")
    else
          Response.Write Request.Form("oStr")
    end if
end if
%>
</body>
</html>

注意:虽然两种提交方式可以统一用Request("oStr")来获取提交数据,但是这样对程序效率有影响,不推荐使用。
特别提示
通过IIS运行本例代码(用http://localhost/method.asp这种方式来浏览,有关IIS的安装和配置,请参考第四部分),输入所提交的数据,选择Post方式提交,将看到图1.4.4所示的效果。选择Get方式提交,效果将如图1.4.3所示。

特别说明


一般来说,尽量避免使用Get方式提交表单,因为有可能会导致安全问题。比如说在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。但是在分页程序中,用Get方式就比用Post好。本例中用到的表单的属性解释(ASP部分请参考第四部分):
    Get把参数添加到action属性指定的地址中,并以锚方式打开。
    Post通过HTTP post处理发送数据。

 

-----------------------------------------------------------------------------------------

HTML中,form元素method属性来指定有两种不同的提交方法,即"get"(默认值)和"post"。

1. get和post的定义

W3CHTML 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  method ="get"  action ="FormGet.aspx" >
    
< input  type ="text"  name ="ProductID"  value ="1"   />
    
< input  type ="submit"  value ="Get"   />
</ form >

 

这个form在提交的时候,会产生这样能够一个get请求:FormGet.aspx?ProductID=1。

而post会把form的数据集,即ProductID=1这个键值对包装在请求的body中,发送给服务器,然后向服务器请求数据。对于:

 

< form  method ="post"  action ="FormPost.aspx" >
    
< input  type ="text"  name ="ProductID"  value ="1"   />
    
< input  type ="submit"  value ="Get"   />
</ form >

 

这样一个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的效率:

 

<% @ Page Language = " C# "   %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

< script  runat ="server" >
    protected 
void  Page_PreInit(object sender, EventArgs e)
    {
        
if (Request[ " InputString " !=   null )
        {
            
int  count  =   1000000 ;
            DateTime start;
            DateTime end;
            string value 
=   "" ;
            start 
=  DateTime.Now;
            
for ( int  i  =   0 ;i  <  count;i ++ )
            {
                value 
=  Request.QueryString[ " InputString " ];
            }
            end 
=  DateTime.Now;
            
double  requestGet  =  (end  -  start).TotalSeconds;
            start 
=  DateTime.Now;
            
for ( int  i  =   0 ;i  <  count;i ++ )
            {
                value 
=  Request[ " InputString " ];
            }
            end 
=  DateTime.Now;
            
double  request  =  (end  -  start).TotalSeconds;
            compare.InnerHtml 
=  requestGet.ToString()  +   "  /  "   +  request.ToString()  +   "  =  "   +  (requestGet  /  request).ToString();
            get.InnerHtml 
=  value;
        }
    }
</ script >

< html  xmlns ="http://www.w3.org/1999/xhtml" >
    
< head >
        
< meta  http-equiv ="Content-Type"  content ="text/html; charset=utf-8"   />
        
< title > Request.QueryString / Request </ title >
    
</ head >
    
< body >
        
< form  method ="get"  action ="FormGet.aspx" >
            
< div >
                
< input  type ="text"  name ="InputString"   />< input  type ="submit"  value ="Post"   />< br  />
                Get: 
< span  runat ="server"  id ="get" ></ span >< br  />
                Request.QueryString / Request: 
< span  runat ="server"  id ="compare" ></ span >
            
</ div >
        
</ form >
    
</ body >
</ html >

 

同样的办法我们可以比较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。比如:

  • 修改服务器上数据库中的数据;
  • 发送一封邮件;
  • 删除一个文件。

--------------------------------------------------------------

不懂还敢胡说的人还真多:

post和get都是向服务器发送数据,
get方式把数据用name=value的形式跟在url后面,由于url长度是有限制的,所以这种方式不适合长段的文本。
另外,如果说post的安全性比get高,这是扯淡,即使只是有点HTML和js知识的人,也可以在发送之前,修改post的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值