# axios
基于 promise 用于浏览器和 node.js 的 http 客户端
# 特点
- 支持浏览器和 node.js
- 支持 promise
- 能拦截请求和响应
- 能转换请求和响应数据
- 能取消请求
- 自动转换 JSON 数据
- 浏览器端支持防止 CSRF (跨站请求伪造)
# 安装
npm 安装
$ npm install axios |
bower 安装
$ bower install axios |
通过 cdn 引入
<script src="https://unpkg.com/axios/dist/axios.min.js"></script> |
# 例子
发起一个 GET 请求
// Make a request for a user with a given ID | |
axios.get('/user?ID=12345') | |
.then(function (response) { | |
console.log(response); | |
}) | |
.catch(function (error) { | |
console.log(error); | |
}); | |
// Optionally the request above could also be done as | |
axios.get('/user', { | |
params: { | |
ID: 12345 | |
} | |
}) | |
.then(function (response) { | |
console.log(response); | |
}) | |
.catch(function (error) { | |
console.log(error); | |
}); |
发起一个 POST 请求
axios.post('/user', { | |
firstName: 'Fred', | |
lastName: 'Flintstone' | |
}) | |
.then(function (response) { | |
console.log(response); | |
}) | |
.catch(function (error) { | |
console.log(error); | |
}); |
同时发起多个请求
function getUserAccount() { | |
return axios.get('/user/12345'); | |
} | |
function getUserPermissions() { | |
return axios.get('/user/12345/permissions'); | |
} | |
axios.all([getUserAccount(), getUserPermissions()]) | |
.then(axios.spread(function (acct, perms) { | |
// Both requests are now complete | |
})); |
# 四种请求方式以及参数设置详解
# GET 请求:
- url (string): 请求的 URL 地址。
- params (object): 请求的查询参数对象。
- headers (object): 请求头对象。
- timeout (number): 请求超时时间。
- withCredentials (boolean): 是否携带跨域请求的凭证。
- cancelToken (CancelToken): 用于取消请求的 CancelToken 对象。
- responseType (string): 响应数据的类型。
- onUploadProgress (function): 用于上传进度监听的回调函数。
- onDownloadProgress (function): 用于下载进度监听的回调函数。
axios.get(url, { | |
params: { | |
key1: value1, | |
key2: value2 | |
}, | |
headers: { | |
'Content-Type': 'application/json' | |
}, | |
timeout: 5000, | |
withCredentials: true, | |
cancelToken: cancelTokenSource.token, | |
responseType: 'json', | |
onUploadProgress: function(progressEvent) { | |
// 上传进度监听回调函数 | |
}, | |
onDownloadProgress: function(progressEvent) { | |
// 下载进度监听回调函数 | |
} | |
}); |
# POST 请求:
- url (string): 请求的 URL 地址。
- data (any): 请求的数据。
- params (object): 请求的查询参数对象。
- headers (object): 请求头对象。
- timeout (number): 请求超时时间。
- withCredentials (boolean): 是否携带跨域请求的凭证。
- cancelToken (CancelToken): 用于取消请求的 CancelToken 对象。
- responseType (string): 响应数据的类型。
- onUploadProgress (function): 用于上传进度监听的回调函数。
- onDownloadProgress (function): 用于下载进度监听的回调函数。
axios.post(url, data, { | |
params: { | |
key1: value1, | |
key2: value2 | |
}, | |
headers: { | |
'Content-Type': 'application/json' | |
}, | |
timeout: 5000, | |
withCredentials: true, | |
cancelToken: cancelTokenSource.token, | |
responseType: 'json', | |
onUploadProgress: function(progressEvent) { | |
// 上传进度监听回调函数 | |
}, | |
onDownloadProgress: function(progressEvent) { | |
// 下载进度监听回调函数 | |
} | |
}); |
# PUT 请求:
- url (string): 请求的 URL 地址。
- data (any): 请求的数据。
- headers (object): 请求头对象。
- timeout (number): 请求超时时间。
- withCredentials (boolean): 是否携带跨域请求的凭证。
- cancelToken (CancelToken): 用于取消请求的 CancelToken 对象。
- responseType (string): 响应数据的类型。
- onUploadProgress (function): 用于上传进度监听的回调函数。
- onDownloadProgress (function): 用于下载进度监听的回调函数。
axios.put(url, data, { | |
headers: { | |
'Content-Type': 'application/json' | |
}, | |
timeout: 5000, | |
withCredentials: true, | |
cancelToken: cancelTokenSource.token, | |
responseType: 'json', | |
onUploadProgress: function(progressEvent) { | |
// 上传进度监听回调函数 | |
}, | |
onDownloadProgress: function(progressEvent) { | |
// 下载进度监听回调函数 | |
} | |
}); |
# DELETE 请求:
- url (string): 请求的 URL 地址。
- params (object): 请求的查询参数对象。
- headers (object): 请求头对象。
- timeout (number): 请求超时时间。
- withCredentials (boolean): 是否携带跨域请求的凭证。
- cancelToken (CancelToken): 用于取消请求的 CancelToken 对象。
- responseType (string): 响应数据的类型。
- onUploadProgress (function): 用于上传进度监听的回调函数。
- onDownloadProgress (function): 用于下载进度监听的回调函数。
axios.delete(url, { | |
params: { | |
key1: value1, | |
key2: value2 | |
}, | |
headers: { | |
'Content-Type': 'application/json' | |
}, | |
timeout: 5000, | |
withCredentials: true, | |
cancelToken: cancelTokenSource.token, | |
responseType: 'json', | |
onUploadProgress: function(progressEvent) { | |
// 上传进度监听回调函数 | |
}, | |
onDownloadProgress: function(progressEvent) { | |
// 下载进度监听回调函数 | |
} | |
}); |
# axios api
可以通过导入相关配置发起请求
# axios(config)
// 发起一个 POST 请求 | |
axios({ | |
method: 'post', | |
url: '/user/12345', | |
data: { | |
firstName: 'Fred', | |
lastName: 'Flintstone' | |
} | |
}); |
// 获取远程图片 | |
axios({ | |
method:'get', | |
url:'http://bit.ly/2mTM3nY', | |
responseType:'stream' | |
}) | |
.then(function(response) { | |
response.data.pipe(fs.createWriteStream('ada_lovelace.jpg')) | |
}); |
# axios(url[, config])
// 发起一个 GET 请求(GET 是默认的请求方法) | |
axios('/user/12345'); |
# 请求方法别名
为了方便我们为所有支持的请求方法均提供了别名。
- axios.request(config)
- axios.get(url[, config])
- axios.delete(url[, config])
- axios.head(url[, config])
- axios.options(url[, config])
- axios.post(url[, data[, config]])
- axios.put(url[, data[, config]])
- axios.patch(url[, data[, config]])
注释
当使用以上别名方法时, url , method 和 data 等属性不用在 config 重复声明。
# 同时发生的请求
一下两个用来处理同时发生多个请求的辅助函数
- axios.all(iterable)
- axios.spread(callback)
# 创建一个实例
你可以创建一个拥有通用配置的 axios 实例
- axios.creat([config])
var instance = axios.create({ | |
baseURL: 'https://some-domain.com/api/', | |
timeout: 1000, | |
headers: {'X-Custom-Header': 'foobar'} | |
}); |
# 实例的方法
以下是所有可用的实例方法,额外声明的配置将与实例配置合并
- axios#request(config)
- axios#get(url[, config])
- axios#delete(url[, config])
- axios#head(url[, config])
- axios#options(url[, config])
- axios#post(url[, data[, config]])
- axios#put(url[, data[, config]])
- axios#patch(url[, data[, config]])
# 请求配置
下面是所有可用的请求配置项,只有 url 是必填,默认的请求方法是 GET ,如果没有指定请求方法的话。
{ | |
// `url` 是请求的接口地址 | |
url: '/user', | |
// `method` 是请求的方法 | |
method: 'get', // 默认值 | |
// 如果 url 不是绝对路径,那么会将 baseURL 和 url 拼接作为请求的接口地址 | |
// 用来区分不同环境,建议使用 | |
baseURL: 'https://some-domain.com/api/', | |
// 用于请求之前对请求数据进行操作 | |
// 只用当请求方法为‘PUT’,‘POST’和‘PATCH’时可用 | |
// 最后一个函数需 return 出相应数据 | |
// 可以修改 headers | |
transformRequest: [function (data, headers) { | |
// 可以对 data 做任何操作 | |
return data; | |
}], | |
// 用于对相应数据进行处理 | |
// 它会通过 then 或者 catch | |
transformResponse: [function (data) { | |
// 可以对 data 做任何操作 | |
return data; | |
}], | |
// `headers` are custom headers to be sent | |
headers: {'X-Requested-With': 'XMLHttpRequest'}, | |
// URL 参数 | |
// 必须是一个纯对象或者 URL 参数对象 | |
params: { | |
ID: 12345 | |
}, | |
// 是一个可选的函数负责序列化 `params` | |
// (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/) | |
paramsSerializer: function(params) { | |
return Qs.stringify(params, {arrayFormat: 'brackets'}) | |
}, | |
// 请求体数据 | |
// 只有当请求方法为 'PUT', 'POST', 和 'PATCH' 时可用 | |
// 当没有设置 `transformRequest` 时,必须是以下几种格式 | |
// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams | |
// - Browser only: FormData, File, Blob | |
// - Node only: Stream, Buffer | |
data: { | |
firstName: 'Fred' | |
}, | |
// 请求超时时间(毫秒) | |
timeout: 1000, | |
// 是否携带 cookie 信息 | |
withCredentials: false, // default | |
// 统一处理 request 让测试更加容易 | |
// 返回一个 promise 并提供一个可用的 response | |
// 其实我并不知道这个是干嘛的!!!! | |
// (see lib/adapters/README.md). | |
adapter: function (config) { | |
/* ... */ | |
}, | |
// `auth` indicates that HTTP Basic auth should be used, and supplies credentials. | |
// This will set an `Authorization` header, overwriting any existing | |
// `Authorization` custom headers you have set using `headers`. | |
auth: { | |
username: 'janedoe', | |
password: 's00pers3cret' | |
}, | |
// 响应格式 | |
// 可选项 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream' | |
responseType: 'json', // 默认值是 json | |
// `xsrfCookieName` is the name of the cookie to use as a value for xsrf token | |
xsrfCookieName: 'XSRF-TOKEN', // default | |
// `xsrfHeaderName` is the name of the http header that carries the xsrf token value | |
xsrfHeaderName: 'X-XSRF-TOKEN', // default | |
// 处理上传进度事件 | |
onUploadProgress: function (progressEvent) { | |
// Do whatever you want with the native progress event | |
}, | |
// 处理下载进度事件 | |
onDownloadProgress: function (progressEvent) { | |
// Do whatever you want with the native progress event | |
}, | |
// 设置 http 响应内容的最大长度 | |
maxContentLength: 2000, | |
// 定义可获得的 http 响应状态码 | |
//return true、设置为 null 或者 undefined,promise 将 resolved, 否则将 rejected | |
validateStatus: function (status) { | |
return status >= 200 && status < 300; // default | |
}, | |
// `maxRedirects` defines the maximum number of redirects to follow in node.js. | |
// If set to 0, no redirects will be followed. | |
// 最大重定向次数?没用过不清楚 | |
maxRedirects: 5, // default | |
// `httpAgent` and `httpsAgent` define a custom agent to be used when performing http | |
// and https requests, respectively, in node.js. This allows options to be added like | |
// `keepAlive` that are not enabled by default. | |
httpAgent: new http.Agent({ keepAlive: true }), | |
httpsAgent: new https.Agent({ keepAlive: true }), | |
// 'proxy' defines the hostname and port of the proxy server | |
// Use `false` to disable proxies, ignoring environment variables. | |
// `auth` indicates that HTTP Basic auth should be used to connect to the proxy, and | |
// supplies credentials. | |
// This will set an `Proxy-Authorization` header, overwriting any existing | |
// `Proxy-Authorization` custom headers you have set using `headers`. | |
// 代理 | |
proxy: { | |
host: '127.0.0.1', | |
port: 9000, | |
auth: { | |
username: 'mikeymike', | |
password: 'rapunz3l' | |
} | |
}, | |
// `cancelToken` specifies a cancel token that can be used to cancel the request | |
// (see Cancellation section below for details) | |
// 用于取消请求?又是一个不知道怎么用的配置项 | |
cancelToken: new CancelToken(function (cancel) { | |
}) | |
} |
# 响应组成
response 由以下几部分信息组成
{ | |
// 服务端返回的数据 | |
data: {}, | |
// 服务端返回的状态码 | |
status: 200, | |
// 服务端返回的状态信息 | |
statusText: 'OK', | |
// 响应头 | |
// 所有的响应头名称都是小写 | |
headers: {}, | |
//axios 请求配置 | |
config: {}, | |
// 请求 | |
request: {} | |
} |
用 then 接收以下响应信息
axios.get('/user/12345') | |
.then(function(response) { | |
console.log(response.data); | |
console.log(response.status); | |
console.log(response.statusText); | |
console.log(response.headers); | |
console.log(response.config); | |
}); |
# 默认配置
# 全局修改 axios 默认配置
axios.defaults.baseURL = 'https://api.example.com'; | |
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; | |
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; |
# 实例默认配置
// 创建实例时修改配置 | |
var instance = axios.create({ | |
baseURL: 'https://api.example.com' | |
}); | |
// 实例创建之后修改配置 | |
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN; |
# 配置优先级
配置项通过一定的规则合并, request config > instance.defaults > 系统默认 ,优先级高的覆盖优先级低的。
// 创建一个实例,这时的超时时间为系统默认的 0 | |
var instance = axios.create(); | |
// 通过 instance.defaults 重新设置超时时间为 2.5s,因为优先级比系统默认高 | |
instance.defaults.timeout = 2500; | |
// 通过 request config 重新设置超时时间为 5s,因为优先级比 instance.defaults 和系统默认都高 | |
instance.get('/longRequest', { | |
timeout: 5000 | |
}); |
# 拦截器
你可以在 then 和 catch 之前拦截请求和响应。
// 添加一个请求拦截器 | |
axios.interceptors.request.use(function (config) { | |
// Do something before request is sent | |
return config; | |
}, function (error) { | |
// Do something with request error | |
return Promise.reject(error); | |
}); | |
// 添加一个响应拦截器 | |
axios.interceptors.response.use(function (response) { | |
// Do something with response data | |
return response; | |
}, function (error) { | |
// Do something with response error | |
return Promise.reject(error); | |
}); |
如果之后想移除拦截器你可以这么做
var myInterceptor = axios.interceptors.request.use(function () {/*...*/}); | |
axios.interceptors.request.eject(myInterceptor); |
你也可以为 axios 实例添加一个拦截器
var instance = axios.create(); | |
instance.interceptors.request.use(function () {/*...*/}); |
# 错误处理
axios.get('/user/12345') | |
.catch(function (error) { | |
if (error.response) { | |
// 发送请求后,服务端返回的响应码不是 2xx | |
console.log(error.response.data); | |
console.log(error.response.status); | |
console.log(error.response.headers); | |
} else if (error.request) { | |
// 发送请求但是没有响应返回 | |
console.log(error.request); | |
} else { | |
// 其他错误 | |
console.log('Error', error.message); | |
} | |
console.log(error.config); | |
}); |
你可以用 validateStatus 定义一个 http 状态码返回的范围.
axios.get('/user/12345', { | |
validateStatus: function (status) { | |
return status < 500; // Reject only if the status code is greater than or equal to 500 | |
} | |
}) |
# 取消请求
你可以通过 cancel token 来取消一个请求
The axios cancel token API is based on the withdrawn cancelable promises proposal .
You can create a cancel token using the CancelToken.source factory as shown below:
var CancelToken = axios.CancelToken; | |
var source = CancelToken.source(); | |
axios.get('/user/12345', { | |
cancelToken: source.token | |
}).catch(function(thrown) { | |
if (axios.isCancel(thrown)) { | |
console.log('Request canceled', thrown.message); | |
} else { | |
// handle error | |
} | |
}); | |
// cancel the request (the message parameter is optional) | |
source.cancel('Operation canceled by the user.'); |
You can also create a cancel token by passing an executor function to the CancelToken constructor:
var CancelToken = axios.CancelToken; | |
var cancel; | |
axios.get('/user/12345', { | |
cancelToken: new CancelToken(function executor(c) { | |
// An executor function receives a cancel function as a parameter | |
cancel = c; | |
}) | |
}); | |
// cancel the request | |
cancel(); |
Note: you can cancel several requests with the same cancel token.
# Using application/x-www-form-urlencoded format
By default, axios serializes JavaScript objects to JSON . To send data in the application/x-www-form-urlencoded format instead, you can use one of the following options.
# Browser
In a browser, you can use the URLSearchParams API as follows:
var params = new URLSearchParams(); | |
params.append('param1', 'value1'); | |
params.append('param2', 'value2'); | |
axios.post('/foo', params); |
Note that URLSearchParams is not supported by all browsers (see caniuse.com ), but there is a polyfill available (make sure to polyfill the global environment).
Alternatively, you can encode data using the qs library:
var qs = require('qs'); | |
axios.post('/foo', qs.stringify({ 'bar': 123 })); |
# Node.js
In node.js, you can use the querystring module as follows:
var querystring = require('querystring'); | |
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' })); |
You can also use the qs library.
# Semver
Until axios reaches a 1.0 release, breaking changes will be released with a new minor version. For example 0.5.1 , and 0.5.4 will have the same API, but 0.6.0 will have breaking changes.
# Promises
axios depends on a native ES6 Promise implementation to be supported .
If your environment doesn't support ES6 Promises, you can polyfill .
# TypeScript
axios includes TypeScript definitions.
import axios from 'axios'; | |
axios.get('/user?ID=12345'); |