最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【Axios】封装一个常用axios

    正文概述 掘金(5加H)   2021-06-20   541

    这是我参与更文挑战的第2天,活动详情查看: 更文挑战

    什么是 axios?

    首先需要知道:axios不是一种新的技术。axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,本质上也是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规范,

    axios 他有哪些特性?

    • 从浏览器中创建 XMLHttpRequests
    • 从 node.js 创建 http 请求
    • 支持 Promise API
    • 拦截请求和响应
    • 转换请求数据和响应数据
    • 取消请求
    • 自动转换 JSON 数据
    • 客户端支持防御 XSRF

    开始使用

    使用 npm安装:

    $ npm install axios
    

    使用 bower安装:

    $ bower install axios
    

    使用 cdn:

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

    封装Axios

    1、设置baseURl,创建config.js文件

    export const baseUrl = location.protocol + '//localhost'  //项目域名
    const environment = process.env.NODE_ENV === 'production' ? 'pro' : 'dev' //dev开发环境  pro 生产环境
    let exports = {}
    // 开发环境
    if(environment === 'dev'){
      exports = {
        proxyBaseUrl:'/api',
        fyBaseUrl:'/apis' //防疫接口
      }
    // 线上环境
    }else if(environment === 'pro'){
      exports = {
        // 项目使用到多个域名,可以进行多个入口配置
        proxyBaseUrl:location.protocol + '//localhost', // 应用1
        fyBaseUrl:location.protocol + '//localhost' //应用2
      }
    }
    export default exports
    

    2、创建service.js

    配置axios,全局设置请求信息和错误信息处理

    import axios from 'axios'
    import router from './../router' 
    const showStatus = (status) => {
      let message = ''
      switch (status) {
        case 400:
          message = '请求错误(400)'
          break
        case 401:
          message = '未授权,请重新登录(401)'
          break
        case 402:
          message = '拒绝访问(402)'
          break
        case 404:
          message = '请求出错(404)'
          break
        case 408:
          message = '请求超时(408)'
          break
        case 500:
          message = '服务器错误(500)'
          break
        case 501:
          message = '服务未实现(501)'
          break
        case 502:
          message = '网络错误(502)'
          break
        case 503:
          message = '服务不可用(503)'
          break
        case 504:
          message = '网络超时(504)'
          break
        case 505:
          message = 'HTTP版本不受支持(505)'
          break
        default:
          message = `连接出错(${status})!`
      }
      return `${message},请检查网络或联系管理员!`
    }
    
    const service = axios.create({
      // 联调
      
      headers: {
        get: {
          'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
        },
        post: {
          'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
        }
      },
      // 是否跨站点访问控制请求
      withCredentials: true,
      timeout: 30000,
      validateStatus() {
        // 使用async-await,处理reject情况较为繁琐,所以全部返回resolve,在业务代码中处理异常
        return true
      }
    })
    
    // 请求拦截器
    service.interceptors.request.use(
      config => {
        return config
      },
      (err) => {
        err.message = '服务器异常,请联系管理员!'
        // 错误抛到业务代码
        return Promise.reject(err)
      }
    )
    
    // 响应拦截器
    service.interceptors.response.use(
      response => {
        const status = response.status
        let msg = ''
        if (status < 200 || status >= 300 && status != 401 && status != 500) {
          // 处理http错误,抛到业务代码
          msg = showStatus(status)
          if (typeof response.data === 'string') {
            response.data = { msg }
          } else {
            response.data.msg = msg
          }
          return response
        }else if(status == 200){
          return response
        }else if(status == 500){
          msg = showStatus(status)
          response.data = {msg:msg}
          router.replace({name:'exception',query:{type:500}})
          return response 
        }
        
      },
      (err)=>{
        err.message =  '请求超时或服务器异常,请检查网络或联系管理员!'
        return Promise.reject(err)
      }
    )
    
    export default service
    

    3、创建接口请求文件

    不同区块的功能的数据,可以创建多个文件,便于区分和后期管理

    import config from './config' // 基础路径
    import service from './service' //封装的axios
    /**
     * data 是post传参
     *
     */
    export const Upload = (data)=> service({
      url: `${config.proxyBaseUrl}/user/upload`,
      method: 'POST',
      data: data,
      headers:{
       //这里可以单独设置headers
      },
    })
    

    4、实际组件中调用请求

    import {Upload} from 你的请求文件地址
    
    Upload(参数).then((res)=>{
      //返回的数据
    })
    .catch((err)=>{
      //错误信息
    })
    

    起源地下载网 » 【Axios】封装一个常用axios

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元