一、Axios简介

Axios是一个基于Promise的HTTP库,是当前比较流行的Ajax框架,相比较Ajax的回调函数能够更好地管理异步操作,可以用在浏览器和Node.js中。

二、安装axios

1、使用CDN方式

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

2、使用NPM方式

//在终端输入以下命令
npm install axios --save

//安装完成后,在main.js文件中导入axios
import { createApp } from 'vue'
import App from './App.vue'
//导入axios
import axios from 'axios'

const app=createApp(App)
//注意这个绑定到vue的原型链中必须在mount之前,否则会报错
app.config.globalProperties.$axios = axios
app.mount('#app')
//配置完成后,在组件中通过this.$axios来调用axios的方法以发送请求

如果是在IDEA中建立Vue.js项目的话,可以先输入代码,然后系统会自动提示你是否导入,到时候按导入即可

三、基本用法

1、axios的get请求和post请求

发送get请求的两种方式

//url是地址,发送的数据通过?分隔,通过key=value的形式赋值,不同数据之间以&分隔
  this.$axios.get('/url?key=value&id=1')
      //请求响应成功时触发
      .then(function(response){
        console.log(response)
      })
      //请求失败时触发
      .catch(function(error){
        console.log(error)
      })
//url是地址,params用来指定发送的数据
this.$axios.get('/url',{
		params:{
			key:value,
			id:1
		}
	})
    //请求响应成功时触发
    .then(function(response){
      console.log(response)
    })
    //请求失败时触发
    .catch(function(error){
      console.log(error)
    })

post请求

//url是地址,数据以对象的形式作为post请求的第二个参数
this.$axios.post('/url',{
		username:"ao",
		password:"123456"
	})
    //请求响应成功时触发
    .then(function(response){
      console.log(response)
    })
    //请求失败时触发
    .catch(function(error){
      console.log(error)
    })

response是一个对象,它的属性有data和status
data:用于获取响应的数据
status:是HTTP状态码

error指的是一个错误对象,里面包含错误信息

2、请求JSON数据

  1. 在IDEA中新建一个vue项目
  2. 在public文件夹下创建一个data文件夹
  3. 在data文件夹中创建user.json文件
[
  {
    "name": "小明",
    "pass": "123456"
  },
  {
    "name": "小红",
    "pass": "345678"
  }
]
  1. 在HelloWorld.vue中使用如下代码
<template>
  <div class="hello">
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  created(){
    //这里的localhost:8081是看你本机运行项目时给出的地址
    this.$axios.get('http://localhost:8081/data/user.json')
        .then(function (response){
          console.log(response);
        })
        .catch(function (error){
          console.log(error);
        })
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>
  1. 访问控制台,查看请求

3、跨域请求数据

  1. 修改vue.config.js文件,在这个文件中设置反向代理
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  devServer:{
    proxy:{
      //api是后端数据接口的路径
      'api':{
        //后端数据接口的地址,这是一个免费的天气预报API接口
        target:'https://yiketianqi.com/api?unescape=1&version=v1&appid=85841439&appsecret=EKCDLT4I',
        //允许跨域
        changeOrigin:true,
        //调用时用api替代根路径
        pathRewrite:{
          '^/api':""
        }
      }
    }
  },
  //关闭eslint校验
  lintOnSave:false
})

注意:vue的热重载不会监听vue.config.js文件的修改,如果修改了这个文件,就需要重新运行npm serve才会有效果
2. 配置HelloWorld.vue组件

<template>
  <div class="hello">
    {{city}}
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data(){
    return{
      city:""
    }
  },
  created(){
    //保存vue实例,因为在axios中,this指向的是axios而不是vue
    var that=this;
    this.$axios.get('/api')
      .then(function (response){
        that.city=response.data.city
        console.log(response)
      })
      .catch(function (error){
        console.log(error)
      })
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

一个有意思的地方在于,如果你在vue.config.js文件中的target输入api地址,最后显示的是北京
但是如果你直接在HelloWorld的get请求中输入相同的api地址,它返回的是武汉(也就是你的所在地)

在网上查阅资料,发现可能是反向代理的原因,在vue.config.js文件中设置反向代理时,你是通过一台代理服务器进行访问的,所以IP地址显示的是北京的服务器,而如果通过get请求直接访问,那么IP地址显示的就是自己所在城市

4、并发请求

同时发送多个请求

axios.all(iterable)
axios.spread(callback)

修改HelloWorld.vue组件

<template>
  <div class="hello">
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  created(){
  this.$axios.all([this.$axios.get('http://localhost:8081/data/user.json'),this.$axios.get('/api')])
      .then(this.$axios.spread(function (get1,get2){
        //两个请求现在都执行完成
        //get1是第一个get请求的响应结果
        //get2是第二个get方法请求的响应结果
        console.log(get1);
        console.log(get2);
      }));
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

四、使用axios创建请求

修改HelloWorld.vue组件,其实就是换了个形式,意思是一样的

this.$axios({
      method:'get',
      url:'http://localhost:8081/data/user.json',
    }).then(function(response){
      console.log(response);
    }).catch(function (error){
      console.log(error);
    })

五、请求配置

axios库提供了很多选项,以下是常见的几种

  1. url:用于请求的服务器URL
  2. method:创建请求时使用的方法,默认为get
  3. baseURL:自动加在url前面,也就是一个相对地址
  4. headers:即将被发送的自定义请求头,例如ajax请求
  5. params:即将与请求一起发送的URL参数
  6. transformRequest:在传递给then/catch前,允许修改响应数据,可用于对data进行任意转换
  7. timeout:表示请求超时的毫秒数,0表示无超时时间

六、创建实例

通过创建axios实例,之后就可以使用该实例向服务器端发起请求
在HelloWorld.vue组件中

<script>
export default {
  name: 'HelloWorld',
  created(){
    var instance1=this.$axios.create({
      baseURL:'https://localhost:8081/',
      timeout:1000,
      headers:{'X-Custom-Header':'foobar'}
    });
    instance1({
      method:'get',
      url:'http://localhost:8081/data/user.json',
    }).then(function(response){
      console.log(response);
    }).catch(function (error){
      console.log(error);
    })
}
</script>

七、配置默认选项

设置全局的axios默认值
在main.js文件中配置

import { createApp } from 'vue'
import App from './App.vue'
//导入axios
import axios from 'axios'

const app=createApp(App)
//设置默认值
axios.defaults.baseURL='http://localhost:8081/'
//注意这个绑定到vue的原型链中必须在mount之前,否则会报错
app.config.globalProperties.$axios = axios
app.mount('#app')

也可以修改实例的默认值,这样就会只在使用该实例时才会生效

var instance1=this.$axios.create({
      timeout:1000,
      headers:{'X-Custom-Header':'foobar'}
    });
instance1.defaults.timeout=100;

配置会以一个优先顺序进行合并,后面的会覆盖前面的
首先是lib/default.js中找到库的默认值,或者是main.js里面设置的默认值
然后是实例的defaults属性
最后是请求的config参数

八、拦截器

//添加请求拦截器
    this.$axios.interceptors.request.use(function (config){
      //在发送请求之前做什么
      return config;
    },function (error){
      //对请求错误做什么
      return Promise.reject(error);
    })

    //添加响应拦截器
    this.$axios.interceptors.response.use(function (response){
      //对响应数据做什么
      return response;
    },function (error){
      //对响应错误做什么
      return Promise.reject(error);
    })

九、综合案例——显示近7日的天气情况

其实就是将接收到的数据按照规定的方式显示出来

<template>
  <div className="seven">
    <h2>{{ city }}</h2>
    <h4>今天:{{ date }} {{ week }}</h4>
    <h4>{{ message }}</h4>
    <ul>
      <li v-for="item in obj">
        <div>
          <h3>{{ item.date }}</h3>
          <h3>{{ item.week }}</h3>
          <!--这里找不到图片,可自行添加-->
          <img :src="get(item.weaimg)" alt="">
          <h3>{{ item.wea }}</h3>
        </div>
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  name: 'SevenDay',
  data() {
    return {
      city: "",
      obj: [],
      date: "",
      week: "",
      message: ""
    }
  },
  methods: {
    //定义get方法,拼接图片的路径
    get(sky) {
      return "durian/" + sky + ".png"
    }
  },
  created() {
    this.get();  //页面开始加载时调用get方法
    var that = this;
    this.$axios.get("https://yiketianqi.com/api?unescape=1&version=v1&appid=85841439&appsecret=EKCDLT4I")
        .then(function (response) {
          //处理数据
          that.city = response.data.city;
          that.obj = response.data.data;
          that.date = response.data.data[0].date;
          that.week = response.data.data[0].week;
          that.message = response.data.data[0].air_tips;
        })
        .catch(function (error) {
          console.log(error)
        })
  }
}
</script>
<style scoped>
h2, h4 {
  text-align: center;
}

li {
  float: left;
  list-style: none;
  width: 200px;
  text-align: center;
  border: 1px solid red;
}
</style>

js中axios js中axios的用法_js中axios