基于fetch封装简单的请求工具

这篇博客介绍了如何基于fetch API封装一个通用的HTTP请求函数,支持GET和POST等方法,并处理不同类型的响应数据。在请求中,还考虑了携带token的场景,以及错误处理。示例展示了如何使用封装后的函数进行RESTful API调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于fetch封装http请求

import qs from 'qs';
import Config from '../config/index';

type Method = 'GET' | 'POST' | 'HEAD' | 'OPTIONS' | 'PUT' | 'PATCH' | 'DELETE' | 'TRACE' | 'CONNECT';

export enum HttpStateCode {
  ERROR = 500, // Request failed.
  SUCCESS = 200, // Request successful.
  UNAUTHORIZED = 403, // Request unauthorized.
  INVALID_TOKEN = 401 // Request invalid token.
}

export interface RESTful<T = any> {
  //* code: 服务器返回状态码
  code: HttpStateCode;
  //* errMsg: 服务器返回消息
  errMsg: string;
  //* data: 服务器返回响应体
  data: T;
}

type AsyncResponseResult<T> = Promise<T>;

// defaultHeaders:设置默认响应头
const defaultHeaders = {
  'Content-Type': 'application/json; charset=utf-8'
};

const request = (method: Method = 'GET') => {
  return async <T>(url: string, body?: any, customHeaders = {}): AsyncResponseResult<T> => {
    const headers: any = Object.assign({}, defaultHeaders, customHeaders);
    const contentType = headers['Content-Type']; // 获取请求头信息
    const localToken = sessionStorage.getItem('ACCESS_TOKEN');
    // 如果本地存在 token,则请求头中携带 Authorization 发送过去
    localToken && (headers['Authorization'] = localToken);

    if (/^application\/json/.test(contentType)) {
      body = JSON.stringify(body);
    }

    const response = await fetch(Config.apiPrefix + url, {
      method,
      headers,
      body,
      mode: 'cors',
      cache: 'default'
    });

    if (response.ok && response.status >= 200 && response.status < 300) {
      const responseType = response.headers.get('content-type') as string;
      if (/^application\/json/.test(responseType)) {
        return response.json(); // 处理 JSON 数据格式
      } else if (/^text\//.test(responseType)) {
        return response.text() as Promise<any>; // 处理文本
      }
    }
    // 抛出异常 Expection
    throw Error(response.statusText);
  };
};

// 创建对应的请求方法,暴露给外部使用
const post = request('POST');
const get = request('GET');

export { post, get };

使用用例:

import { post, RESTful } from 'fetch';
interface Todo {
  name: string;
  done: boolean;
}

post<RESTful<Todo>>('/api/v3/findTodo').then(result => {
	// result => RESTful<Todo>
})
### 如何在 UniApp 中封装 Fetch 请求 为了简化 HTTP 调用,在 UniApp 项目中可以创建一个专门用于发送请求的 JavaScript 文件 `http.js`。此文件定义了一个异步函数来执行网络请求并处理响应或错误情况。 #### 创建发送请求的 JS 文件 (http.js) ```javascript export default async function http({ url, data = {}, method = "GET" }) { const baseUrl = 'https://example.bspapp.com'; // 替换成实际的基础 URL return new Promise((resolve, reject) => { uni.request({ url: `${baseUrl}${url}`, method, data, success(response) { resolve(response.data); }, fail(error) { reject(error); } }); }); } ``` 上述代码展示了如何设置基础路径以及默认参数,并利用 `Promise` 来管理成功与失败的结果[^3]。 #### 配置特定 API 的调用方法 (fetch.js) 接着可以在另一个文件如 `fetch.js` 中引入之前编写的通用请求模块,从而针对不同类型的资源编写更具体的获取逻辑: ```javascript import http from "./http"; export async function fetchTags() { try { const result = await http({ url: "/getTags", method: "GET" }); return result; } catch (error) { console.error("Failed to load tags", error); throw error; } } // 可以为其他API添加更多类似的导出函数... ``` 这段脚本说明了怎样基于先前构建好的工具进一步抽象化具体的服务端点访问操作。 通过这种方式不仅能够减少重复劳动还能提高代码可维护性和一致性。每当应用程序需要向服务器发起 GET 或 POST 请求时只需简单地调用相应的方法即可完成复杂的交互过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值