西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)javascript|JQuery → Ajax中的應(yīng)用中的GET、POST方法原理分析

Ajax中的應(yīng)用中的GET、POST方法原理分析

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2011/4/21 14:13:15字體大。A-A+

作者:西西點(diǎn)擊:502次評(píng)論:3次標(biāo)簽: Ajax

  • 類型:編程控件大。6.8M語言:中文 評(píng)分:2.5
  • 標(biāo)簽:
立即下載
昨天項(xiàng)目經(jīng)理讓我做了一塊小功能,是關(guān)于異步刷新頁面內(nèi)容的,之前對(duì)Ajax的操作僅限于post的請(qǐng)求操作,會(huì)應(yīng)用但是說到具體的原理就有點(diǎn)模糊了為了搞明白其原理,遂寫下這篇隨筆:

Http定義了與服務(wù)器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認(rèn)為:一個(gè)URL地址,它用于描述一個(gè)網(wǎng)絡(luò)上的資源,而HTTP中的GET,POST,PUT,DELETE就對(duì)應(yīng)著對(duì)這個(gè)資源的查,改,增,刪4個(gè)操作。到這里,大家應(yīng)該有個(gè)大概的了解了,GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。
HTTP/1.1協(xié)議中共定義了八種方法(有時(shí)也叫“動(dòng)作”)來表明Request-URI指定的資源的不同操作方式:

OPTIONS
返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法。也可以利用向Web服務(wù)器發(fā)送'*'的請(qǐng)求來測(cè)試服務(wù)器的功能性。
HEAD
向服務(wù)器索要與GET請(qǐng)求相一致的響應(yīng),只不過響應(yīng)體將不會(huì)被返回。這一方法可以在不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)消息頭中的元信息。
GET
向特定的資源發(fā)出請(qǐng)求。注意:GET方法不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中。
POST
向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。
PUT
向指定資源位置上傳其最新內(nèi)容。
DELETE
請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源。
TRACE
回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。
CONNECT
HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
  1.根據(jù)HTTP規(guī)范,GET用于信息獲取,而且應(yīng)該是安全的和冪等的。

  (1)所謂安全的意味著該操作用于獲取信息而非修改信息。換句話說,GET 請(qǐng)求一般不應(yīng)產(chǎn)生副作用。就是說,它僅僅是獲取資源信息,就像數(shù)據(jù)庫查詢一樣,不會(huì)修改,增加數(shù)據(jù),不會(huì)影響資源的狀態(tài)。

  * 注意:這里安全的含義僅僅是指是非修改信息。

  (2)冪等的意味著對(duì)同一URL的多個(gè)請(qǐng)求應(yīng)該返回同樣的結(jié)果。

冪等(idempotent、idempotence)是一個(gè)數(shù)學(xué)或計(jì)算機(jī)學(xué)概念,常見于抽象代數(shù)中。
  冪等有一下幾種定義:
  對(duì)于單目運(yùn)算,如果一個(gè)運(yùn)算對(duì)于在范圍內(nèi)的所有的一個(gè)數(shù)多次進(jìn)行該運(yùn)算所得的結(jié)果和進(jìn)行一次該運(yùn)算所得的結(jié)果是一樣的,那么我們就稱該運(yùn)算是冪等的。比如絕對(duì)值運(yùn)算就是一個(gè)例子,在實(shí)數(shù)集中,有abs(a)=abs(abs(a))。
  對(duì)于雙目運(yùn)算,則要求當(dāng)參與運(yùn)算的兩個(gè)值是等值的情況下,如果滿足運(yùn)算結(jié)果與參與運(yùn)算的兩個(gè)值相等,則稱該運(yùn)算冪等,如求兩個(gè)數(shù)的最大值的函數(shù),有在在實(shí)數(shù)集中冪等,即max(x,x) = x。

2.根據(jù)HTTP規(guī)范,POST表示可能修改變服務(wù)器上的資源的請(qǐng)求。

但在實(shí)際的做的時(shí)候,很多人卻沒有按照HTTP規(guī)范去做,導(dǎo)致這個(gè)問題的原因有很多,比如說:
  1.很多人貪方便,更新資源時(shí)用了GET,因?yàn)橛肞OST必須要到FORM(表單),這樣會(huì)麻煩一點(diǎn)。

  2.對(duì)資源的增,刪,改,查操作,其實(shí)都可以通過GET/POST完成,不需要用到PUT和DELETE。

表面分析GET和POST的區(qū)別:

  (1)首先是"GET方式提交的數(shù)據(jù)最多只能是1024字節(jié)",因?yàn)镚ET是通過URL提交數(shù)據(jù),那么GET可提交的數(shù)據(jù)量就跟URL的長(zhǎng)度有直接關(guān)系了。而實(shí)際上,URL不存在參數(shù)上限的問題,HTTP協(xié)議規(guī)范沒有對(duì)URL長(zhǎng)度進(jìn)行限制。這個(gè)限制是特定的瀏覽器及服務(wù)器對(duì)它的限制。IE對(duì)URL長(zhǎng)度的限制是2083字節(jié)(2K+35)。對(duì)于其他瀏覽器,如Netscape、FireFox等,理論上沒有長(zhǎng)度限制,其限制取決于操作系統(tǒng)的支持。

  注意這是限制是整個(gè)URL長(zhǎng)度,而不僅僅是你的參數(shù)值數(shù)據(jù)長(zhǎng)度。

  (2)理論上講,POST是沒有大小限制的,HTTP協(xié)議規(guī)范也沒有進(jìn)行大小限制,說“POST數(shù)據(jù)量存在80K/100K的大小限制”是不準(zhǔn)確的,POST數(shù)據(jù)是沒有限制的,起限制作用的是服務(wù)器的處理程序的處理能力。

  對(duì)于ASP程序,Request對(duì)象處理每個(gè)表單域時(shí)存在100K的數(shù)據(jù)長(zhǎng)度限制。但如果使用Request.BinaryRead則沒有這個(gè)限制。

  由這個(gè)延伸出去,對(duì)于IIS 6.0,微軟出于安全考慮,加大了限制。我們還需要注意:

     1)IIS 6.0默認(rèn)ASP POST數(shù)據(jù)量最大為200KB,每個(gè)表單域限制是100KB。
     2)IIS 6.0默認(rèn)上傳文件的最大大小是4MB。
     3)IIS 6.0默認(rèn)最大請(qǐng)求頭是16KB。
   IIS 6.0之前沒有這些限制。

  一般說的80K,100K可能只是默認(rèn)值而已,但肯定是可以自己設(shè)置的。由于每個(gè)版本的IIS對(duì)這些參數(shù)的默認(rèn)值都不一樣,具體請(qǐng)參考相關(guān)的IIS配置文檔。

  3.在ASP.NET中,服務(wù)端獲取GET請(qǐng)求參數(shù)用 Request.QueryString,獲取POST請(qǐng)求參數(shù)用Request.Form。在JSP中,用 request.getParameter(\"XXXX\")來獲取,雖然jsp中也有request.getQueryString()方法,但使用起來比較麻煩,比如:傳一個(gè)test.jsp?name=hyddd&password=hyddd,用 request.getQueryString()得到的是:name=hyddd&password=hyddd。在PHP中,可以用$_GET和$_POST分別獲取GET和POST中的數(shù)據(jù),而$_REQUEST則可以獲取GET和POST兩種請(qǐng)求中的數(shù)據(jù)。值得注意的是,JSP 中使用request和PHP中使用$_REQUEST都會(huì)有隱患。

  4.POST的安全性要比GET的安全性高。注意:這里所說的安全性和上面GET提到的“安全”不是同個(gè)概念。上面“安全”的含義僅僅是不作數(shù)據(jù)修改,而這里安全的含義是真正的Security 的含義,比如:通過GET提交數(shù)據(jù),用戶名和密碼將明文出現(xiàn)在URL上,因?yàn)?1)登錄頁面有可能被瀏覽器緩存,(2)其他人查看瀏覽器的歷史紀(jì)錄,那么別人就可以拿到你的賬號(hào)和密碼了,除此之外,使用GET提交數(shù)據(jù)還可能會(huì)造成Cross-site request forgery攻擊。

  Get是向服務(wù)器發(fā)索取數(shù)據(jù)的一種請(qǐng)求,而Post是向服務(wù)器提交數(shù)據(jù)的一種請(qǐng)求,在FORM(表單)中,Method默認(rèn)為"GET",實(shí)質(zhì)上,GET和POST只是發(fā)送機(jī)制不同,并不是一個(gè)取一個(gè)發(fā)!

下面演示一個(gè)例子:

//這段代碼是一個(gè)注冊(cè)的Ajax異步提交的過程,寫的簡(jiǎn)單些
function Registers() {
                $.ajax({
                    type:
'POST',
                    url:
"../AjaxPro.aspx?_Action=Registers",
                    data: {
"Email": Email, "loginId": loginId, "password": password },
                    success:
function (Msg) {
                        alert(Msg);
                    }
                });
            }

這里用到的是POST的方式,在后臺(tái)接受處理的代碼如下

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;
//下面就是對(duì)數(shù)據(jù)庫的操作了
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值的是后,待續(xù)GET

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(3)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)