基本原理梳理、簡單Ajax應用。php
1. 創建TCP鏈接html
2. Web瀏覽器向Web服務器發送請求命令。前端
3. Web瀏覽器發送請求頭信息git
4. 服務器應答github
5. 服務器發送應答頭信息ajax
6. 服務器向瀏覽器發送數據json
7. 服務器關閉TCP鏈接後端
1. 請求的方法或者動做:GET or POST跨域
2. URL瀏覽器
3. 請求頭。客戶端的環境、身份信息等。
4. 請求體。待處理的信息。查詢字符串或者表單信息。
注:請求頭和請求體中間有空行,表示請求頭結束、請求體開始。
1. 狀態碼:用數字或者文字,表示請求成功與否。
1XX | 信息類。收到請求處理。 |
2XX | 成功。 |
3XX | 重定向。請求未成功。 |
4XX | 客戶端錯誤。如請求URL不存在:404 NOT FOUND |
5XX | 服務器錯誤。 |
2. 響應頭:對應請求頭。表示服務器信息。
3. 響應體:響應正文。
1. open(method, url, async):請求方法、url、異步與否。
2. setRequestHeader():自定義頭部信息,可選。按照HTTP請求流程,在open和send方法間。
3. send(string):通常GET方法將信息附加到url後,因此這裏string爲null;而POST一般須要string。
1. readystatechange事件的監聽通常放在open()方法以前。
2. 同步請求通常監聽:responseText,responseXML,status/statusText(對應上面提到的狀態碼)、getResponseHeader()/getAllResponseHeader()
3. 異步請求除了監聽上述的屬性或者方法以外,還應該結合readystatechange事件,考慮readyState屬性。
0 | 請求初始化、open未調用 |
1 | TCP鏈接創建、open已經調用 |
2 | 請求已經接收、受到頭信息 |
3 | 處理中、收到主體 |
4 | 請求已完成、響應就緒、響應完成。 |
save.onclick = function(){ var createResult = document.getElementById("createResult"); var data = "name="+document.getElementById("staffName").value +"&number="+document.getElementById("staffNumber").value +"&sex="+document.getElementById("staffSex").value +"&job="+document.getElementById("staffJob").value; var request = createXHR(); request.onreadystatechange = function(){ if(request.readyState === 4){ if(request.status === 200){ createResult.innerHTML = request.responseText; }else{ alert("發生錯誤"+request.status); } } }; request.open("POST","server.php",false); request.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); request.send(data); }
1. 服務端:Content-type:application/json;將返回值調整成JSON的格式,設置必要的標誌(如success:true/false)以供客戶端進行邏輯處理。
2. 客戶端:url指向新的PHP文件;對獲得的響應數據進行解析:JSON.parse(responseText);訪問解析的對應字段,進行相關處理。
$.ajax({ type:"POST", url:"serverJSON.php", dataType:"json", data:{ name:$("#staffName").val(), number:$("#staffNumber").val(), sex:$("#staffSex").val(), job:$("#staffJob").val() }, success:function(data){ if(data.success){ $("#createResult").html(data.msg); }else{ $("#createResult").html("出現錯誤:"+data.msg); } }, error: function(jqXHR){ alert("發生錯誤:"+jqXHR.status); } });
1. 前端:dataType從「json」改成「jsonp」;添加屬性jsonp:callback
2. 後端:$jsonp=$_GET["callback"];修改返回值爲$jsonp.("返回的數據")
3. 注意到「callback」就是雙方約定的處理,須要保持一致。而後須要返回的數據前須要於這個約定的名稱拼接。
比較新的處理方式,在舊版本瀏覽器中支持較差。只須要在服務端添加代碼:
//表示全部域名均可以訪問此資源 header("Access-Control-Allow-Origin:*"); //表示支持的方法 header("Access-Control-Allow-Methods:POST,GET");