###### tags: `📆2022年` `💻編程/🖼前端` `🗂Overview`
# Axios 異步網路請求
==主要用於學習往後前端框架的預備知識,內容暫不全。==
- [Axios官網](https://axios-http.com/docs/intro)
- Axios是基於ES6 promise的HTTP庫管理異步請求,而不是使用傳統callback的方式,可參考:[[🏖ECMAScirpt6#🏖Promise]]
- `axios.request()`
- `axios.get()`
- `axios.post()`
- `axios.delete()`
- `axios.put()`
- `axios.patch()`
- `axios.header()`
## 🏖基礎用法
使用CDN的方式靜態引入Axios
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.1.3/axios.min.js"></script>
```
```javascript
// 默認是用get請求
// axios('https://randomuser.me/api/')
axios.get('https://randomuser.me/api/')
.then(
resolve => { // 請求成功時調用
console.log('1. request success')
console.log(resolve)
console.log(resolve.data)
},
reject => { // 請求拒絕時調用
console.log('1. request reject')
console.log(reject)
console.log(reject.data)
}
).catch(exception => { // 請求有異常時調用
console.log("have some error : " + error)
})
axios.get('https://randomuser.me/api/', {
// get參數
name: 'mickey',
id: 123
}).then(resolve =>{
console.log('2. request success')
console.log(resolve.data)
})
axios.get('https://randomuser.me/api/', 'name=mickey&id=123')
.then(resolve =>{
console.log('2. request success')
console.log(resolve.data)
})
// post請求
axios.post('https://hexschool-tutorial.herokuapp.com/api/signup', {
// post參數
email: 'mickeytest123@gmail.com',
password: '1234'
}).then(resolve =>{
console.log('3. request success')
console.log(resolve.data)
})
// 使用參數的方式指定,比較少用
axios({
method: 'post',
url: 'https://hexschool-tutorial.herokuapp.com/api/signup',
headers: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
email: 'mickeytest123@gmail.com',
password: '1234'
},
}).then(resolve =>{
console.log('4. request success')
console.log(resolve.data)
})
```
## 🏖處理并發請求
使用方式類似於`Promise.all()`,可參考:[[🏖ECMAScirpt6#🏖Promise#ES6處理并發]]
```javascript
// 處理并發請求
axios.all([
axios.get('https://randomuser.me/api/'),
axios.post('https://hexschool-tutorial.herokuapp.com/api/signup', {
email: 'mickeytest233@gmail.com',
password: '1234'
}),
]).then(resolve => { // 一次取得所有請求的響應內容
console.log('2. request success : ')
for(let i = 0; i < resolve.length; i ++){
console.log(resolve[i])
}
}).catch(exception => {
console.log('2. request exception')
console.log(exception)
})
```
## 🏖全局配置
基本上[請求配置](https://axios-http.com/zh/docs/req_config)中的所有參數都可以配置成全局參數
```javascript
// axios全局配置
axios.defaults.baseURL = 'https://randomuser.me/'
axios.defaults.timeout = 5000
axios.defaults.headers.post['content-type'] = 'application/x-www-form-urlencoded'
axios.get('api/')
.then(resolve => {
console.log('3. request success : ')
console.log(resolve.data)
}, reject => {
console.log('3. request reject')
})
```
## 🏖axios實例封裝
可參考官方文檔:[axios instance](https://axios-http.com/zh/docs/instance)
```javascript
// axios實例
// 實例配置會覆蓋全局配置
let instance = axios.create({
baseURL: 'https://randomuser.me/',
timeout: 5000,
})
instance.get('api/')
.then(resolve => {
console.log('4. request success : ')
console.log(resolve.data)
}, reject => {
console.log('4. request reject')
})
// 建立實列化對象時有指定請求方法,可以直接調用
let instance02 = axios.create({
baseURL: 'https://randomuser.me/',
method: 'get',
timeout: 5000,
})
instance02().then()
```
## 🏖攔截器
- 可參考官方文檔:[axios interceptors](https://axios-http.com/zh/docs/interceptors)
- 應用
1. 為每個請求帶上參數,如:token、時間戳…
2. 對返回狀態進行判斷,如:token是否過期…
```javascript
// axios實例
let instance03 = axios.create({
baseURL: 'https://randomuser.me/',
timeout: 5000,
})
// 請求欄截器
instance03.interceptors.request.use(
config => { // 處理攔截的函數
console.log('interceptor request start')
return config // 請求放行
}, exception => { // 處理攔截時有異常的函數
console.log(exception)
}
)
// 響應攔截器
instance03.interceptors.response.use(
response => {
console.log('interceptor response start')
return response // 響應放行
}, exception => {
console.log(exception)
}
)
// 發送請求
instance03.get('api/')
.then(resolve => {
console.log('5. request success : ')
console.log(resolve.data)
}, reject => {
console.log('5. request reject')
})
```
## 🏖使用webpack打包
1. `npm init -y`,初始化包管理配置文件package.json
2. `npm install axios -S`,安裝axios套件,並配置至生産環境
3. `npm install webpack webpack-cli -D`,安裝[[🧊Webpack]]套件,並配置至開發環境
4. `npm install html-webpack-plugin -D`,安裝套件
5. 配置webpack.config.js
```javascript
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// 設置入口文件
entry: './src/index.js',
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
}),
],
// 設置為開發模式
mode: 'development',
}
```
6. 配置package.json
```json
{
"scripts": {
"dev": "webpack"
},
}
```
7. 可以測試打包是否成功,`npm run dev`
8. index.js使用axios
```javascript
// 引入axios
import axios from "axios";
axios.get('https://randomuser.me/api/')
.then(resolve => {
console.log("1. request success : ")
console.log(resolve.data)
}, reject => {
console.log("1. request reject")
})
```