FE - 走向Node与Webpack之路 - Vue 网络层设计

啰嗦

最近简单学习了vue相关知识,其中在开发过程中,数据请求使用的是 axios , 用法已经很简单了。

说说为什么封装网络层:

  • 如果需要更换 axios网络请求库,怎么办?
  • 可能某个接口需要改变参数顺序?
  • 可能某个接口更换地址?
  • …..

基于上面原因,需要封装网络层,做到:

  • http请求库统一配置
  • 返回值回调统一处理
  • api 统一管理
  • 简易便

网络层设计

配置全局$http , 使用$http.moudle.operation(params,callback) 统一回调

这里写图片描述

如图所示:

分为 3 层: servicecontrollerhttp.js

  • service :统一管理api 和 直接进行数据访问
  • controller : 数据回调统一处理,返回view统一格式的数据
  • http.js : 统一所有接口操作,方便全局配置
  • common : 统一http配置请求对象和数据回调处理函数等

示例

首先 安装 axios :

npm i axios -D

基本结构:

这里写图片描述

common

FbHttp.js 网络请求对象

/**
 * Created by yuan on 3/1/2017.
 * (1) parse data
 * (2) http : network error : status -1
 */
import http from 'axios'

// config http
http.defaults.baseURL = 'http://localhost:8080/example'
http.defaults.timeout = 2500
http.defaults.headers.post['Content-Type'] = 'application/json'
// cache-control: "max-age=0, private, must-revalidate"
http.defaults.headers.post['Cache-control'] = 'max-age=5'

export default http

FbResponse.js 返回值统一处理

请求对象进行请求后,返回promiss对象,再次进行callback返回格式为 [code,data]function.

/**
 * Created by yuan on 3/1/2017.
 */

// 通用返回值处理
export default function FbResponse (promiss, callback) {
  console.log('----------------- http already response : [code,data] => {} --------------------')
  promiss.then(response => {
    console.log('response => ' + response.data)
    return callback([response.status, response.data])
  }).catch(error => {
    if (error.response) {
      return callback([error.response.status, error.response.data])
    } else {
      return callback(['-1', error.message])
    }
  })
}

service : 使用 fbhttp.js 请求对象进行数据请求

doc.js doc相关api统一管理

注意: 若字符串使用${} 则该字符串使用键盘tab键上面的上引号

/**
 * Created by yuan on 3/1/2017.
 * doc api
 */
import http from '../common/FbHttp'

// 创建 doc
function createMakeDoc (data) {
  return http.post('/documents/', data)
}

// 获取 doc list
function getMakeDocList (page, pagesize) {
  return http.get(`/documents?page=${page}&pagesize=${pagesize}`)
}

// 获取 doc obj
function getMakeDocById (id) {
  return http.get(`/documents/${id}`)//这里的引号需要注意tab键上面键的上引号
}

// 更新 doc obj
function updateMakeDoc (id, data) {
  return http.put(`/documents/${id}`, data)
}



export {
  createMakeDoc,
  getMakeDocList,
  getMakeDocById,
  updateMakeDoc
}

controller

docService.js 返回值统一处理,统一回调

/**
 * Created by yuan on 3/1/2017.
 * 处理 doc 文档
 */

import FbResponse from '../common/FbResponse'
import * as doc from '../service/doc'

function createMakeDoc (data, callback) {
  FbResponse(doc.createMakeDoc(data), callback)
}

function getMakeDocsList ({page = 1, pagesize = 10}, callback) {
  FbResponse(doc.getMakeDocList(page, pagesize), callback)
}

function getMakeDocObj ({id = 0}, callback) {
  FbResponse(doc.getMakeDocById(id), callback)
}

function updMakeDocObj ({data = null}, callback) {
  if (data === null) {
    return
  }
  FbResponse(doc.updateMakeDoc(data.id, data), callback)
}

function filterMakeDoc ({page = 1, week = null, userId = null, year = null}, callback) {
  FbResponse(doc.filterMakeDoc([page, week, userId, year]), callback)
}

export {
  createMakeDoc,
  getMakeDocsList,
  getMakeDocObj,
  updMakeDocObj,
  filterMakeDoc
}

http.js : 接口统一 default , 全局使用

http.js

/**
 * Created by yuan on 2/27/2017.
 * http 总入口/出口
 * 导出每个请求模块
 * (1) export default service
 */

// user
import * as user from './controller/userService'
// doc
import * as doc from './controller/docService'

export default {
  user,
  doc
}

配置 vue main.js

main.js

import http from './server/http'

// use http
Vue.prototype.$http = http

use : $http.moudle.operation(params,callback)

使用

this.$http.doc.getMakeDocObj({id: id}, [code,data]=>{
   console.log(code)
   console.log(data)
})

example :

 export default {
    name: 'DocDetail',
    data: function () {
      return {
        markDoc: {
          'content': ''
        }
      }
    },
    created: function () {
      let id = this.$route.params.id
      this.$http.doc.getMakeDocObj({id: id}, this.response)
    },
    methods: {
      response: function ([code, data]) {
        console.log(data)
        if (code === 200) {
          this.markDoc = data
        } else {
          this.showMsg(['error', `network error : status ${code}`])
        }
      },
      showMsg: function ([type, msg]) {
        this.$message({
          message: msg,
          type: type
        })
      }
    }
    }
  }

代码 github 地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值