日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

關(guān)于 axios 是什么?以及怎么用?

作者:野生的大熊 更新時(shí)間: 2023-07-09 編程語(yǔ)言

〇、前言

Axios 是一個(gè)基于 promise 的 HTTP 庫(kù),可以用在瀏覽器和 Node.js 中。簡(jiǎn)單的講就是可以發(fā)送 Get、Post 請(qǐng)求。

諸如 Vue、React、Angular 等前端框架都可以使用 Axios,由于他們不操作 DOM,所以就不必須引用 jQuery。如果你的項(xiàng)目里面用了 jQuery,此時(shí)就不需要多此一舉了,jQuery 里面本身就可以發(fā)送請(qǐng)求($.get(URL,data,function(data,status,xhr),dataType))。

幾個(gè)易混淆的概念

  1. Ajax:Asynchronous JavaScript And XML,翻譯過(guò)來(lái)就是“異步的 Javascript 和 XML”,屬于一個(gè)術(shù)語(yǔ)或概念模型,并不特指某一技術(shù),它很重要的特性之一就是讓頁(yè)面實(shí)現(xiàn)局部刷新,而無(wú)需重載整個(gè)頁(yè)面。
  2. XHR:XMLHttpRequest 對(duì)象用于與服務(wù)器交互。通過(guò) XMLHttpRequest 可以在不刷新頁(yè)面的情況下請(qǐng)求特定 URL,取的數(shù)據(jù)后刷新局部頁(yè)面。因此,XHR 可以實(shí)現(xiàn) Ajax 請(qǐng)求。
  3. Promise:是?ES6 新增的一個(gè)對(duì)象,是對(duì) XHR 的一種封裝。
    它就像一個(gè)容器,里面存放著未來(lái)才會(huì)執(zhí)行的函數(shù)名,處理結(jié)果要在異步操作完成后拿到,然后通過(guò) .then() 進(jìn)行后續(xù)操作。
    它有三種狀態(tài):Pending(進(jìn)行中)、Fulfilled(成功)、Rejected(拒絕),進(jìn)入成功或拒絕的狀態(tài)就不會(huì)再發(fā)生改變。
  4. Fetch:是在 ES6 出現(xiàn)的,它使用了 ES6 提出的 Promise 對(duì)象。是一種網(wǎng)絡(luò)請(qǐng)求標(biāo)準(zhǔn) API。
  5. Axios:用于網(wǎng)絡(luò)請(qǐng)求的第三方庫(kù),引用后即可用。
    使用環(huán)境有兩種,一種是在瀏覽器端發(fā)送 XHR 請(qǐng)求(中間有一層 Promise 封裝),另一種是在?nodejs 中發(fā)送 http 請(qǐng)求,因此利于平臺(tái)切換。
    支持 Promise API,使用 Promise 管理異步,告別傳統(tǒng) Callback 方式;豐富的配置項(xiàng),支持?jǐn)r截器等高級(jí)配置。

注:一兩句話不可能講清楚他們的區(qū)別,待后續(xù)再慢慢一一展開(kāi)介紹吧,如有不準(zhǔn)確的描述,請(qǐng)?jiān)u論區(qū)指正。

參考:你知道Ajax、Fetch、Axios三者的區(qū)別嗎??? ?ajax、Promise、axios總結(jié)

回到頂部

一、如何引用?

1、前端項(xiàng)目

 
// 1、安裝 Axios 庫(kù)
// 在項(xiàng)目文件根目錄下打開(kāi)命令行,輸入如下語(yǔ)句
> npm install axios
// 2、js 文件中引入
import axios from 'axios';
// 3、直接通過(guò)關(guān)鍵字 axios 發(fā)送 http 請(qǐng)求
// Get 請(qǐng)求
axios({
method: 'get',
url: 'URL文本'
}).then(({data}) => {
// 。。。
}).catch((err) =>{
console.log("catch-err:",err);
}).finally(() =>{
// 。。。
})
// Post 請(qǐng)求
axios({
headers:{'content-type':'application/json'},
method: 'post',
url: 'URL文本',
data:JSON.stringify({"dataid":dataid})
}).then(({data}) => {
console.log("then-data:",data);
}).catch((err) =>{
console.log("catch-err:",err);
}).finally(() =>{
// 。。。
})

2、ASP.NET Core MVC 項(xiàng)目

 
@* 1、引用 js 包的 CDN *@
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
@* 2、通過(guò)關(guān)鍵字 axios 發(fā)送 http 請(qǐng)求 *@
<script>
// 調(diào)用方法 message() 查看測(cè)試結(jié)果
window.onload = function () {
// Get 請(qǐng)求
axios.get('https://localhost:44360/api/Methodname', {
params: {
mingcheng: '網(wǎng)絡(luò)科技'
},
headers: {
'token': '1111',
}
}
).then(ret => {
console.log("get:", ret);
})
// Post 請(qǐng)求
axios.post('https://localhost:44360/api/Methodname',
{
"id": "df332b50-4abf-4fe6-814b-6d330a9ecc73",
"gongsix": "線下"
},
{
headers: {
'token': '1111',
}
}
).then(ret => {
console.log("post:", ret);
})
}
</script>

另外,除了通過(guò) CDN 引用 js 庫(kù)外,還可以直接添加 js 文件到項(xiàng)目的靜態(tài)文件夾 wwwroot,然后在 .cshtml 頁(yè)面文件中用過(guò)路徑引用。

簡(jiǎn)要的三個(gè)步驟如下:

  1. 下載 js 庫(kù)文件。可以直接在網(wǎng)絡(luò)上下載,也可以通過(guò)通過(guò)項(xiàng)目的“管理 NuGet 程序包”來(lái)安裝 axios。安裝成功后,找到對(duì)應(yīng)的包右鍵打開(kāi)“在文件資源管理器中打開(kāi)文件夾”,按照路徑“Content/Scripts/axios.min.js”找到下載的最新文件。
  2. 然后復(fù)制到“wwwroot/js/...”文件夾下備用。如下圖:

????

??3. 然后通過(guò)路徑引用后,即可在 js 腳本中使用 axios。

 
@* 注意路徑代表 wwwroot 文件夾中,要對(duì)應(yīng)得上 *@
<script src="~/js/axios/axios.min.js"></script>

回到頂部

二、語(yǔ)法

參數(shù)名 示例值 解釋
url '/user' 用于請(qǐng)求的服務(wù)器 URL
method 'get' 創(chuàng)建請(qǐng)求時(shí)使用的方法,默認(rèn) get
baseURL 'https://some-domain.com/api/' 將自動(dòng)加在 `url` 前面,除非 `url` 是一個(gè)絕對(duì) URL(URL 必須帶有資源的完整信息,包含協(xié)議、主機(jī)、路徑等部分)
headers {'X-Requested-With': 'XMLHttpRequest'} 自定義請(qǐng)求頭
params { ID: 12345 } URL 參數(shù),會(huì)自動(dòng)拼接到 URL 中
data { firstName: 'Fred' } 作為請(qǐng)求主體被發(fā)送的數(shù)據(jù),適用于'PUT'、'POST'、'PATCH' 三個(gè)請(qǐng)求方法。在沒(méi)有設(shè)置 transformRequest 時(shí),必須是以下類型之一:string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams、瀏覽器專屬:FormData, File, Blob、Nodejs專屬:Stream
timeout 1000 請(qǐng)求超時(shí)的毫秒數(shù)(0 表示無(wú)超時(shí)時(shí)間),若超時(shí)請(qǐng)求將被中斷
withCredentials false 跨域請(qǐng)求時(shí)是否需要使用憑證,默認(rèn) false
responseType 'json' 服務(wù)器響應(yīng)的數(shù)據(jù)類型,可以是 'arraybuffer', 'blob', 'document', 'json'-默認(rèn), 'text', 'stream'
responseEncoding 'utf8' 數(shù)據(jù)編碼類型,默認(rèn) utf8
maxContentLength 2000 允許的響應(yīng)內(nèi)容的最大長(zhǎng)度,設(shè)置為無(wú)限長(zhǎng)度:Infinity

1、Get 請(qǐng)求

以下列舉三種寫法:

 
// (調(diào)用型1)查詢給定 ID 的 user 對(duì)象請(qǐng)求
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// (調(diào)用型2)另一種寫法
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// (方法型)寫法
axios({
method:'get',
url:'/data.json',
params:{
id:'12345'
}
}).then((res)=>{
console.log(res)
})

?2、Post 請(qǐng)求

?一般上傳的數(shù)據(jù)分兩種:form-data 表單提交(圖片上傳、文件上傳)、application/json。

 
// 先定義一個(gè)入?yún)?data
let data = { id : 12 }
// (調(diào)用型)寫法
axios.post('/post',data)
}).then((res)=>{
console.log(res)
})
// (方法型)寫法
axios({
method:'post',
url:'/post',
data:data
}).then((res)=>{
console.log(res)
})

關(guān)于 Post 請(qǐng)求的 Content-Type:

當(dāng)我們直接把入?yún)⑻钊?json 對(duì)象,丟給后端接口,此時(shí) Content-Type 就自動(dòng)為:application/json;charset=UTF-8。

當(dāng)我們把 json 對(duì)象轉(zhuǎn)為 FormData 類型,如下:

 
let data = { id : 12 }
let formData = new FormData()
for(let key in data){
formData.append(key,data[key])
}

再將 formData 發(fā)送到后端,此時(shí)Content-Type 就自動(dòng)變成:multipart/form-data; boundary=...... 。

3、判斷多個(gè)請(qǐng)求全部完成 axios.all(sendAry).then()

 
// 請(qǐng)求列表,包含多個(gè)或多類型請(qǐng)求
let sendAry = [
axios.get('URL1'),
axios.get('URL2'),
axios.post('URL3')
];
// 列表中的請(qǐng)求都完成后,才進(jìn)行后續(xù)操作(可以基于ALL實(shí)現(xiàn))
axios.all(sendAry).then(result => {
console.log(result); // 輸出是一個(gè)數(shù)組,分別存儲(chǔ)每一個(gè)請(qǐng)求的結(jié)果
let [resA, resB, resC] = result;
});

4、攔截器

在請(qǐng)求或響應(yīng)被 then 或 catch 處理前攔截它們。

請(qǐng)求攔截器

 
axios.interceptors.request.use(
config=>{
// 在發(fā)送請(qǐng)求前做的操作
return config
},
err=>{
// 在請(qǐng)求錯(cuò)誤的時(shí)候做的操作(此處錯(cuò)誤,請(qǐng)求沒(méi)有到后端)
return Promise.reject(err) // 這里返回一個(gè) promise 對(duì)象
}
)

響應(yīng)攔截器

 
axios.interceptors.response.use(
res=>{
// 請(qǐng)求成功對(duì)響應(yīng)數(shù)據(jù)進(jìn)行處理
return res
},err=>{
// 響應(yīng)錯(cuò)誤做的操作(此處錯(cuò)誤,到達(dá)后端后返回)
return Promise.reject(err)
}
)

下面的代碼是我們平時(shí)發(fā)送 Get 請(qǐng)求的標(biāo)準(zhǔn)形態(tài),then 會(huì)執(zhí)行請(qǐng)求成功后的操作,catch 用來(lái)捕獲錯(cuò)誤。我們前面攔截響應(yīng)后,無(wú)論是請(qǐng)求還是響應(yīng)的攔截器,他們的 err 返回的 promise?都會(huì)進(jìn)入 catch 中

 
axios.get().then().catch(err=>{})

取消攔截器

 
let inerceptors = axios.interceptors.request.use
(config=>{
? ? config.header = {
? ? ? ? auth:true
? ? }
? ? return config
})
// 如下:用 axios 全局去調(diào)用 interceptors,這樣就取消攔截了
axios.inerceptors.request.eject(interceptors)

實(shí)例:通過(guò)攔截器控制登陸狀態(tài)

 
// 登錄狀態(tài),有 token,后端通過(guò) headers 中的 token 進(jìn)行身份校驗(yàn)
let request = axios.create({})
request.interceptors.request.use
(config => {
? config.headers.token = '' // 發(fā)送請(qǐng)求前,統(tǒng)一將 token 加入到請(qǐng)求 headers
? return config
})
// 非登陸狀態(tài),無(wú) token
let request2 = axios.create({})

5、參數(shù)配置方法

全局配置

 
// 兩個(gè)實(shí)例:(格式類同)
axios.defaults.timeout = 1000 // 全局配置請(qǐng)求時(shí)長(zhǎng)(單位:毫秒)
axios.defaults.baseURL = 'https://api.example.com'; // 統(tǒng)一配置請(qǐng)求基礎(chǔ) URL

實(shí)例配置

 
// 在創(chuàng)建實(shí)例時(shí)設(shè)置默認(rèn)配置
const instance = axios.create({
baseURL: 'https://api.example.com'
});
// 創(chuàng)建實(shí)例后可更改默認(rèn)值
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

優(yōu)先級(jí):請(qǐng)求配置 > 實(shí)例配置 > 全局配置

6、錯(cuò)誤處理

 
// 首先設(shè)置兩種攔截器
axios.interceptors.request.use(
config =>{
return config
},
err =>{
return Promise.reject(err)
}
)
axios.interceptors.response.use(
res =>{
return res
},
err =>{
return Promise.reject(err)
}
)
// 錯(cuò)誤的獲取
axios.get('/data.json').then(res=>{
console.log(res)
})
.catch(err =>{
console.log(err) // 所有錯(cuò)誤處理都會(huì)進(jìn)入此處
})

具體的實(shí)踐過(guò)程中,我們需要?jiǎng)?chuàng)建一個(gè)統(tǒng)一的錯(cuò)誤處理,將所有的錯(cuò)誤類型都放在攔截其中,方便我們后面調(diào)用接口時(shí)使用

一個(gè)實(shí)例:

 
// 創(chuàng)建一個(gè)請(qǐng)求實(shí)例
let instance = axios.create({})
// 為請(qǐng)求實(shí)例添加請(qǐng)求攔截器
instance.interceptors.request.use(
config =>{
return config
},
err =>{
// 請(qǐng)求錯(cuò)誤,一般 http 狀態(tài)碼以 4 開(kāi)頭,常見(jiàn):401 超時(shí),404 not found 多為前端瀏覽器錯(cuò)誤
return Promise.reject(err)
}
)
instance.interceptors.response.use(
res=>{
return res
},
err =>{
// 響應(yīng)錯(cuò)誤,一般 http 狀態(tài)碼以 5 開(kāi)頭,500 系統(tǒng)錯(cuò)誤,502 系統(tǒng)重啟等,偏向于服務(wù)端返回的報(bào)錯(cuò)
return Promise.reject(err)
}
)
// 使用
instance.get('/data').then(res=>{
console.log(res)
})
.catch(err => {
console.log(err)
})

?

原文鏈接:https://blog.csdn.net/2301_78834737/article/details/131588629

  • 上一篇:沒(méi)有了
  • 下一篇:沒(méi)有了
欄目分類
最近更新