axios文档
axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端
axios.get(url)
.then(response => {
console.log(response);
}, error => {
console.log(error);
})
这不是处理catch的相关,是关于new Promise()的then,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
2. catch是处理逻辑或接口出错
axios.get(url)
.then(res=>{
//处理业务逻辑
})
.catch(err=>{
})
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);
cnpm install -g @vue/cli-service-global
cnpm install -g @vue/cli-init
vue init webpack axios_test
cnpm i
cnpm i axios -S
http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0
import Axios from 'axios'
Vue.prototype.$axios = Axios
export default {
mounted(){
this.$axios.get('http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0')
.then(result=>{
console.log(result)
})
.catch(error=>{
console.log(error)
})
}
};
cnpm run dev
我用铜钱算出来你报了一下的错误;这是因为浏览器的同源政策
Access to XMLHttpRequest at 'http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
我们先来实现解决跨域在解释(1.2是实现解决禁止跨域的)
Vue.prototype.$axios = Axios
Vue.prototype.HOST = '/baidu_music_api'
proxyTable: {
"/baidu_music_api": {
target: "http://tingapi.ting.baidu.com",
changeOrigin: true,
pathRewrite: {
'^/baidu_music_api': '/v1/restserver/ting'
}
}
},
mounted(){
let url = this.HOST + '?method=baidu.ting.billboard.billList&type=1&size=10&offset=0'
this.$axios.get(url)
.then(result=>{
console.log(result)
})
.catch(error=>{
console.log(error)
})
比如大部分接口有’api’,我们配置的时候时候可以直接(这里跟我们当前接口使用的无关)
proxyTable: {
'/api': {
target: 'http://www.csdn.com', //目标接口域名
changeOrigin: true, //是否跨域
pathRewrite: {
'^/api': '/api' //重写接口
//没有api
// '^api':'/'
}
},
'http://localhost:8080/baidu_music_api' ===> 'http://tingapi.ting.baidu.com/v1/restserver/ting'
本地服务器 --》 代理 --》目标服务器 --》拿到数据后通过代理伪装成本地服务请求的返回值 ---》然后浏览器就顺利收到了我们想要的数据
也就是说我们访问,会重写服务器http://tingapi.ting.baidu.com,baidu_music_api就会解析成v1/restserver/ting;有人说可以理解为服务器是没有同源政策的。
6. 接下来可以看一下我们返回的数据,直接截图
以下响应结构的信息;所以我们的数据都要在data里面获取
{
// `data` 由服务器提供的响应
data: {},
// `status` 来自服务器响应的 HTTP 状态码
status: 200,
// `statusText` 来自服务器响应的 HTTP 状态信息
statusText: 'OK',
// `headers` 服务器响应的头
headers: {},
// `config` 是为请求提供的配置信息
config: {}
}
Vue.prototype.HOST = '/baidu_music_api'
// 添加请求拦截器
Axios.interceptors.request.use(function (config) {
if(config.method === "post"){
config.data = qs.stringify(config.data)
}
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
Axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
vue cli参考配置vue.config.js的devServer配置
可以自主配置(空格是选中),也可以直接选择默认
vue create axios_vue3
import Axios from 'axios'
Vue.prototype.$axios = Axios
Vue.prototype.HOST = '/api'
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://tingapi.ting.baidu.com/v1/restserver/ting',
ws: true,
changeOrigin: true
}
}
}
}
mounted(){
let url = this.HOST + '?method=baidu.ting.billboard.billList&type=1&size=10&offset=0'
this.$axios.get(url).then(result=>{
console.log(result)
})
}
https://webpack.js.org/configuration/dev-server/#devserverproxy