网络请求

阅读: 4200    发布时间: 2018-09-04 15:25:39

github地址:https://github.com/501351981/vue_yii_cms

我希望一个组件能够尽可能的简单,容易理解,易于复制使用,每次写组件前,都是先写api,先定好我希望怎么样使用,再去开发。

我期望的网络请求应该是这样的

network.post(api,post_data,check_login).then((res)=>{
  ....
}).catch(err=>{
  ...
})


network.get(api,params,check_login).then((res)=>{
  ....
}).catch(err=>{
  ...
})
  • 支持promise

  • 最多3个参数,api接口地址,提交的数据,是否先校验登录状态

  • 自动携带token

  • 根据错误码进行相应的处理


vue中网络请求目前推荐使用axios

使用axios,经常会遇到重复请求的问题,见 http://shanhuxueyuan.com/news/detail/67.html

import authorize from './authorize'
import api from '../config/api'
import config from '../config/config'
import axios from 'axios'
import Qs from 'qs'
import router from '../../router'


function toLogin(redirect={go: -1}) {
  router.push({
    path: config.login_path,
    query:redirect
  })
}

function toForbidden() {
  router.push({
    path: config.forbidden_path
  })
}
/*
* check_login,请求数据之前,是否需要检查登录状态,如果登录已过期,则需要重新登录,然后再请求数据
*/
function get(url,data,check_login=false) {
  if(check_login&&!authorize.checkLogin()){
    //如果需要登录,且登录已经过期,则先进行登录,然后再进行数据处理
    return new Promise((resolve,reject)=>{
      toLogin()
      reject("登录过期,请先登录")
    })
  }

  return request(url,data,'get')
}

function post(url,data,check_login=false) {
  if(check_login&&!authorize.checkLogin()){
    //如果需要登录,且登录已经过期,则先进行登录,然后再进行数据处理
   return new Promise((resolve,reject)=>{
     toLogin()
     reject("登录过期,请先登录")
   })
  }

  return request(url,data,'post')
}

function request(url,data,method='get') {
  let params= method=='get'?data:'';
  let post_data= method=='post'?data:'';

  return new Promise((resolve,reject)=>{
    axios.request({
      url: api.baseUrl+url,
      method:method,
      params:{
        ...params,
        access_token:authorize.getToken()
      },
      data:post_data,

      transformRequest: [function (data) {
        return Qs.stringify(data);//把数据转化为QueryString
      }],

      headers:{
        'Content-Type':'application/x-www-form-urlencoded'
      },
      onUploadProgress:'',
      onDownloadProgress:''
    }).then((res)=>{
      res=res.data
      if(res.code=='1'){
        resolve(res.data)
      }else if(res.code=='401'){
        toLogin()
        reject("登录过期,请先登录")
      }else if(res.code=='403'){
        toForbidden()
        reject("缺少权限")
      }else if(res.code=='99'){
        reject(res.msg)
      }else {
        reject("未知code")
      }

    }).catch((err)=>{
      reject(err)
    })
  })

}

export default {
  get,post,toLogin
}




-END-