# axios-request
**Repository Path**: eightFlying/axios-request
## Basic Information
- **Project Name**: axios-request
- **Description**: 阅读 axios中文说明 笔记
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2019-08-21
- **Last Updated**: 2021-02-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# axios-request
## 并发请求
```javascript
const a1 = axios.get('api/mock1')
const a2 = axios.post('api/mock2')
axios.all([a1, a2]).then( //两个请求都完成时才回调
axios.spread((val1, val2) => { //spread可对返回的数组进行分割 分割成多个单独的响应对象
this.result = `${decodeURI(val1.data.content)}
${decodeURI(val2.data.content)}
axios.all()组合请求 axios.spread()分割响应`
})
)
```
## 请求配置
```javascript
// 创建请求时可以用的配置选项 axios({...})
// 只有 url 是必需的。如果没有指定 method,请求将默认使用 get 方法
const options = {
url: 'api/mock1', // `url` 是用于请求的服务器 URL
method: 'post', // 默认是 get
baseURL: 'http://avengers.local/', // 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL
transformRequest: [(data) => `(在向服务器发送前,修改请求数据)${JSON.stringify(data)}`], //允许在向服务器发送前,修改请求数据,只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法,后面数组中的函数必须返回一个字符串
transformResponse: [(data) => {
let obj = JSON.parse(data)
obj.content = `(在传递给 then/catch 前,修改响应数据)
${JSON.parse(data).content}`
return obj
}], // 在传递给 then/catch 前,允许修改响应数据
headers: {
'Content-Type': 'application/json'
}, // `headers` 是即将被发送的自定义请求头
params: { //`params` 是即将与请求一起发送的 URL 参数
id: 9
},
paramsSerializer: null,// 一个负责 `params` 序列化的函数
data: { //`data` 是作为请求主体被发送的数据
username: 'Nat'
},
timeout: 1000, //请求超时的毫秒数(0 表示无超时时间),如果请求话费了超过 `timeout` 的时间,请求将被中断
withCredentials: false, // 跨域请求时是否需要使用凭证,默认的false
adapter: null, //允许自定义处理请求返回一个 promise
auth: null, //应该使用 HTTP 基础验证,并提供凭据
responseType: 'json', //服务器响应的数据类型默认 json
xsrfCookieName: 'XSRF-TOKEN', // 默认的
xsrfHeaderName: 'X-XSRF-TOKEN', // 默认的
onUploadProgress: null, //允许为上传处理进度事件
onDownloadProgress: null, //允许为下载处理进度事件
maxContentLength: 2000, // 定义允许的响应内容的最大尺寸
validateStatus: (status) => { //定义对于给定的HTTP 响应状态码是 resolve 或 reject
return status >= 200 && status < 300; // 默认的resolve 在这个条件下是不会reject错误的
},
maxRedirects: 5, // 默认的,如果设置为0,将不会 允许 任何重定向
// httpAgent: new http.Agent({ //用于定义在执行 http 和 https 时使用的自定义代理
// keepAlive: false // 默认没有启用
// }),
// httpsAgent: new https.Agent({ //用于定义在执行 http 和 https 时使用的自定义代理
// keepAlive: false // 默认没有启用
// }),
proxy: { //'proxy' 定义代理服务器的主机名称和端口
// host: '127.0.0.1',
// port: 9000,
auth: { //`auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据
// username: 'mikeymike',
// password: 'rapunz3l'
}
},
// cancelToken: new CancelToken(function (cancel) {}) //指定用于取消请求的 cancel token
}
export default options
```
## 配置优先级
- 配置会以一个优先顺序进行合并。这个顺序是:在 lib/defaults.js 找到的库的默认值,然后是实例的 defaults 属性,最后是请求的 config 参数。后者将优先于前者。
## 拦截器
```javascript
//拦截器
axios.interceptors.request.use(config => { //config是配置选项的对象
config.params = {
tip: `拦截器拦截请求改变params请求参数`,
...config.params
}
if (config.method === 'post') {
config.data = {
add: '拦截器拦截请求改变data请求参数',
...config.data
}
}
return config
}, err => {
return Promise.reject(err)
})
axios.interceptors.response.use(response => {
if (response.config.baseURL == 'http://avengers.local/') {
response.data.content = '(拦截器拦截响应)' + response.data.content
}
return response
}, err => {// 拦截错误信息
return Promise.reject(err)
})
// 移除拦截器:
// var myInterceptor = axios.interceptors.request.use(function () {
// /*...*/ });
// axios.interceptors.request.eject(myInterceptor);
// 自定义实例添加拦截器
// var instance = axios.create();
// instance.interceptors.request.use(function () {
// /*...*/ });
```
## 取消请求
```javascript
取消请求
var CancelToken = axios.CancelToken;
var cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c) {
// executor 函数接收一个 cancel 函数作为参数
cancel = c;
})
});
// 取消请求
cancel();
```