ssyy-be-request

0.0.2 • Public • Published

be-request

基于 axios,为中后台提供前后端通信方案
特点:

  • 用法与 axios 保持一致
  • 默认配置,开箱即用
  • 支持自定义配置,扩展性好
  • 集成测试,可测可控

快速开始

安装

$ npm install @luna/be-request --registry=http://registry.npm.lu-fe.com
or
$ npm add @luna/be-request --registry=http://registry.npm.lu-fe.com

配置 baseURL

// ice.config.js
module.exports = {
  chainWebpack: (config) => {
    config
      .plugin('DefinePlugin')
      .tap(([options]) => {
        return [{
          ...options,
          BASEURL: JSON.stringify('/bpi-be-cs-app/service'),
        }];
      });
   },
}

or

// index.js 程序入口
import request from '@luna/be-request';

request.setConfigs({
   baseURL: '/bpi-be-cs-app/service'
});

使用

// class 组件
import request from '@luna/be-request';

 onGetTableList = async () => {
    try {
      const {list} = await request.post('/customer/get-basic-info', { id: 12 }); // 不用加判断,只有code === '0' || code === '0000'才会到这里
      this.setState({tableList: list || [] })
    } catch (error) {
      error.hideError(); // 如果想用
    }
  }

or

// function 组件 hooks
import {useRequest} from '@luna/be-request';

const [tablelist, requestTablelist]  = useRequest({method: 'post', url: '/post'});

async function handleSubmit() {
    try {
      await requestTablelist();
    } catch (err) {
      console.error(err);
    }
}

关于配置

默认如下配置: 若系统存在差异,可以通过 setConfigs 方法配置,全局生效

const defaultConfigs = {
  baseURL: BASEURL || '/wmc-be-iadmin-app/service', // BASEURL webpack definePlugin 定义
  timeout: 6000,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'X-LUFAX-LOCALE': locale.replace('-', '_'),
  },

  luRootUrl: window.mock || `${protocol}//${hostName}${port ? ':' : ''}${port}/api`, // fullUrl = luRootUrl(luRootUrlMedia) + baseURL + url
  luRootUrlMedia: window.mock || `${protocol}//${hostNameMedia}${port ? ':' : ''}${port}/wmc-be-media/forward`, // 共享层文件上传使用 dataType: 'media'
  // 当设置成false时,不会Message.error();
  // 当设置为true 时,会自动Message.error(data.res_msg),
  // 在请求的catch((error)=>{error.hideError()})不会执行Message.error(data.res_msg)
  isShowError: true,
  settleRequest: function settleRequest(config) { // 请求拦截处理
    const {
      luRootUrl, luRootUrlMedia, dataType, baseURL,
    } = config || {};
    let rootUrl = luRootUrl;
    if (config.data && utils.isFormData(config.data) && dataType === 'media') {
      rootUrl = luRootUrlMedia;
    }
    if (config.data && !utils.isFormData(config.data)) { // FormData
      config.data = `param=${JSON.stringify(serialize(config.data))}`;
    }
    config.baseURL = `${rootUrl}${baseURL}`; // axios fullUrl =  baseURL(axios) + url = rootUrl + baseURL + url; 当url 为绝对路径(://) fullUlr = url;
    return config;
  },
  validateStatus: function validateStatus(status) {
    return status >= 200 && status < 400;
  },
  validateCode: function validateCode(code) {
    return code === '0' || code === '0000';
  },
  settle401: (error) => { // status: 401 调用
    if (window.location.href.indexOf('/wmc-be-admin/wmc-web/login') === -1) {
      window.location.href = `/wmc-be-admin/wmc-web/login?fromUrl=${location.href}`;
    }
  },
  settleError: () => { // 不是 validateCode 时 调用

  },
};

具体应用

引用方式跟 axios 一样 参考:https://github.com/axios/axios http://www.axios-js.com/docs/

axios(config)
axios#request(config)
axios#get(url[, config])
axios#delete(url[, config])
axios#head(url[, config])
axios#options(url[, config])
axios#post(url[, data[, config]])
axios#put(url[, data[, config]])
axios#patch(url[, data[, config]])
axios#getUri([config])

使用案例:

一、axios.all(iterable) axios.all = function all(promises) { return Promise.all(promises); };

用例 // hooks all (class 组件一样)

  import request, {useRequest} from '@luna/be-request';

  const [tablelist, requestTablelist]  = useRequest({method: 'post', url: '/post', data: {name:'shangyy', age:18 }});
  const [panellist, requestPanellist]  = useRequest({method: 'post', url: '/post'});

  function handleSubmit() {
    request.all([
      requestTablelist(),
      requestPanellist(),
    ]).then(request.spread(function (list1, list2) {
      console.log(list1);
      console.log(list2);
    }));
  }

二、进度 progress

import request from '@luna/be-request';

request({
  method: 'post',
  url: 'xxx',
  data:{},
  onDownloadProgress: (data)=>{
     console.log('panellist onDownloadProgress',data);
  },
})

三、取消请求 // Expose Cancel & CancelToken axios.Cancel = require('./cancel/Cancel'); axios.CancelToken = require('./cancel/CancelToken'); axios.isCancel = require('./cancel/isCancel');

import React from 'react';
import { Search } from '@alifd/next';
import IceContainer from '@icedesign/container';
import request from '@luna/be-request';

class CancelRequest extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      resData: null,
    };
    this.cancelToken = null;
  }

  onSearch = async (val) => {
    if(this.cancelToken){
      this.cancelToken.cancel();
    }
    this.cancelToken = request.CancelToken.source();
    try {
      const resData = await request.post('/post',{val},{cancelToken: this.cancelToken.token});
      this.setState({ resData });
    } catch (err) {
      // err.hideError();
      if(request.isCancel(err)){
        console.log('Request canceled', err.message); 
      }
      this.setState({ resData: null });
    }
  }

  ......

}

export default CancelRequest;

贡献 加入我们

npm run dev
源码在src 中 ,监听代码改动,打包更新到dist

npm run build
打包代码 dist; package.json main: "dist/index"

npm run test
集成jest单元测试, 修改代码写入对应的单元测试

实际项目测试
执行以下命令就可以通过link 的方式在 example 项目中测试,数据可以mock
npm link
cd example
npm install 安装example依赖
npm link @luna/be-request
npm start

提交代码
提交代码会进行 eslint , commit lint 检测, 不通过则不能提交代码成功
git add filename
npm run cz
git push origin 分支

Readme

Keywords

Package Sidebar

Install

npm i ssyy-be-request

Weekly Downloads

1

Version

0.0.2

License

MIT

Unpacked Size

36.8 kB

Total Files

12

Last publish

Collaborators

  • shangyy