Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
HEAD
向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中。
POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT
向指定资源位置上传其最新内容。
DELETE
请求服务器删除Request-URI所标识的资源。
TRACE
回显服务器收到的请求,主要用于测试或诊断。
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。
(1)所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
* 注意:这里安全的含义仅仅是指是非修改信息。
(2)幂等的意味着对同一URL的多个请求应该返回同样的结果。
幂等(idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。
幂等有一下几种定义:
对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a)=abs(abs(a))。
对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x。
2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。
但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的原因有很多,比如说:
1.很多人贪方便,更新资源时用了GET,因为用POST必须要到FORM(表单),这样会麻烦一点。
2.对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE。
表面分析GET和POST的区别:
(1)首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。
(2)理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,说“POST数据量存在80K/100K的大小限制”是不准确的,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。
对于ASP程序,Request对象处理每个表单域时存在100K的数据长度限制。但如果使用Request.BinaryRead则没有这个限制。
由这个延伸出去,对于IIS 6.0,微软出于安全考虑,加大了限制。我们还需要注意:
1)IIS 6.0默认ASP POST数据量最大为200KB,每个表单域限制是100KB。
2)IIS 6.0默认上传文件的最大大小是4MB。
3)IIS 6.0默认最大请求头是16KB。
IIS 6.0之前没有这些限制。
一般说的80K,100K可能只是默认值而已,但肯定是可以自己设置的。由于每个版本的IIS对这些参数的默认值都不一样,具体请参考相关的IIS配置文档。
3.在ASP.NET中,服务端获取GET请求参数用 Request.QueryString,获取POST请求参数用Request.Form。在JSP中,用 request.getParameter(\"XXXX\")来获取,虽然jsp中也有request.getQueryString()方法,但使用起来比较麻烦,比如:传一个test.jsp?name=hyddd&password=hyddd,用 request.getQueryString()得到的是:name=hyddd&password=hyddd。在PHP中,可以用$_GET和$_POST分别获取GET和POST中的数据,而$_REQUEST则可以获取GET和POST两种请求中的数据。值得注意的是,JSP 中使用request和PHP中使用$_REQUEST都会有隐患。
4.POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security 的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。
Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为"GET",实质上,GET和POST只是发送机制不同,并不是一个取一个发!
下面演示一个例子:
//这段代码是一个注册的Ajax异步提交的过程,写的简单些
function Registers() {
$.ajax({
type: 'POST',
url: "../AjaxPro.aspx?_Action=Registers",
data: { "Email": Email, "loginId": loginId, "password": password },
success: function (Msg) {
alert(Msg);
}
});
}
function Registers() {
$.ajax({
type: 'POST',
url: "../AjaxPro.aspx?_Action=Registers",
data: { "Email": Email, "loginId": loginId, "password": password },
success: function (Msg) {
alert(Msg);
}
});
}
这里用到的是POST的方式,在后台接受处理的代码如下
protectedvoid Page_Load(object sender, EventArgs e)
{
//在这里Action的值是在URL地址栏中的所以通过Request.QueryString来获取
string Action = Request.QueryString["_Action"].ToString();
switch (Action)
{
case"Registers":
Msg = Registers();
Response.Write(Msg);
break;
default:
break;
}
}
publicstring Registers()
{
//Email是POST过来的所以用Request来获取值
string Email = Request["Email"].ToString();
string loginId = Request["loginId"].ToString();
string password = Request["password"].ToString();
DateTime date = DateTime.Now;
//下面就是对数据库的操作了
StringBuilder strSql =new StringBuilder();
strSql.Append("insert into Tab_Reg(");
strSql.Append("UserName,Pwd,Email,Date)");
strSql.Append(" values (");
strSql.Append("@UserName,@Pwd,@Email,@Date)");
strSql.Append(";select @@IDENTITY");
SqlParameter[] parameters = {
new SqlParameter("@UserName", SqlDbType.VarChar,30),
new SqlParameter("@Pwd", SqlDbType.VarChar,30),
new SqlParameter("@Email", SqlDbType.VarChar,30),
new SqlParameter("@Date", SqlDbType.DateTime)};
parameters[0].Value = loginId;
parameters[1].Value = password;
parameters[2].Value = Email;
parameters[3].Value = date;
using (SqlConnection conn =new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString.ToString()))
{
using (SqlCommand cmd =new SqlCommand())
{
try
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = strSql.ToString();
cmd.CommandType = CommandType.Text;//cmdType;
if (parameters !=null)
{
foreach (SqlParameter parameter in parameters)
{
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value ==null))
{
parameter.Value = DBNull.Value;
}
cmd.Parameters.Add(parameter);
}
}
object obj = cmd.ExecuteScalar();
cmd.Parameters.Clear();
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
Msg ="添加失败!";
return Msg;
}
else
{
Msg ="添加成功!";
return Msg;
}
}
catch(Exception ex)
{
return ex.ToString();
}
finally
{
conn.Close();
}
}
}
}
这只是Post值的是后,待续GET