Axios 是两个如前所述 promise 的 HTTP 库,能用在应用程序和 node.js 中。
1 – 机能
从应用程序中建立 XMLHttpRequests从 node.js 建立 http 允诺全力支持 Promise API截击允诺和积极响应切换允诺统计数据和积极响应统计数据中止允诺手动切换 JSON 统计数据应用程序全力支持防卫 XSRF2 – 加装
采用 npm:
$ npm install axios
采用 bower:
$ bower install axios
采用 cdn:
<script src=“https://unpkg.com/axios/dist/axios.min.js”></script>
3 – 范例
3.1 GET
axios.get(/user?ID=123)
.then( res => {
// 允诺统计数据获得成功并回到统计数据
console.info(res)
}).catch( e => {
if (e.response) {
// 允诺已发出,服务器回到状态码不是 2xx console.info(e.response.data)
console.info(e.response.status)
console.info(e.response.headers)
} else if (e.request) {
// 允诺已发出,但没有收到积极响应
// e.request 在应用程序里是两个 XMLHttpRequest 实例
// 在 node 中是两个 http.ClientRequest 实例 console.info(e.request)
} else {
// 发送允诺时异常,捕获到错误
console.info(error, e.message)
}
console.info(e.config)
})
// 等同于以下写法
axios({
url: /user,
methods: GET,
params: {
ID: 123
}
}).then(res => {
console.info(res)
}).catch(e => {
console.info(e)
})
// 为给定 ID 的 user 建立允诺
axios.get(/user?ID=12345)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// 可选地,上面的允诺能这样做 axios.get(/user, {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
3.2 POST
axios.post(/user, {
firstName: Mike,
lastName: Allen
}).then(res => {
console.info(res)
}).catch(e => {
console.info(e)
})
// 等同于以下写法
axios({
url: /user,
method: POST,
data: {
firstName: Mike,
lastName: Allen
}
}).then(res => {
console.info(res)
}).catch(e => {
console.info(e)
})
axios.post(/user, {
firstName: Fred,
lastName: Flintstone
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
3.3 执行多个并发允诺
function getUserAccount() {
return axios.get(/user/12345);
}
function getUserPermissions() {
return axios.get(/user/12345/permissions);
}
axios.all([getUserAccount(), getUserPermission()])
.then(axios.spread(function (acct, perms) {
// 两个允诺现在都执行完成
}));
3.4 注意事项
在采用 GET 方法传递参数时采用的是 params,并且官方文档中介绍:
params are the URL parameters to be sent with the request. Must be a plain object or a URLSearchParams object.params 作为 URL 链接中的参数发送允诺,且其必须是两个 plain object 或者是 URLSearchParams object 。
plain object(纯对象):是指 JSON 形式定义的普通对象或者 new Object() 建立的简单对象;URLSearchParams object:指的是两个能由URLSearchParams 接口定义的一些实用方法来处理 URL 的查询字符串的对象,也就是说 params 传参是以 /user?ID=1&name=mike&sex=male 形式传递的。而在采用 POST 时对应的传参采用的是 data,data 是作为 允诺体 发送的,同样采用这种形式的还有 PUT、PATCH 等允诺方法。有一点需要注意的是,axios 中 POST 的默认允诺体类型为 Content-Type:application/json(JSON 规范流行),这也是最常见的允诺体类型,也就是说采用的是序列化后的 json 格式字符串来传递参数,如: { “name” : “mike”, “sex” : “male” };同时,后台必须要以全力支持 @RequestBody 的形式来接收参数,否则会出现前台传参正确,后台不接收的情况。
如果想要设置类型为 Content-Type:application/x-www-form-urlencoded(应用程序原生全力支持),axios 提供了两种方式,如下:
应用程序端
const params = new URLSearchParams();
params.append(param1, value1);
params.append(param2, value2);
axios.post(/user, params);
不过,并不是所有应用程序都全力支持 URLSearchParams,兼容性查询caniuse.com,但是这里有两个Polyfill(polyfill:用于实现应用程序并不全力支持的原生 API 的代码,能模糊理解为补丁,同时要确保 polyfill 在全局环境中)。
或者,你也能用 qs 这个库来格式化统计数据,默认情况下在加装完 axios 后就能采用 qs 库。
const qs = require(qs);
axios.post(/user, qs.stringify({name: mike}));
node 层
在 node 环境中能采用 querystring 。同样,也能采用 qs 来格式化统计数据。
const querystring = require(querystring);
axios.post(http://something.com/, querystring.stringify({name:mike}));
3.5 补充
常见的允诺体类型还有一种方式,即multipart/form-data(应用程序原生全力支持),也就是提交表单统计数据常用的一种格式。和x-www-form-urlencoded对比起来,后者则是统计数据被编码成以 & 分隔的键-值对, 同时以 = 分隔键和值。非字母或数字的字符会被Percent-encoding(URL encoding),这也就是为什么这种类型不全力支持二进制统计数据的原因 (应采用 multipart/form-data 代替)。
4 – axios API
4.1 允诺方法的别名
为了方便起见,axios 提供了别名:
axios.request(config)axios.get(url[, config])axios.delete(url[, config])axios.head(url[, config])axios.post(url[, data[, config]])axios.put(url[, data[, config]])axios.patch(url[, data[, config])在采用别名方法时,url、methods、data 这些属性都不必在配置中指定。
4.2 并发
处理并发允诺的助手函数
axios.all(iterable)
axios.spread(callback)
4.3 建立实例
能采用自定义配置新建两个 axios 实例
axios.create([config])
var instance = axios.create({
baseURL: https://something.com/api/,
timeout: 1000,
headers: {X-Custom-Header: foobar}
})
4.4 实例方法
以下是可用的实例方法,指定的配置将与实例的配置合并。
axios#request(config)axios#get(url[, config])axios#delete(url[, config])axios#head(url[, config])axios#post(url[, data[, config]])axios#put(url[, data[, config]])axios#patch(url[, data[, config]])5 – 允诺配置
这些是建立允诺时能采用的配置选项。只有 url 是必需的,如果没有指定的 method,允诺将默认采用 get 方法。
{
// `url` 是用于允诺的服务器 URL
url: /user,
// `method` 是建立允诺时采用的方法
method: get, // 默认是 get
// `baseURL` 将手动加在 `url` 前面,除非 `url` 是两个绝对 URL。 // 它能通过设置两个 `baseURL` 便于为 axios 实例的方法传递相对 URL
baseURL: https://some-domain.com/api/,
// `transformRequest` 允许在向服务器发送前,修改允诺统计数据
// 只能用在 PUT, POST 和 PATCH 这几个允诺方法
// 后面数组中的函数必须返回两个字符串,或 ArrayBuffer,或 Stream transformRequest: [function (data) {
// 对 data 进行任意切换处理
return data;
}],
// `transformResponse` 在传递给 then/catch 前,允许修改积极响应统计数据 transformResponse: [function (data) {
// 对 data 进行任意切换处理
return data;
}],
// `headers` 是即将被发送的自定义允诺头
headers: {X-Requested-With: XMLHttpRequest},
// `params` 是即将与允诺一起发送的 URL 参数 // 必须是两个无格式对象(plain object)或 URLSearchParams 对象
params: {
ID: 12345
},
// `paramsSerializer` 是两个负责 `params` 序列化的函数 // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/) paramsSerializer: function(params) {
return Qs.stringify(params, {arrayFormat: brackets})
},
// `data` 是作为请求主体被发送的统计数据 // 只适用于这些允诺方法 PUT, POST, 和 PATCH
// 在没有设置 `transformRequest` 时,必须是以下类型之一:
// – string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams // – 应用程序专属:FormData, File, Blob
// – Node 专属: Stream data: {
firstName: Fred
},
// `timeout` 指定允诺超时的毫秒数(0 表示无超时时间)
// 如果允诺话费了超过 `timeout` 的时间,允诺将被中断
timeout: 1000,
// `withCredentials` 表示跨域允诺时是否需要采用凭证
withCredentials: false, // 默认的
// `adapter` 允许自定义处理允诺,以使测试更轻松 // 回到两个 promise 并应用两个有效的积极响应 (查阅 [response docs](#response-api)).
adapter: function (config) {
/* … */
},
// `auth` 表示应该采用 HTTP 基础验证,并提供凭据
// 这将设置两个 `Authorization` 头,覆写掉现有的任意采用 `headers` 设置的自定义 `Authorization`头 auth: {
username: janedoe,
password: s00pers3cret
},
// `responseType` 表示服务器积极响应的统计数据类型,能是 arraybuffer, blob, document, json, text, stream responseType: json, // 默认的
// `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称 xsrfCookieName: XSRF-TOKEN, // default
// `xsrfHeaderName` 是承载 xsrf token 的值的 HTTP 头的名称
xsrfHeaderName: X-XSRF-TOKEN, // 默认的
// `onUploadProgress` 允许为上传处理进度事件
onUploadProgress: function (progressEvent) {
// 对原生进度事件的处理
},
// `onDownloadProgress` 允许为下载处理进度事件
onDownloadProgress: function (progressEvent) {
// 对原生进度事件的处理 },
// `maxContentLength` 定义允许的积极响应内容的最大尺寸
maxContentLength: 2000,
// `validateStatus` 定义对于给定的HTTP 积极响应状态码是 resolve 或 reject promise 。如果 `validateStatus` 回到 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte validateStatus: function (status) {
return status >= 200 && status < 300; // 默认的 },
// `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
// 如果设置为0,将不会 follow 任何重定向
maxRedirects: 5, // 默认的
// `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时采用的自定义代理。允许像这样配置选项:
// `keepAlive` 默认没有启用 httpAgent: new http.Agent({ keepAlive: true }),
httpsAgent: new https.Agent({ keepAlive: true }),
// proxy 定义代理服务器的主机名称和端口 // `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据
// 这将会设置两个 `Proxy-Authorization` 头,覆写掉已有的通过采用 `header` 设置的自定义 `Proxy-Authorization` 头。 proxy: {
host: 127.0.0.1,
port: 9000,
auth: : {
username: mikeymike,
password: rapunz3l
}
},
// `cancelToken` 指定用于中止允诺的 cancel token
// (查看后面的 Cancellation 这节了解更多)
cancelToken: new CancelToken(function (cancel) {
})
}
6 – 积极响应结构
某个允诺的积极响应包含以下信息:
{
// `data` 由服务器提供的积极响应
data: {},
// `status` 来自服务器积极响应的 HTTP 状态码 status: 200,
// `statusText` 来自服务器积极响应的 HTTP 状态信息
statusText: OK,
// `headers` 服务器积极响应的头
headers: {},
// `config` 是为允诺提供的配置信息
config: {}
}
采用 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);
});
在采用 catch 时,或传递 rejection callback作为 then 的第二个参数时,积极响应能通过 error 对象可被采用,正如在错误处理这一节所讲。
7 – 配置的默认值/defaults
你能指定将别用在各个允诺的配置默认值
7.1 全局的 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;
7.2 自定义实例默认值
// 建立实例时设置配置的默认值 var instance = axios.create({
baseURL: https://api.example.com
});
// 在实例已建立后修改默认值
instance.defaults.headers.common[Authorization] = AUTH_TOKEN;
7.3 配置的优先顺序
配置会以两个优先顺序进行合并。这个顺序是:在 lib/defaults.js 找到的库的默认值,然后是实例的 defaults 属性,最后是允诺的 config 参数。后者将优先于前者。这里是两个范例:
// 采用由库提供的配置的默认值来建立实例
// 此时超时配置的默认值是 `0`
var instance = axios.create();
// 覆写库的超时默认值
// 现在,在超时前,所有允诺都会等待 2.5 秒
instance.defaults.timeout = 2500;
// 为已知需要花费很长时间的允诺覆写超时设置 instance.get(/longRequest, {
timeout: 5000
});
8 – 截击器
在允诺或积极响应被 then 或 catch 处理前截击它们。
// 添加允诺截击器
axios.interceptors.request.use(function (config) {
// 在发送允诺之前做些什么
return config;
}, function (error) {
// 对允诺错误做些什么 return Promise.reject(error);
});
// 添加积极响应截击器
axios.interceptors.response.use(function (response) {
// 对积极响应统计数据做点什么 return response;
}, function (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 () {/*…*/});
9 – 错误处理
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 {
// 在配置允诺和触发报错之前做些什么
console.log(Error, error.message);
}
console.log(error.config);
})
能采用 validateStatus 配置选项定义两个自定义 HTTP 状态码的错误范围。
axios.get(/user/12345, {
validateStatus: function (status) {
return status < 500; // 状态码在大于或等于 500 时才会 reject
}
})
10 – 中止
采用 cancel token 中止允诺
Axios 的 cancel token API 如前所述cancelable promises proposal,它还处于第一阶段。能采用 CancelToken.source 工厂方法建立 cancel token,像这样:
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 {
// 处理错误
}
});
// 中止允诺(message 参数是可选的)
source.cancel(Operation canceled by the user.);
还能通过传递两个 executor 函数到 CancelToken 的构造函数来建立 cancel token:
var CancelToken = axios.CancelToken;
var cancel;
axios.get(/user/12345, {
cancelToken: new CancelToken(function executor(c) {
// executor 函数接收两个 cancel 函数作为参数 cancel = c;
})
});
// 中止允诺
cancel();
Note:能采用同两个 cancel token 中止多个允诺。