浅谈vue项目进阶开发-axios篇

今天来谈一谈有关vue项目中使用Ajax插件库axios,以及对它做的一些封装。

安装就不再提了,在这axios;

1.简单使用


axios.post('/user' , {

  params: {

    firstName: 'Fred',

    lastName: 'Flintstone'

  }

}).then(function (response) {

    console.log(response);

  }).catch(function (error) {

    console.log(error);

  });

无需多言,一目了然。

对于接口地址我们需要处理一下跨域问题:

使用http-proxy-middleware 代理解决:

例如请求的url:“http://f.apiplus.cn/bj11x5.json

a、打开config/index.js,在proxyTable中添写如下代码:


proxyTable: {

  '/api': {  //使用"/api"来代替"http://f.apiplus.c"

    target: 'http://f.apiplus.cn', //源地址

    changeOrigin: true, //改变源

    pathRewrite: {

      '^/api': 'http://f.apiplus.cn' //路径重写

      }

  }

}

b.使用时


getData () {

axios.get('/api/bj11x5.json', function (res) {

  console.log(res)

})

c.通过这中方法去解决跨域,打包部署时还按这种方法会出问题。解决方法如下:


let serverUrl = '/api/'  //本地调试时

// let serverUrl = 'http://f.apiplus.cn/'  //打包部署上线时

export default {

  dataUrl: serverUrl + 'bj11x5.json'

}

但是这种解决方法处理时,当线上的域名与接口不一致时会出现同一个请求发送两次的问题。网上说的解决方式是在请求头部加上Access-Control-Max-Age(单位s),这个是预检请求的时间,只要设置的时间足够长就能解决该问题,(Chrome时间上限为600s),然而亲测无效。大家可以试试。

2.axios拦截器

axios拦截器有两种,请求拦截和响应拦截,其目的是为了在接口请求和响应时统一地处理一些事情,比如网络错误,后端抛出的错误。


import axios from 'axios'

// 添加一个请求拦截器

axios.interceptors.request.use(config => {

  // Do something before request is sent

  return config

}, error => {

  // Do something with request error

  return Promise.reject(error)

});

// 添加一个响应拦截器

axios.interceptors.response.use(response => {

  // Do something with response data

  return response

}, error => {

  // Do something with response error

  return Promise.resolve(error.response)

});

在这里我们并没有在拦截器里面处理我们需要处理的事情,当然你可以这么做。我们用promise链式处理接口异常。

3.封装

处理方式如下:


  request(obj) {

    return new Promise((resolve, reject) => {

      axios({

        method: obj.method,

        baseURL: obj.baseUrl,

        url: obj.path,

        data: obj.method === 'post' ? obj.params : {},

        params: obj.method === 'get' ? obj.params : {},

        timeout: 20000,

        withCredentials: true,

        headers: {

          'X-Requested-With': 'XMLHttpRequest',

          'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'

        }

      }).then((res) => {

        return _checkStatus(res)

      }).then((res) => {

        if (res.retCode !== 0) {

          if (obj.showErr) {

            // 如果retCode异常(这里包括后端抛出的错误),可以弹出一个错误提示,告诉用户

            Message({showClose: true, message: res.retMsg, type: 'warning'});

          } else {

            return reject(res)

          }

        } else {

          return resolve(res)

        }

      }).catch((err) => {

        return reject({retMsg: '未知错误', retCode: 500})

      })

    })

  }

这里处理接口异常情况主要有两种,第一种是code码异常也就是code为非200状态,第二种是接口返回数据异常(retCode异常)。第一种情况我们用_checkStatus()处理的,具体如下:


function _checkStatus(response) {

  // loading

  // 如果http状态码正常,则直接返回数据

  if (response && (response.status === 200 || response.status === 304 || response.status === 400)) {

    return response;

  }

  // 异常状态下,把错误信息返回去

  return {

    status: -404,

    msg: '网络异常'

  }

}

第二种情况 我们这么处理的:


        if (res.retCode !== 0) {

          if (obj.showErr) {

            _dealCode(res);

          } else {

            return reject(res)

          }

        } else {

          return resolve(res)

        }

解释下,这里的showErr是控制是否统一处理错误,有时候我们需要单独去处理一些特殊情况的错误反馈。这里的res.retcode!==0表示http状态码正确(接口连接正常),但返回的数据有问题,不同的retCode代表不同的意思,这个可以跟后端约定好,后端会把数据异常原因放在retMsg里面,比如和后端约定好retCode===999时,表示传参出错,retMsg = ‘传参错误’。

正常情况下我们直接统一弹出一个错误提示给用户就好了,但有时候需要特殊处理此时chua传参数时showErr=false即可.

调用时这么做即可:


this.$http.request({'https://baishsd.com/', path: 'newCost/Report/ChartAcpe', params, method:'post',showErr:true}).then(res => {})

使用时加上showErr,无需catch捕获异常,已统一处理。

不过这么写参数还是麻烦了一点,可以自己封装下参数,全部写在app.js中统一放置接口,统一管理

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 《富爸爸穷爸爸》读书笔记第二部分 1. 在校园之外的现实生活里,有许多东西比好成绩更为重要,人们称之为“魄力”、“...
    人鱼说阅读 310评论 2 2
  • 昨天例行code review时大家有讨论到int和Integer的比较和使用。 这里做个整理,发表一下个人的看法...
    buguge阅读 5,630评论 2 3
  • 第一章缘分 我叫张天乐,性别女,出生于一个中下等家庭,吃不好饿不到的年纪,说实话我对钱并不那么着迷,我只是想要自由...
    高丙寅阅读 377评论 0 1
  • 大家好,我是十七君,这是我在简书创作的第695天,今天首页只有一篇我写的文章,我要写一个回乡的故事,我想分享我最近...
    十七君阅读 364评论 1 6