前言
本文為轉(zhuǎn)載文,首發(fā)地址為GitHub博客,文末附原文鏈接
AJAX即“Asynchronous Javascript And XML”,是指一種創(chuàng)建交互式網(wǎng)頁應用的網(wǎng)頁開發(fā)技術。AJAX 是一種用于創(chuàng)建快速動態(tài)網(wǎng)頁的技術。它可以令開發(fā)者只向服務器獲取數(shù)據(jù)(而不是圖片,HTML文檔等資源),互聯(lián)網(wǎng)資源的傳輸變得前所未有的輕量級和純粹,這激發(fā)了廣大開發(fā)者的創(chuàng)造力,使各式各樣功能強大的網(wǎng)絡站點,和互聯(lián)網(wǎng)應用如雨后春筍一般冒出,不斷帶給人驚喜。
一、什么是Ajax
Ajax是一種異步請求數(shù)據(jù)的web開發(fā)技術,對于改善用戶的體驗和頁面性能很有幫助。簡單地說,在不需要重新刷新頁面的情況下,Ajax 通過異步請求加載后臺數(shù)據(jù),并在網(wǎng)頁上呈現(xiàn)出來。常見運用場景有表單驗證是否登入成功、百度搜索下拉框提示和快遞單號查詢等等。Ajax的目的是提高用戶體驗,較少網(wǎng)絡數(shù)據(jù)的傳輸量。同時,由于AJAX請求獲取的是數(shù)據(jù)而不是HTML文檔,因此它也節(jié)省了網(wǎng)絡帶寬,讓互聯(lián)網(wǎng)用戶的網(wǎng)絡沖浪體驗變得更加順暢。
二、Ajax原理是什么
在解釋Ajax原理之前,我們不妨先舉個“領導想找小李匯報一下工作”例子,領導想找小李問點事,就委托秘書去叫小李,自己就接著做其他事情,直到秘書告訴他小李已經(jīng)到了,最后小李跟領導匯報工作。
Ajax請求數(shù)據(jù)流程與“領導想找小李匯報一下工作”類似。其中最核心的依賴是瀏覽器提供的XMLHttpRequest對象,它扮演的角色相當于秘書,使得瀏覽器可以發(fā)出HTTP請求與接收HTTP響應。瀏覽器接著做其他事情,等收到XHR返回來的數(shù)據(jù)再渲染頁面。
理解了Ajax的工作原理后,接下來我們探討下如何使用Ajax。
三、Ajax的使用
1.創(chuàng)建Ajax核心對象XMLHttpRequest(記得考慮兼容性)
2.向服務器發(fā)送請求
method:請求的類型;GET 或 POST
url:文件在服務器上的位置
async:true(異步)或 false(同步)
注意:post請求一定要設置請求頭的格式內(nèi)容
3.服務器響應處理(區(qū)分同步跟異步兩種情況)
responseText 獲得字符串形式的響應數(shù)據(jù)。
responseXML 獲得XML 形式的響應數(shù)據(jù)。
①同步處理
②異步處理
相對來說比較復雜,要在請求狀態(tài)改變事件中處理。
什么是readyState?
readyState是XMLHttpRequest對象的一個屬性,用來標識當前XMLHttpRequest對象處于什么狀態(tài)。
readyState總共有5個狀態(tài)值,分別為0~4,每個值代表了不同的含義
0:未初始化 -- 尚未調(diào)用.open()方法;
1:啟動 -- 已經(jīng)調(diào)用.open()方法,但尚未調(diào)用.send()方法;
2:發(fā)送 -- 已經(jīng)調(diào)用.send()方法,但尚未接收到響應;
3:接收 -- 已經(jīng)接收到部分響應數(shù)據(jù);
4:完成 -- 已經(jīng)接收到全部響應數(shù)據(jù),而且已經(jīng)可以在客戶端使用了;
什么是status?
HTTP狀態(tài)碼(status)由三個十進制數(shù)字組成,第一個十進制數(shù)字定義了狀態(tài)碼的類型,后兩個數(shù)字沒有分類的作用。HTTP狀態(tài)碼共分為5種類型:
常見的狀態(tài)碼
僅記錄在 RFC2616 上的 HTTP 狀態(tài)碼就達 40 種,若再加上 WebDAV(RFC4918、5842)和附加 HTTP 狀態(tài)碼 (RFC6585)等擴展,數(shù)量就達 60 余種。接下來,我們就介紹一下這些具有代表性的一些狀態(tài)碼。
200 表示從客戶端發(fā)來的請求在服務器端被正常處理了。
204 表示請求處理成功,但沒有資源返回。
301 表示永久性重定向。該狀態(tài)碼表示請求的資源已被分配了新的URI,以后應使用資源現(xiàn)在所指的URI。
302 表示臨時性重定向。
304 表示客戶端發(fā)送附帶條件的請求時(指采用GET方法的請求報文中包含if-matched,if-modified-since,if-none-match,if-range,if-unmodified-since任一個首部)服務器端允許請求訪問資源,但因發(fā)生請求未滿足條件的情況后,直接返回304Modified(服務器端資源未改變,可直接使用客戶端未過期的緩存)
400 表示請求報文中存在語法錯誤。當錯誤發(fā)生時,需修改請求的內(nèi)容后再次發(fā)送請求。
401 表示未授權(Unauthorized),當前請求需要用戶驗證
403 表示對請求資源的訪問被服務器拒絕了
404 表示服務器上無法找到請求的資源。除此之外,也可以在服務器端拒絕請求且不想說明理由時使用。
500 表示服務器端在執(zhí)行請求時發(fā)生了錯誤。也有可能是Web應用存在的bug或某些臨時的故障。
503 表示服務器暫時處于超負載或正在進行停機維護,現(xiàn)在無法處理請求。
③GET和POST請求數(shù)據(jù)區(qū)別
使用Get請求時,參數(shù)在URL中顯示,而使用Post方式,則放在send里面
使用Get請求發(fā)送數(shù)據(jù)量小,Post請求發(fā)送數(shù)據(jù)量大
使用Get請求安全性低,會被緩存,而Post請求反之
關于第一點區(qū)別,詳情見下面兩張圖:
四、結(jié)束語
其實通過 XMLHttpRequest或者封裝后的框架進行網(wǎng)絡請求,這種方式已經(jīng)有點老舊了,配置和調(diào)用方式非常混亂,近幾年剛剛出來的Fetch提供了一個更好的替代方法,它不僅提供了一種簡單,合乎邏輯的方式來跨網(wǎng)絡異步獲取資源,而且可以很容易地被其他技術使用。
想了解如何利用Fetch請求數(shù)據(jù),請猛戳
fetch 如何請求常見數(shù)據(jù)格式
想了解Ajax如何請求后臺數(shù)據(jù),請猛戳
原文:https://github.com/ljianshu/Blog/issues/45
最后:“相信有很多想學前端的小伙伴,今年年初我花了一個月整理了一份最適合2018年學習的web前端干貨,從最基礎的HTML+CSS+JS到移動端HTML5等都有整理,送給每一位前端小伙伴,53763,1707這里是小白聚集地,歡迎初學和進階中的小伙伴?!?/b>
祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。
