Ajax中XMLHttpRequest詳解
在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中發送(http的header傳送),也就是說,瀏覽器將各個表單字段元素及其數據按照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)設置header的Context-Type為application/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)服務器端請求參數區分Get與Post。如果是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、發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
若符合下列任一情況,則用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 ?>

