doina

一个小菜鸟运维工程师.

Vue 网络框架axios

axios使用

npm install axios --save

功能特点:

  • 在浏览器中发送 XMLHttpRequests 请求
  • 在 node.js 中发送 http请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据

支持的请求方式:

  • axios(config)
  • 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: ‘/user’,
  • 请求类型: method: ‘get’,
  • 请根路径: baseURL: ‘http://www.mt.com/api’,
  • 请求前的数据处理: transformRequest:[function(data){}],
  • 请求后的数据处理: transformResponse: [function(data){}],
  • 自定义的请求头: headers:{‘x-Requested-With’:’XMLHttpRequest’},
  • URL查询对象: params:{ id: 12 },
  • 查询对象序列化函数: paramsSerializer: function(params){ }
  • request body: data: { key: ‘aa’},
  • 超时设置: timeout: 1000,
  • 跨域是否带Token: withCredentials: false,
  • 自定义请求处理: adapter: function(resolve, reject, config){},
  • 身份验证信息: auth: { uname: ”, pwd: ’12’},
  • 响应的数据格式: json / blob /document /arraybuffer / text / stream
  • responseType: ‘json’,

全局配置

很多参数都是固定的. 我们可以进行一些抽取, 也可以利用axiox的全局配置

axios.defaults.baseURL = '127.0.0.1:8000'
axios.defaults.timeout = 5000
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

对axios进行实例封装

  • 减少项目整体对axios的依赖, 如果后期换网络框架只需要重新封装一次就可以了,而不用在每个调用axios的地方进行修改
  • 在src下创建network目录,下面创建request.js文件
import axios from 'axios'

export function request(config) {
  // 1.创建axios的实例
  const instance = axios.create({
    baseURL: 'http://123.207.32.32:8000',
    timeout: 5000
  })

  // 2.axios的拦截器
  // 2.1.请求拦截的作用
    // 1.比如config中的一些信息不符合服务器的要求
    // 2.比如每次发送网络请求时, 都希望在界面中显示一个请求的图标
    // 3.某些网络请求(比如登录(token)), 必须携带一些特殊的信息
  instance.interceptors.request.use(config => {
    // console.log(config);


    // 处理完成后还需要返回给请求使用
    return config
  }, err => {
    // console.log(err);
  })

  // 2.2.响应拦截
    // 响应的成功拦截中,主要是对数据进行过滤。
    // 响应的失败拦截中,可以根据status判断报错的错误码,跳转到不同的错误提示页面。
  instance.interceptors.response.use(res => {
    // 处理响应完成后, 还需要return回去
    return res.data
  }, err => {
    console.log(err);
  })

  // 3.发送真正的网络请求, instance是一个Promise函数
  return instance(config)
}
  • 使用封装的request
    • src/App.vue
<template>
  <div id="app">
    <p>{{message}}</p>
  </div>
</template>

<script>
// 导入封装的request模块
import {request} from "./network/request";

export default {
  name: 'App',
  data() {
    return {
      message: "null"
    }
  },
  // 创建是执行的钩子函数
  created() {
    // 使用封装的request模块
    request({
      url: '/home/multidata'
    }).then(res => {
      this.message = res
      // console.log(res);
    }).catch(err => {
      console.log(err);
    })
  }
}
</script>

<style>
</style>

axios的使用

对服务器发送get请求

  • 在src/main.js使用, 通过console.log展示
import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  render: h => h(App)
})

import axios from "axios";

// 1.axios的基本使用
axios({
  url: 'http://123.207.32.32:8000/home/multidata',
   method: 'get'
}).then(res => {
  console.log(res);
})

// 2. 带参数的请求
axios({
  url: 'http://123.207.32.32:8000/home/data',
  method: 'get',
  // 专门针对get请求的参数拼接
  params: {
    type: 'pop',
    page: 1
  }
}).then(res => {
  console.log(res);
})

// 3.axios发送并发请求
axios.all([axios({
  url: 'http://123.207.32.32:8000/home/multidata'
}), axios({
  url: 'http://123.207.32.32:8000/home/data',
  params: {
    type: 'sell',
    page: 5
  }
})]).then(results => {
  console.log(results);
  console.log(results[0]);
  console.log(results[1]);
})

// 4.使用全局的axios和对应的配置在进行网络请求
axios.defaults.baseURL = 'http://123.207.32.32:8000'
axios.defaults.timeout = 5000

axios.all([axios({
  url: '/home/multidata'
}), axios({
  url: '/home/data',
  params: {
    type: 'sell',
    page: 5
  }
})]).then(axios.spread((res1, res2) => {
  console.log(res1);
  console.log(res2);
}))


// 5.创建对应的axios的实例
const instance1 = axios.create({
  baseURL: 'http://123.207.32.32:8000',
  timeout: 5000
})

instance1({
  url: '/home/multidata'
}).then(res => {
  console.log(res);
})

instance1({
  url: '/home/data',
  params: {
    type: 'pop',
    page: 1
  }
}).then(res => {
  console.log(res);
})

const instance2 = axios.create({
  baseURL: 'http://222.111.33.33:8000',
  timeout: 10000,
  // headers: {}
})

axios的拦截器

  • axios提供了拦截器,用于我们在发送每次请求或者得到相应后,进行对应的处理。
点赞

发表评论

邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据