詳解ajax、fetch、axios的區(qū)別
眾所周知它們都用來發(fā)送請求,其實它們區(qū)別還蠻大的。這也是面試中的高頻題,本文將詳細進行講解。
1. ajax
英譯過來是Aysnchronous JavaScript And XML
,直譯是異步JS
和XML
(XML
類似HTML
,但是設計宗旨就為了傳輸數(shù)據(jù),現(xiàn)已被JSON
代替),解釋一下就是說以XML
作為數(shù)據(jù)傳輸格式發(fā)送JS異步
請求。但實際上ajax是一個一類技術的統(tǒng)稱的術語,包括XMLHttpRequest
、JS
、CSS
、DOM
等,它主要實現(xiàn)網(wǎng)頁拿到請求數(shù)據(jù)后不用刷新整個頁面也能呈現(xiàn)最新的數(shù)據(jù)。
下面我們簡單封裝一個ajax
請求【面試高頻題】:
const ajaxGet = function (url) { const xhr = new XMLHttpRequest() xhr.open('get', url) xhr.onreadystatechange = () => { if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status < 400) { console.log(xhr.response); // 響應結果 } } } xhr.onerror = (error) => { console.log(error, xhr.status) } xhr.send() }
2. fetch
它其實就是一個JS
自帶的發(fā)送請求的一個api
,拿來跟ajax
對比是完全不合理的,它們完全不是一個概念的東西,適合拿來和fetch
對比的其實是xhr
,也就是上面封裝ajax
請求的代碼里的XMLHttpRequest
,這兩都是JS
自帶的發(fā)請求的方法,而fetch
是ES6
出現(xiàn)的,自然功能比xhr更強,主要原因就是它是基于Promise
的,它返回一個Promise
,因此可以使用.then(res => )
的方式鏈式處理請求結果,這不僅提高了代碼的可讀性,還避免了回調地獄(xhr
通過xhr.onreadystatechange= () => {}
這樣回調的方式監(jiān)控請求狀態(tài),要是想在請求后再發(fā)送請求就要在回調函數(shù)內再發(fā)送請求,這樣容易出現(xiàn)回調地獄)的問題。而且JS
自帶,語法也非常簡潔,幾行代碼就能發(fā)起一個請求,用起來很方便,據(jù)說大佬都愛用。
它的特點是:
- 使用 promise,不使用回調函數(shù)。
- 采用模塊化設計,比如 rep、res 等對象分散開來,比較友好。
- 通過數(shù)據(jù)流對象處理數(shù)據(jù),可以提高網(wǎng)站性能。
下面我們簡單寫個fetch請求的示例:
// get請求 fetch('http://127.0.0.1:8000/get') .then(res => { if (!res.ok) { throw new Error('請求錯誤!狀態(tài)碼為:', res.status) } return res.text() }).then(data => { console.log(data); }) // post請求 fetch('http://127.0.0.1:8000/post', { method: 'post', headers: { 'Content-Type': 'application/json' }, mode: 'no-cors', // 設置cors表示只能發(fā)送跨域的請求,no-cors表示跨不跨域都能發(fā) body: JSON.stringify({ name: 'zhangsan', age: 18 }) }).then(res => { return res.json() }).then(data => { console.log(data); })
3. axios
axios是用于網(wǎng)絡請求的第三方庫,它是一個庫。axios利用xhr進行了二次封裝的請求庫,xhr只是axios中的其中一個請求適配器,axios在nodejs端還有個http的請求適配器;axios = xhr + http;它返回一個Promise
?!卷椖恐薪洺P枰庋b的axios】
它的特點:
- 在瀏覽器環(huán)境中創(chuàng)建 XMLHttpRequests;在node.js環(huán)境創(chuàng)建 http 請求
- 返回Promise
- 攔截請求和響應
- 自動轉換 JSON 數(shù)據(jù)
- 轉換請求數(shù)據(jù)和響應數(shù)據(jù)
- 取消請求
它的基礎語法是:
// 發(fā)送 Get 請求 axios({ method: 'get', url: '', params: {} // 查詢query使用params }) // 發(fā)送 Post 請求 axios({ method: 'post', url: '', data: {} // 請求體body用data })
下面我們在vue項目中封裝一個使用axios實現(xiàn)的請求。
libs/config.js
:配置文件
const serverConfig = { baseUrl: "http://127.0.0.1:8000", // 請求基礎地址,可根據(jù)環(huán)境自定義 useTokenAuthentication: false, // 是否開啟token認證 }; export default serverConfig;
libs/request.js
:封裝請求
import axios from "axios"; // 第三方庫 需要安裝 import serverConfig from "./config"; // 創(chuàng)建axios實例 const apiClient = axios.create({ baseURL: serverConfig.baseUrl, // 基礎請求地址 withCredentials: false, // 跨域請求是否需要攜帶cookie headers: { Accept: "application/json", "Content-Type": "application/json", }, timeout: 10000, // 請求超時時間 }); // 請求攔截 apiClient.interceptors.request.use( (config) => { // 請求發(fā)送前的處理邏輯 比如token認證,設置各種請求頭啥的 // 如果開啟token認證 if (serverConfig.useTokenAuthentication) { // 請求頭攜帶token config.headers.Authorization = localStorage.getItem("token"); } return config; }, (error) => { // 請求發(fā)送失敗的處理邏輯 return Promise.reject(error); } ); // 響應攔截 apiClient.interceptors.response.use( (response) => { // 響應數(shù)據(jù)處理邏輯,比如判斷token是否過期等等 // 代碼塊 return response; }, (error) => { // 響應數(shù)據(jù)失敗的處理邏輯 let message = ""; if (error && error.response) { switch (error.response.status) { case 302: message = "接口重定向了!"; break; case 400: message = "參數(shù)不正確!"; break; case 401: message = "您未登錄,或者登錄已經超時,請先登錄!"; break; case 403: message = "您沒有權限操作!"; break; case 404: message = `請求地址出錯: ${error.response.config.url}`; break; case 408: message = "請求超時!"; break; case 409: message = "系統(tǒng)已存在相同數(shù)據(jù)!"; break; case 500: message = "服務器內部錯誤!"; break; case 501: message = "服務未實現(xiàn)!"; break; case 502: message = "網(wǎng)關錯誤!"; break; case 503: message = "服務不可用!"; break; case 504: message = "服務暫時無法訪問,請稍后再試!"; break; case 505: message = "HTTP 版本不受支持!"; break; default: message = "異常問題,請聯(lián)系管理員!"; break; } } return Promise.reject(message); } ); export default apiClient;
/api/index.js
:配置請求接口,這里一個get一個post
import apiClient from "@/libs/request"; let getInfo = (params) => { return apiClient({ url: "/get", method: "get", params, // axios的get請求query用params }); }; let postInfo = (params) => { return apiClient({ url: "/post", method: "post", data: params, // axios的post請求body用data }); }; export default { getInfo, postInfo, };
App.vue
:用于測試請求結果
<script> import api from './api/index.js' export default { data() { return { isH5: true } }, created() { this.init() }, methods: { init() { api.getInfo().then(res => { console.log(res.data); }) api.postInfo({ name: 'zhangsan', age: '18' }).then(res => { console.log(res.data); }) } }, } </script>
結果如下:
4. 總結
總結一部分區(qū)別如下:【這三個東西差別真的很大】
Ajax | fetch | axios | |
---|---|---|---|
類型 | 術語,技術的統(tǒng)稱 | js內置的api | 第三方庫 |
是否使用xhr二次封裝 | 是 | 否 | 是 |
是否返回Promise | 否 | 是 | 是 |
到此這篇關于詳解ajax、fetch、axios的區(qū)別的文章就介紹到這了,更多相關ajax fetch axios內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用smartupload組件實現(xiàn)jsp+jdbc上傳下載文件實例解析
這篇文章主要介紹了使用smartupload組件實現(xiàn)jsp+jdbc上傳下載文件實例解析,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-01-01javascript設計模式 – 外觀模式原理與用法實例分析
這篇文章主要介紹了javascript設計模式 – 外觀模式,結合實例形式分析了javascript外觀模式基本概念、原理、用法及操作注意事項,需要的朋友可以參考下2020-04-04Map與WeakMap類型在JavaScript中的使用詳解
這篇文章主要介紹了Map與WeakMap類型在JavaScript中的使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11可能是全網(wǎng)最詳細小程序中使用echarts的教程
在開發(fā)微信小程序時,有需求需要使用到柱狀圖,餅圖等圖表,下面這篇文章主要給大家介紹了關于小程序中使用echarts的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-10-10淺談監(jiān)聽單選框radio改變事件(和layui中單選按鈕改變事件)
今天小編就為大家分享一篇淺談監(jiān)聽單選框radio改變事件(和layui中單選按鈕改變事件),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09掃微信小程序碼實現(xiàn)網(wǎng)站登陸實現(xiàn)解析
這篇文章主要介紹了掃微信小程序碼實現(xiàn)網(wǎng)站登陸實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08javascript中的__defineGetter__和__defineSetter__介紹
這篇文章主要介紹了javascript中的__defineGetter__和__defineSetter__介紹,類似面向對象語言中的get和set關鍵字,需要的朋友可以參考下2014-08-08