axios
安装到项目中:
1
|
# npm install axios --save |
在项目中import使用:
import axios from 'axios'
Axios和其他的ajax库都是很类似的,提供了2种使用的方式一种是直接使用实例方法的如:
下面是实例的所有可用方法,方法中的config会与axios实例中的config合并。(实例可以将一些通用的config先配置好)
1
2
3
4
5
6
7
|
axios.get( '/user?ID=12345' ) .then( function (response) { console.log(response); }) . catch ( function (error) { console.log(error); }); |
Config 配置:
{ // `url`是将用于请求的服务器URL url: '/user', // `method`是发出请求时使用的请求方法 method: 'get', // 默认 // `baseURL`将被添加到`url`前面,除非`url`是绝对的。 // 可以方便地为 axios 的实例设置`baseURL`,以便将相对 URL 传递给该实例的方法。 baseURL: 'https://some-domain.com/api/', // `transformRequest`允许在请求数据发送到服务器之前对其进行更改 // 这只适用于请求方法'PUT','POST'和'PATCH' // 数组中的最后一个函数必须返回一个字符串,一个 ArrayBuffer或一个 Stream transformRequest: [function (data) { // 做任何你想要的数据转换 return data; }], // `transformResponse`允许在 then / catch之前对响应数据进行更改 transformResponse: [function (data) { // Do whatever you want to transform the data return data; }], // `headers`是要发送的自定义 headers headers: {'X-Requested-With': 'XMLHttpRequest'}, // `params`是要与请求一起发送的URL参数 // 必须是纯对象或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 // - Browser only: FormData, File, Blob // - Node only: Stream data: { firstName: 'Fred' }, // `timeout`指定请求超时之前的毫秒数。 // 如果请求的时间超过'timeout',请求将被中止。 timeout: 1000, // `withCredentials`指示是否跨站点访问控制请求 // should be made using credentials withCredentials: false, // default // `adapter'允许自定义处理请求,这使得测试更容易。 // 返回一个promise并提供一个有效的响应(参见[response docs](#response-api)) adapter: function (config) { /* ... */ }, // `auth'表示应该使用 HTTP 基本认证,并提供凭据。 // 这将设置一个`Authorization'头,覆盖任何现有的`Authorization'自定义头,使用`headers`设置。 auth: { username: 'janedoe', password: 's00pers3cret' }, // “responseType”表示服务器将响应的数据类型 // 包括 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream' responseType: 'json', // default //`xsrfCookieName`是要用作 xsrf 令牌的值的cookie的名称 xsrfCookieName: 'XSRF-TOKEN', // default // `xsrfHeaderName`是携带xsrf令牌值的http头的名称 xsrfHeaderName: 'X-XSRF-TOKEN', // default // `onUploadProgress`允许处理上传的进度事件 onUploadProgress: function (progressEvent) { // 使用本地 progress 事件做任何你想要做的 }, // `onDownloadProgress`允许处理下载的进度事件 onDownloadProgress: function (progressEvent) { // Do whatever you want with the native progress event }, // `maxContentLength`定义允许的http响应内容的最大大小 maxContentLength: 2000, // `validateStatus`定义是否解析或拒绝给定的promise // HTTP响应状态码。如果`validateStatus`返回`true`(或被设置为`null` promise将被解析;否则,promise将被 // 拒绝。 validateStatus: function (status) { return status >= 200 && status < 300; // default }, // `maxRedirects`定义在node.js中要遵循的重定向的最大数量。 // 如果设置为0,则不会遵循重定向。 maxRedirects: 5, // 默认 // `httpAgent`和`httpsAgent`用于定义在node.js中分别执行http和https请求时使用的自定义代理。 // 允许配置类似`keepAlive`的选项, // 默认情况下不启用。 httpAgent: new http.Agent({ keepAlive: true }), httpsAgent: new https.Agent({ keepAlive: true }), // 'proxy'定义代理服务器的主机名和端口 // `auth`表示HTTP Basic auth应该用于连接到代理,并提供credentials。 // 这将设置一个`Proxy-Authorization` header,覆盖任何使用`headers`设置的现有的`Proxy-Authorization` 自定义 headers。 proxy: { host: '127.0.0.1', port: 9000, auth: : { username: 'mikeymike', password: 'rapunz3l' } }, // “cancelToken”指定可用于取消请求的取消令牌 // (see Cancellation section below for details) cancelToken: new CancelToken(function (cancel) { }) }
response 响应:
// 服务器返回的数据 data: {}, // HTTP状态吗 status: 200, // 服务器返回的消息 statusText: 'OK', // 返回头 headers: {}, // 在返回我们的配置 config: {}
统一配置:
axios.defaults.timeout = 5000; axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; axios.defaults.baseURL = 'http://www.xxxx.xxx/api'; // axios.defaults.baseURL = 'http://192.168.1.129:8383';
Interceptors 拦截器
这里我必须重点介绍,在我们发起大量的请求时候,需要对请求做统一的处理那就用到它了。笔者在使用了vue-resource
和axios
之后亲身比较,axios
的配置更加人性化。
官方的API上这样介绍
You can intercept requests or responses before they are handled by then or catch.
您可以拦截请求或响应之前,他们处理的操作或者异常
实例用法:
import axios from 'axios' import qs from 'qs' axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //POST传参序列化
let params = {
username: 'tzf',
password: '123456'
}
axios.post(
'https://domail.com/api/login', //url
qs.stringify(params)
).then(
res => {
console.log(res.data)
},
error => {
console.log(error)
}
)
request统一处理操作
如果是POST的请求,配置中可不能用params
字段了,需要使用data
字段。
这里有个小地方需要注意,POST的传参需要序列化,不然服务端不会正确的接收哦,会报错。所以这里我们要对request的数据进行一次序列化。这里我用了qs
,直接import qs from 'qs' 即可
import axios from 'axios' import qs from 'qs' axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //POST传参序列化 axios.interceptors.request.use((config) => { if(config.method === 'post'){ config.data = qs.stringify(config.data); } return config; },(error) =>{ alert("错误的传参"); return Promise.reject(error);
response统一处理操作
也就是说我们可以统一的在发起请求前,或者获得数据,对其进行统一的操作。这点非常的高效,在笔者的项目中,接口会返回一个code,就和微信API一样,code为200代表返回请求数据正确为其它时就自动跳出弹窗打印消息即可。
//code状态码200判断 axios.interceptors.response.use((res) =>{ if(res.data.code != '200'){ alert(res.data.msg); return Promise.reject(res); } return res; }, (error) => { alert("网络异常"); return Promise.reject(error); });
如果发生这些错误了我要结束当前的Promise所以返回一个Promise.reject(res)
,停止Promise队列下面的操作,如果有对于Promise不熟悉的童鞋请自行搜索Promise
(这里还遇到了一个小坑最后会介绍)
参考配置
文件名是config/http.js
import axios from 'axios' import qs from 'qs' import * as _ from './whole' axios.defaults.timeout = 5000; axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; axios.defaults.baseURL = 'http://www.guinaben.com:8070'; // axios.defaults.baseURL = 'http://192.168.1.129:8383'; //POST传参序列化 axios.interceptors.request.use((config) => { if(config.method === 'post'){ config.data = qs.stringify(config.data); } return config; },(error) =>{ _.toast("错误的传参"); return Promise.reject(error); }); //code状态码200判断 axios.interceptors.response.use((res) =>{ if(res.data.code != '200'){ _.toast(res.data.msg); return Promise.reject(res); } return res; }, (error) => { _.toast("网络异常"); return Promise.reject(error); }); export default axios;
发起的请求
import axios from 'config/http' axios({ method:'get', url: 'xxxx/xxxxx', params: { "textbook_id":id, "token":token } }) .then((response) => { resolve(response); }) axios({ method:'post', url: 'teacher/pwd/resetByMobile', data: { "textbook_id":id, "token":token } }) .then((response) => { resolve(response); })
一定要看
因为这里我使用的Promise
,所以在安卓4.4.3一下的手机还是不支持Promise的,所以会报错。需要引入npm install babel-polyfill
和npm install babel-runtime
,在入口文件上加上即可。
import 'babel-polyfill'
POST请求时,参数需要使用qs.stringify()