Ajax總結-2(關於前後端通信請求,最詳細的解讀)

關於什麼是ajax,在第一次總結中也寫過,第一次總結是看了一篇2013年的一個視頻,然後這一次的總結是今年看的一篇文章。

 一.什麼是Ajax

Ajax(Asynchronous JavaScript and XML),可以理解爲JavaScript執行異步網絡請求。通俗的理解的話就是,如果沒有Ajax技術,改變網頁的一小部分(哪怕是一行文字、一張圖片)都需要重新加載一次整個頁面,而有了Ajax之後,就可以實現在網頁不跳轉不刷新的情況下,在網頁後臺提交數據,部分更新頁面內容。

二.Ajax的原生寫法

1.XMLHttpRequest對象

XMLHttpRequest 對象用於在後臺與服務器交換數據,能夠在不重新加載頁面的情況下更新網頁,在頁面已加載後從服務器請求數據,在頁面

2.實現流程

創建 XMLHttpRequest對象——>打開請求地址,初始化數據——>發送請求數據——>監聽回調函數狀態——>收到服務器返回的應答結果。

已加載後從服務器接收數據,在後臺向服務器發送數據。所以XMLHttpRequest對象是Ajax技術的核心所在。

下面用具體的代碼進行解釋:

var xmlhttp;
function loadXMLDoc(url)
{
xmlhttp=null;
if (window.XMLHttpRequest)
  {// code for all new browsers
  xmlhttp=new XMLHttpRequest();//在這裏創建 XMLHttpRequest對象
  }
else if (window.ActiveXObject)
  {// code for IE5 and IE6
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
if (xmlhttp!=null)
  {
  xmlhttp.open("GET",url,true); //請求的方式和請求地址
  xmlhttp.send(null);//發送請求
  xmlhttp.onreadystatechange=state_Change;//監聽回調函數
  }
else
  {
  alert("Your browser does not support XMLHTTP.");
  }
}
function state_Change() //這裏是回調函數
{
if (xmlhttp.readyState==4&&xmlhttp.status==200)
     //當滿足這兩個條件時表示請求成功,完成響應 4 = "loaded", 200 = OK  
  { 
    var data=xmlhttp.responseText; //拿到服務器返回的數據
        // ...our code here...在這裏進行數據返回後的操作
  }else
    {
    alert("Problem retrieving XML data");
    }
}

3.原生寫法中的注意點

(1).open() 的第三個參數中使用了 "true",該參數規定請求是否異步處理,默認是異步。True 表示腳本會在 send() 方法之後繼續執行,而不等待來自服務器的響應。

(2).關於readyState

誤。當 readyState 小於 3 的時候讀取這一屬性會導致一個異常。(後面會有http狀態碼的詳細解讀)

三.JQuery中的Ajax

JQuery對原生Ajax做了很好的封裝,使用起來非常簡單方便,具體的很多方法如 $.ajax,$.post, $.get, $.getJSON等能根據不同需要進行調用,寫法更加簡潔,但是爲了兼顧各個方法在這裏我以一個通用的方法 $.ajax爲例做一個簡單的解析,按照下面的模式寫好各個參數,就能成功進行Ajax的請求了,可能在實際中使用 $.post, $.get 這兩個方法使用比較多,但是解$.ajax 這個通用的方法能對封裝原理有很好的認識。

 $.ajax({
       type:   //數據的提交方式:get和post
       url:    //請求地址
       async:   //是否支持異步刷新,默認是true
       data:    //需要提交的數據
       dataType:   //服務器返回數據的類型,例如xml,String,Json等
       success:function(data){
       }    //請求成功後的回調函數,參數data就是服務器返回的數據
       error:function(data){
       }   //請求失敗後的回調函數,根據需要可以不寫,一般只寫上面的success回調函數
    })

四.GET or POST?

作爲Ajax最常用的兩種數據提交方式,GET和POST有着自己的特點和適用場景,正確區分GET和POST的不同並根據實際需要進行選用在開發中十分重要,簡單但是關鍵

先上一張GET 和 POST的比較圖,從這張圖中可以看出兩者之間的差別:

從表格中拎出關鍵點: 1.傳遞數據的方式不同:get是直接把請求數據放在url的後面,是可見的,post的請求數據不會顯示在url中,是不可見的。 2.數據長度和數據類型的差異:get有數據長度的的限制,且數據類型只允許ASCII字符,post在這兩方面都沒有限制。 3.安全性的差異:get不安全,post更安全。

由此得出的兩者的使用場景:get使用較方便,適用於頁面之間非敏感數據的簡單傳值,post使用較爲安全,適用於向服務器發送密碼、token等敏感數據。

五.success和complete的區別

JQuery封裝的Ajax回調函數中,success、error、complete是最常用的三個,其中,success和error很好區別,一個是請求成功調用的,另一個是請求失敗調用的,從字面上就可以理解。但是success和complete容易混淆,在這裏特別做一個說明:

success:請求成功後回調函數。

complete:請求完成後回調函數 (請求成功或失敗時均調用)。

注意到括號裏面了嗎,沒錯,區別就在於complete只要請求完成,不論是成功還是失敗均會調用。也就是說如果調用了success,一定會調用complete;反過來調用了complete,不一定會調用success。(狀態碼404、403、301、302...都會進入complete,只要不出錯就會調用)

六.XML -> JSON

Ajax中的是 "x" 指的就是XML。

xml:可擴展標記語言,標準通用標記語言的子集,是一種用於標記電子文件使其具有結構性的標記語言。

xml作爲一種數據交互格式,廣泛用在計算機領域,然而,隨着json的發展,json以其明顯的優勢已經漸漸取代了xml成爲現在數據交互格式的標準,所以在這裏,想強調的是,json現在是主流的數據交互格式,前後端的交互標準,無論是前端提交給後臺的數據,還是後臺返回給前端的數據,都最好統一爲json格式,各自接收到數據後再解析數據即可供後續使用。所以 "Ajax" 實際上已經發展爲 "Ajaj"

七.JSON和JSONP

json 和 jsonp 看起來只相差了一個 “p” ,然而實際上根本不是一個東西,千萬別以爲是差不多的兩個概念。

json:(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式。

jsonp:一種藉助 <script> 元素解決主流瀏覽器的跨域數據訪問問題的方式。

八.Ajax跨域訪問

ajax很好,但不是萬能的,ajax的請求與訪問同樣會受到瀏覽器同源策略的限制,不能訪問不同主域中的地址。所以,爲了解決這一問題,實現跨域訪問,有很多種方式,上述提到的jsonp就是一種流行的方式,還有其他一些方式,我在這裏就不展開說了,只是想說明ajax的使用也是有條件的,任何技術的實現都不會是沒有限制的。跨域訪問時一個很重要的知識點,之前專門寫過一篇關於跨域訪問的總結,還挺詳細的,可以移步查看: javascript中實現跨域的方式總結

九.再議HTTP狀態碼

前面提到的"200"、"404"只是http狀態碼中常見的兩個,當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在服務器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的服務器會返回一個包含HTTP狀態碼的信息頭(server header)用以響應瀏覽器的請求。

說道狀態碼,我有另外一篇文章寫得更詳細:接口請求返回狀態碼點擊可以查看https://blog.csdn.net/qq_40028324/article/details/80896768

 

  1. 101:切換協議,服務器根據客戶端的請求切換協議

  2. **200:請求成功。一般用於GET與POST請求**

  3. **301:永久重定向**

  4. **302:臨時重定向**

  5. 303:與301類似。使用GET和POST請求查看

  6. **304:請求資源未修改,使用緩存**

  7. 307:與302類似。使用GET請求重定向

  8. **404:客戶端請求失敗**

  9. 408:請求超時

  10. **500:內部服務器錯誤,無法完成請求**

  11. 505:服務器不支持請求的HTTP協議的版本,無法完成處理

    十.不可忽視的HTTP頭文件

    http請求中的一個重要關注點就是請求頭和響應頭的內容,從這兩個頭文件中可以看出很多東西,當我們用發送一個ajax請求的時候,如果沒有達到預期的效果,那麼就需要打開瀏覽器的調試工具,從NetWork中找到相應的ajax請求,再通過查看請求頭和響應頭的信息,大體會知道這次請求的結果是怎麼樣的,結合響應的主體內容,可以很快找到問題。所以學會看http的頭文件信息是前端開發中必須掌握的一個技能,下面就來看看具體的頭文件信息。

    首先隨便上一張sf中的完成一個搜索結果的http請求,可以從圖中的右側清楚看到請求頭和響應頭的內容,包括了很多個字段信息,這些字段信息就是我們需要掌握的知識點,下面挑出其中的重點字段進行分析。

1.請求頭信息:

  1. Accept:客戶端支持的數據類型

  2. Accept-Charset:客戶端採用的編碼

  3. Accept-Encoding:客戶端支持的數據壓縮格式

  4. Accept-Language:客戶端的語言環境

  5. Cookie:客服端的cookie

  6. Host:請求的服務器地址

  7. Connection:客戶端與服務連接類型

  8. If-Modified-Since:上一次請求資源的緩存時間,與Last-Modified對應

  9. If-None-Match:客戶段緩存數據的唯一標識,與Etag對應

  10. Referer:發起請求的源地址。

 2.響應頭信息:

 

  1. content-encoding:響應數據的壓縮格式。

  2. content-length:響應數據的長度。

  3. content-language:語言環境。

  4. content-type:響應數據的類型。

  5. Date:消息發送的時間

  6. Age:經過的時間

  7. Etag:被請求變量的實體值,用於判斷請求的資源是否發生變化

  8. Expires:緩存的過期時間

  9. Last-Modified:在服務器端最後被修改的時間

  10. server:服務器的型號

3.兩者都可能出現的消息

Pragma:是否緩存(http1.0提出) Cache-Control:是否緩存(http1.1提出)

4.跟緩存相關的字段

(1) 強制緩存 expire 和 cache-control

(2) 對比緩存 Last-Modified 和 If-Modified-Since Etag 和 If-None-Match

十一.Ajax的優缺點

1.優點:

  1. 頁面無刷新,在頁面內與服務器通信,減少用戶等待時間,增強了用戶體驗。

  2. 使用異步方式與服務器通信,響應速度更快。

  3. 可以把一些原本服務器的工作轉接到客戶端,利用客戶端閒置的能力來處理,減輕了服務器和帶寬的負擔,節約空間和寬帶租用成本。

  4. 基於標準化的並被廣泛支持的技術,不需要下載插件或者小程序。

2.缺點:

  1. 無法進行操作的後退,即不支持瀏覽器的頁面後退。

  2. 對搜索引擎的支持比較弱。

  3. 可能會影響程序中的異常處理機制。

  4. 安全問題,對一些網站攻擊,如csrf、xxs、sql注入等不能很好地防禦。

 此篇文章是通讀作者:山外de樓

文章地址:https://segmentfault.com/a/1190000010832550

非常感謝這位大佬

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章