二次封装企业级fetch接口请求

在项目初构时,往往需要对接口的请求进行一个统一封装,方便后续共同开发的同时还利于维护。
整体封装也没多少技术含量,摒弃原有且繁琐的 XMLHttpRequest,采用灵活的 fetch 第三方库,对GET,POST,DELET进行二次封装,以便满足企业级需求。

需求:
  • 拿来即用,具有常见的请求方式(GET,POST,DELET),支持对文件类的请求操作
  • 预置不同的状态码处理
  • 高度复用
思路:
  1. 该hooks在调用时,只需传入接口路径与参数即可
  2. 公共变量写在全局,方便后续修改
  3. 逻辑尽量抽离,保证一个函数只在做一件事。(请求头、响应结果预处理)
源码:
import fetch from 'isomorphic-fetch';
import {
    message } from 'antd';

const BASE_URL = '';
// content-type
const ContentType = {
   
  JSON: 'application/json; charset=UTF-8',
  FORM: 'application/x-www-form-urlencoded; charset=UTF-8',
};

// token header
const getTokenHeaders = () => {
   
  // TODO get the token permission request
  const token = localStorage.getItem('user_token');
  return {
   
    Accept: ContentType.JSON,
    'Content-Type': ContentType.JSON,
    Token: token,
  };
};

// handle url
const getUrl = (url) => {
   
  if (url.startsWith('http://') || url.startsWith('https://')) return url;
  return `${
     BASE_URL}${
     url}`;
};

// common check
const checkStatus = (response, type) => {
   
  if (response.status === 204) return response;
  if ([200, 201, 202].includes(response.status)) {
   
    if (type === 'file') {
   
      return response;
    }
    return response.json();
  }
  // throw new Error(response.status)
  const {
    status } = response;
  const pureResponse = response.json();
  if (type !== 'ignore') {
   
    if ([400, 500].includes(status)) {
   
      pureResponse.then((res) => {
   
        message.error(res.message || res.msg || '未知异常!');
      });
    } else 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值