Fetch封装的HTTP请求

基于dva/fetch的API请求二次封装,类似axios且使用更简单

前言

Web项目开发过程中,发送http请求数据是必不可少的的一步,我们姑且不讨论哪种方式更好,在这里我将项目中使用的HTTP请求的方法进行了一个简单的二次封装,希望能让今后的编码更高效。

使用示例

import { get, post } from "../utils/httptFetch";

function getList(param) {
    try {
      get(`/dataSourceController/dataSourceList`,param).then((res) => {
      		console.log(res);
      	  //将请求返回的数据进行处理赋值
          // this.sysList.list = res.data
      })
    } catch (error) {
      message.error(error)
    }
  }

function delUsers(ids) {
     try {
      post(`/userController/delUsers`, ids).then((res) => {
        if(res.code === 200) {
        message.success(res.message || '删除成功')
        }
      })
    } catch (error) {
      message.error(error)
    }
  }

封装源码

以下代码就是封装的 httptFetch.js文件源码:

/**
 * @author kqzhu
 * @version  1.0.0
 * @date 2020/10/30
 * @description  系统通用fetch数据请求
 */

import fetch from 'dva/fetch';
import { message, notification } from 'antd';
import { history } from 'umi';

//基础请求路径
const baseURL = '/api';

// 请求返回状态码
const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队(异步任务)。',
  204: '删除数据成功。',
  400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限(令牌、用户名、密码错误)。',
  403: '用户得到授权,但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除,且不会再得到的。',
  422: '当创建一个对象时,发生一个验证错误。',
  500: '服务器发生错误,请检查服务器。',
  502: '网关错误。',
  503: '服务不可用,服务器暂时过载或维护。',
  504: '网关超时。',
};
const checkStatus = response => {
  const { status } = response;
  if (status >= 200 && status < 300) {
    return response;
  }
  const errortext = codeMessage[response.status] || response.statusText;
  notification.error({
    message: `请求错误 ${response.status}: ${response.url}`,
    description: errortext,
  });
  const error = new Error(errortext);
  error.name = response.status;
  error.response = response;
  throw error;
};

//格式化参数
const parseQuery = (obj) => {
  let str = ''
  for (let key in obj) {
    const value = typeof obj[key] !== 'string' ? JSON.stringify(obj[key]) : obj[key]
    str += '&' + key + '=' + value
  }
  return str.substr(1)
}

//请求响应后,将response的所有数据转换成json,客户端就可以拿到以json格式响应的所有数据
const parseJSON = response => {
  return response.json();
}

//发起请求前检查是否登录
const checkIsLogin = url => {
  const token = sessionStorage.getItem('jwToken');
  const href = window.location.href;
  if (
    !token&&
    url.includes('/login')&&
    href.includes('/login')
  ) {
    message.warning('请在登录后操作!');
    history.push('/login');
    return;
  }
};

const request = (url,params, options) => {
  // checkIsLogin(url);
  const { method,headers } = options;
  const defaultOptions = {
    // 允许跨域携带资源凭证,发送cookies
    //   - include:无论同源不同源都可以
    //   - same-origin:同源可以,默认值 √
    //   - omit:都拒绝
    credentials: 'include',
    mode: 'cors',
    // 设置请求头
  };
  options.headers = {
      Accept: 'application/json',// 添加携带的数据格式,这个根据需求填写
      'Content-Type': 'application/json; charset=utf-8',
      Authentication: window.sessionStorage.getItem('jwToken'),//添加鉴权Token
      ...headers,//合并配置项
    }
   if (method === 'GET' && params) {
    url += '?' + parseQuery(params)
   } else {
       // 读取传入的数据格式类型,不是表单数据使用JSON库进行格式化
      options.body = JSON.stringify(params);
  }
  const newOptions = { ...defaultOptions, ...options };

  /**
   * 全部配置好之后,最后使用fetch发起一个请求,它本身需要传入一个url和一个options
   */
   return fetch(baseURL + url, newOptions)
    .then(checkStatus)
    .then(parseJSON)
    .then(data => data)
    .catch(err => {
        // 服务器没有响应才会跳转到这里
        if (!window.navigator.onLine) {
        // 断网处理
        // ...
        return;
      }
    // 什么都没有,返回一个错误
      return Promise.reject(err);
    });
};

// GET的请求
export async function get(url, params , ownOptions = { method: 'GET',headers: {}}) {
  return await request(url, params,ownOptions );
}

// POST请求
export async function post(url, params = {},ownOptions = { method: 'POST', headers: {}, body: {}}) {
  return await request(url, params,ownOptions );
}




结语

如果你使用起来有什么问题,欢迎随时评论指正,我会第一时间回复和修改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值