Ajax中XMLHttpRequest詳解 及post與get 的區別


Ajax中XMLHttpRequest詳解

 原文: https://www.cnblogs.com/le220/p/8007432.html

   在Ajax應用程序中,XmlHttpRequest對象負責將用戶信息以異步通信地發送到服務器端,並接收服務器返回的響應信息和數據。

   XMLHttpRequest可以提供不重新加載頁面的情況下更新網頁,在頁面加載后再客戶端向服務器請求數據,在頁面加載后在服務器端接收數據,在后台向客戶端發送數據

   XMLHttpRequest和Javascript

   Javascript本身並未具備向服務器發送請求的能力,要么使用window.open()方法重新打開一個頁面向服務器提交請求,要么使用XMLHttpRequest對象發送請求。不同的是,前者是普通的即同步交互模式,而后者是異步交互方式。

   XMLHttpRequest提供了一系列的屬性和方法,來向服務器發送異步的http請求;在服務器處理用戶請求的過程中,XMLHttpRequest通過屬性的狀態值來實時反映http請求所處的狀態,並根據這些狀態指示Javascript做相應的處理;當服務器順利完成響應用戶行為的動作、並將響應數據返回時,XMLHttpRequest提供的response系列方法,可以將這些響應數據以文本、XML Document對象、Ado Stream對象或者unsigned byte數組的方式組裝起來,提供給Javascript處理。

XMLHttpRequest對象

一、XMLHttpRequest方法:

1、Open(string method,string url,boolean asynch,String username,string password)
     指定和服務器端交互的HTTP方法,URL地址,即其他請求信息;
     Method:表示http請求方法,一般使用"GET","POST".
     url:表示請求的服務器的地址;
     asynch:表示是否采用異步方法,true為異步,false為同步;
     后邊兩個可以不指定,username和password分別表示用戶名和密碼,提供http認證機制需要的用戶名和密碼。

2、Send(content)
     向服務器發出請求,如果采用異步方式,該方法會立即返回。
     content可以指定為null表示不發送數據,其內容可以是DOM對象,輸入流或字符串。

3、SetRequestHeader(String header,String Value)
設置HTTP請求中的指定頭部header的值為value.
此方法需在open方法以后調用,一般在post方式中使用。

4、getAllResponseHeaders()
返回包含Http的所有響應頭信息,其中相應頭包括Content-length,date,uri等內容。
返回值是一個字符串,包含所有頭信息,其中每個鍵名和鍵值用冒號分開,每一組鍵之間用CR和LF(回車加換行符)來分隔!

5、getResponseHeader(String header)
返回HTTP響應頭中指定的鍵名header對應的值

6、Abort() 
停止當前http請求。對應的XMLHttpRequest對象會復位到未初始化的狀態。

二、XMLHttpRequest屬性:

1、readyState
      表示XMLHttpRequest對象的狀態:0:未初始化。對象已創建,未調用open;
      1:open方法成功調用,但Sendf方法未調用;
      2:send方法已經調用,尚未開始接受數據;
      3:正在接受數據。Http響應頭信息已經接受,但尚未接收完成;
      4:完成,即響應數據接受完成。

2、Onreadystatechange
    請求狀態改變的事件觸發器(readyState變化時會調用這個屬性上注冊的javascript函數)。

3、responseText
      服務器響應的文本內容

4、responseXML
     服務器響應的XML內容對應的DOM對象

5、Status
     服務器返回的http狀態碼。200表示“成功”,404表示“未找到”,500表示“服務器內部錯誤”等。

6、statusText
      服務器返回狀態的文本信息。

使用XMLHttpRequest的五步:

   第一步:創建XMLHttpRequest對象
   第二步:注冊回調方法
   第三步:設置和服務器交互的相應參數
   第四步:設置向服務器端發送的數據,啟動和服務器端的交互
   第五步:判斷和服務器端的交互是否完成,還要判斷服務器端是否正確返回了數據

代碼展示:

1、創建XMLHttpRequest對象

復制代碼
1 <span >//實例化XMLHttpRequest對象  
2 function createXMLHttpRequest(){  
3     if(window.XMLHttpRequest){  
4         xmlHttp = new XMLHttpRequest();   
5     }else if(window.ActiveXObject){  
6         xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");  
7     }  
8 } </span>
復制代碼

二、注冊回調方法

      指定當服務器返回信息時客戶端的處理方式。只需將相應的處理函數名稱賦給XMLHttpRequest對象的onreadystatechange屬性即可。

 1 <span >xmlHttp.onreadystatechange = callBack; </span>  

三、設置和服務器交互的相應參數

 1 <span >xmlhttp.open("GET","ajax?name=" +userName,true); </span>  

四、設置向服務器端發送的數據,啟動和服務器端的交互

 1 <span >xmlhttp.send(null);</span>  

五、判斷和服務器端的交互是否完成,還要判斷服務器端是否正確返回了數據

復制代碼
 1 <span >function callback(){    
 2      if(xmlhttp.readState==4){    
 3          //表示服務器的相應代碼是200;正確返回了數據     
 4         if(xmlhttp.status==200){     
 5             //純文本數據的接受方法     
 6             var message=xmlhttp.responseText;     
 7             //使用的前提是,服務器端需要設置content-type為text/xml     
 8             //var domXml=xmlhttp.responseXML;     
 9             //其它代碼    
10          }     
11     }    
12  }</span>  
復制代碼

AJAX使用異步方式與服務器通信,不需要打斷用戶的操作,具有更加迅速的響應能力。ajax的原則是“按需取數據”,可以最大程度的減少冗余請求,和響應對服務器造成的負擔。

Ajax請求GET和POST的區別

 

一、Ajax請求GET和POST的區別

  1.使用Get請求時,參數在URL中顯示,而使用Post方式,則不會顯示出來

  2.使用Get請求發送數據量小,Post請求發送數據量大

  3.get請求需注意緩存問題,post請求不需擔心這個問題

Get方式:

  用get方式可傳送簡單數據,但大小一般限制在1KB下,數據追加到url中發送(httpheader傳送),也就是說,瀏覽器將各個表單字段元素及其數據按照URL參數的格式附加在請求行中的資源路徑后面。另外最重要的一點是,它會被客戶端的瀏覽器緩存起來,那么,別人就可以從瀏覽器的歷史記錄中,讀取到此客戶的數據,比如帳號和密碼等。因此,在某些情況下,get方法會帶來嚴重的安全性問題。

Post方式:

  當使用POST方式時,瀏覽器把各表單字段元素及其數據作為HTTP消息的實體內容發送給Web服務器,而不是作為URL地址的參數進行傳遞,使用POST方式傳遞的數據量要比使用GET方式傳送的數據量大的多。

二、使用注意事項

  1、使用get方式需要注意:

       對於get請求(或凡涉及到url傳遞參數的),被傳遞的參數都要先經encodeURIComponent方法處理.例:var url = "update.php?username=" +encodeURIComponent(username) + "&content=" +encodeURIComponent(content)+"&id=1" ;

  即get的傳遞參數需要拼接到url當中

        2、使用Post方式需注意:

  (1)設置headerContext-Typeapplication/x-www-form-urlencode確保服務器知道實體中有參數變量.通常使用XmlHttpRequest對象的SetRequestHeader("Context-Type","application/x-www-form-urlencoded;")。例:

xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  (2)參數是名/值一一對應的鍵值對,每對值用&號隔開.如 var name=abc&sex=man&age=18,注意var name=update.php?

abc&sex=man&age=18以及var name=?abc&sex=man&age=18的寫法都是錯誤的;
  (3)參數在Send(參數)方法中發送,例: xmlHttp.send(name); 如果是get方式,直接 xmlHttp.send(null);

  (4)服務器端請求參數區分GetPost。如果是get方式則$username = $_GET["username"]; 如果是post方式,則$username = $_POST["username"];

  post的傳遞參數不需要拼接到url當中

  get 方法用Request.QueryString["strName"]接收
  post 方法用Request.Form["strName"] 接收

  注意:
    雖然兩種提交方式可以統一用Request("strName")來獲取提交數據,但是這樣對程序效率有影響,不推薦使用。
    一般來說,盡量避免使用Get方式提交表單,因為有可能會導致安全問題

三、AJAX亂碼問題

  產生亂碼的原因:

    1、xmlhttp 返回的數據默認的字符編碼是utf-8,如果客戶端頁面是gb2312或者其它編碼數據就會產生亂碼
    2、post方法提交數據默認的字符編碼是utf-8,如果服務器端是gb2312或其他編碼數據就會產生亂碼

  解決辦法有:

    1、若客戶端是gb2312編碼,則在服務器指定輸出流編碼
    2、服務器端和客戶端都使用utf-8編碼

    gb2312:header('Content-Type:text/html;charset=GB2312');

    utf-8:header('Content-Type:text/html;charset=utf-8');

    注意:如果你已經按上面的方法做了,還是返回亂碼的話,檢查你的方式是否為get,對於get請求(或凡涉及到url傳遞參數的),被傳遞的參數都要先經encodeURIComponent方法處理.如果沒有用encodeURIComponent處理的話,也會產生亂碼.

四、POST和GET的區別

  Get請求的目的是給予服務器一些參數,以便從服務器獲取列表.例如:list.aspx?page=1,表示獲取第一頁的數據

  Post請求的目的是向服務器發送一些參數,例如form中的內容.

  與 POST 相比,GET 更簡單也更快,並且在大部分情況下都能用。

  然而,在以下情況中,請使用 POST 請求:

    1、無法使用緩存文件(更新服務器上的文件或數據庫)
    2、向服務器發送大量數據(POST 沒有數據量限制)
    3、發送包含未知字符的用戶輸入時,POSTGET 更穩定也更可靠

       若符合下列任一情況,則用GET方法:

    1、請求是為了查找資源,HTML表單數據僅用來幫助搜索。
    2、請求結果無持續性的副作用。
    3、收集的數據及HTML表單內的輸入字段名稱的總長不超過1024個字符。

五、案例

 1、HTML代碼(原生Ajax代碼)

復制代碼
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6     <script>
 7         window.onload=function(){
 8             var=document.getElementById('btn');
 9             btn.onclick=function(){
10                 //1、創建對象
11                 var=null; 12 if(window.XMLHttpRequest){//標准瀏覽器 13 =new XMLHttpRequest(); 14 }else{//早期的IE瀏覽器 15 =new ActiveXObject('Microsoft.XMLHTTP'); 16 } 17 var username=document.getElementById('username').value; 18 var password=document.getElementById('password').value; 19 20 //2、准備發送請求-配置發送請求的一些行為 21 22 //get方法 23 // var url='./get-post.php?username='+username+'&password='+password; 24 // xhr.open('get',url,true); 25 26 //post方法 27 var=''; 28 xhr.open('',url,true); 29 30 //3、執行發送的動作 31 xhr.setRequestHeader('',''); 32 // encodeURIComponent將中文用戶名編碼 33 var='username='+encodeURIComponent(username)+'&password='+password; 34 xhr.send(param); 35 //4、指定一些回調函數 36 xhr.onreadystatechange=function(){ 37 38 if(xhr.readyState==4){ 39 if(xhr.status==200){//狀態200,404,503 40 var=xhr.responseText;//json 41 //var data1=xhr.responseXML; 42 console.log(data); 43 } 44 } 45 }; 46 } 47 48 } 49 </script> 50 </head> 51 <body> 52 <div> 53 <div id="showInfo"></div> 54 <form > 55 用戶名:<input type="text" id="username" name="username"><br> 56 密碼:<input type="password" id="password" name="password"> 57 <input type="button" id="btn" value="登錄" > 58 </form> 59 </div> 60 </body> 61 </html>
復制代碼

2、PHP文件

復制代碼
 1 <?php 2 // $username=$_GET['username']; 3 // $password=$_GET['password']; 4 5 $username=$_POST['username']; 6 $password=$_POST['password']; 7 8 echo '用戶名:'.$username.'密碼:'.$password; 9 10 ?>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM