使用fetch封装get与post方法

网上看了一些对fetch的封装,有点看不伶清。如在request中配置timeout与responseType字段等,在文档上找根本找不到。于是自己封装个简单版的fetch,方便拿到项目中改造一下就可以使用。

注意点

  1. 使用fetch时会产生跨域问题,需服务端配置跨域响应头;
  2. fetch中没有接口请求超时的配置,需自己处理,本文暂未处理,留作优化点;

直接封装

/*** @param use 封装的使用场景* 1. 本次fetch封装是经过nodeJs的koa框架启动的node服务验证的,对于java启动的服务还需自行验证修改* 2. 验证通过了普通的get/psot、表单上传、上传文件,下载文件等* @param koa* 1. 使用koa搭建服务端时,为了搭配fetch使用要配置跨域,建议使用koa2-cors开源库* @param fetch* 1. 选择使用fetch是因为是浏览器原生支持的方法,不需引入其它依赖。同时使用fecth会遇到跨域问题,需服务端配置请求响应头* 2. 本次封装暴露出了get与post两个方法* 3. 遗留问题:没有设置超时时间 // TODO:* @param get post* 1. 形参主要有 路径path(接口的url):必传,data参数(object):选传,options配置参数(object):选传* 2. options参数中可以传入fecth的headers配置等,也有一个默认type属性,默认值为'json',主要处理headers中的'Content-Type'属性值* 3. type值有 'json' 'text' 'file' 'blob' 'arrayBuffer'等* @param type* 1. 加入type值是为了处理'Content-Type'与body取值的问题* 2. body取值:在type值为'json'、'text'、'blob'时,需要进行JSON.stringify()转换;在值为'file'时,无需进行转换* 3. 'Content-Type'取值:在type值为'json'、'text'、'blob'时,需要配置 headers["Content-Type"] = "application/json";在值为'file'时,无需进行配置,配置了反而有问题,浏览器会自行添加配置* @param response* 1. 在type值为'json'、'file'时,response.json();值为'text'时,response.text();值为'blob'时,response.blob()*/// 基础配置
const baseURL = "http://192.168.0.106:8002";// 接口报错统一提示
function errorCallBack(message) {console.log(`${message || "接口传参错误"}`); // 正式使用时使用$message提示
}// 公共逻辑处理
async function request(method, path, data, config = {}, type = "json") {if (!(typeof method === "string" && ["get", "post", "delete", "put"].includes(method)) || !(typeof path === "string") || !(!data || typeof data === "object") || !(typeof config === "object") || !(typeof type === "string")) {errorCallBack();return;}const configDefault = { headers: {} };method = method.toUpperCase();let initConfig;let url = path.startsWith("http") ? path : baseURL + path;const token = localStorage.getItem("token");if (token) configDefault.headers.authorization = "Bearer " + localStorage.getItem("token"); // 这里的authorization怎么赋值要看服务端的设置if (method === "get") {initConfig = { ...configDefault, ...config };const params = data? JSON.stringify(data).replace(/:/g, "=").replace(/"/g, "").replace(/,/g, "&").match(/\{([^)]*)\}/)[1]: ""; // 有问题就使用qs开源库处理if (params) url += `${url.includes("?") ? "&" : "?"}${params}`;} else {const body = data && ["json", "text", "blob"].includes(type) ? JSON.stringify(data) : data; // json file textinitConfig = data ? { ...configDefault, ...config, method, body } : { ...configDefault, ...config, method };}if (["json", "text", "blob"].includes(type)) initConfig.headers["Content-Type"] = "application/json";const response = await fetch(url, initConfig);// response.status [200,300)if (response.ok) {if (["text"].includes(type)) return response.text();if (["blob"].includes(type)) return response.blob();if (["arrayBuffer"].includes(type)) return response.arrayBuffer();return response.json();}// 也可以塞入对token失效等情况的判断以及处理逻辑errorCallBack("Something went wrong on API server!");throw new Error("Something went wrong on API server!");
}export function get(path, params, options = { type: "json" }) {const config = options.config || {};const type = options.type || "json";return request("get", path, params, config, type);
}
export function post(path, params, options = { type: "json" }) {const config = options.config || {};const type = options.type || "json";return request("post", path, params, config, type);
}

测试使用

// 使用
import { get, post } from "./fetch.js";
export function loginUser(opts) { // 表单数据上传return post("/user/login", opts);
}
export function testUser() { // 后端返回的data为字符串return get("/user/username", null, { type: "text" });
}
export function uploadfile(opts) { // 上传文件return post("/plate/file", opts, { type: "file" });
}
export function getfile(opts) { // 下载文件return post("/plate/test", opts, { type: "blob" });
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Runloop解析

RunLoop 前言 ​ 本文介绍RunLoop的概念,并使用swift和Objective-C来描述RunLoop机制。 简介 ​ RunLoop——运行循环(死循环),它提供了一个事件循环机制在程序运行过程中处理各种事件,例如用户交互、网络请求、定…

用JAVA编程解决数位和相等问题

如果一个正整数转化成二进制与转换成八进制后所有数位的数字之和相等,则称为数位和相等的数。   前几个数位和相等的正整数为 1, 8, 9, 64, ……   请问第 23 个数位和相等的正整数是多少?用JAVA编程解决 可以通过编程计算第 23 个数位和相等的正整…

Xshell连接VMware虚拟机中的CentOS

Xshell连接VMware虚拟机中的CentOShttps://www.cnblogs.com/niuben/p/13157291.html 步骤: 1. 检查Linux虚拟机的网络连接模式,确保它是NAT模式。(由于只在本机进行连接,所以没有选择桥接模式。当然,桥接模式的配置会…

利用ngrok实现内网穿透(全网最详细教程)

准备工具: 1、phpstudy 用于在本地搭建网站 2、ngrok 用于将自己的本地端口暴露到公网上,从而实现内网穿透 文章开始前给大家分享一个学习人工智能的网站,通俗易懂,风趣幽默 人工智能https://www.captainbed.cn/myon/ ~~~~~…

浅谈Linux bash脚本----获取脚本启动参数

${#} 用于获取传递给脚本的参数数目 params_count${#} echo $params_count > ./PATH/TO/my_script.sh param1p1 param2p2 > 2 ${} 用于获取传递给脚本的参数列表 params_list${} echo $params_list > ./PATH/TO/my_script.sh param1p1 param2p2 > param1p1 …

【教学类-06-12】20231126 (一)二位数 如何让加减乘除题目从小到大排序(以1-20之间加法为例,做正序排列用)

结果展示 优化后 优化前 背景需求: 生成列表 单独抽取显示题目排序方法 存在问题: 我希望 00 01 02……这样排序,但是实际上,除了第一个加数会从小到大排序,第二个被加数的第十位数和个位数都会从小到大排序,也就是…

Centos7离线安装chrome浏览器

很多时候在linux下直接安装chrome浏览器困难,或者速度极慢,这里总结下在离线的情况下,怎么下载安装chrome并且配置对应的driver驱动 1.首先如果有安装历史版本,可以先卸载,卸载命令: yum remove google-chrome-stable.x86_64 -y 2.最好下载历史版本chrome,比较稳定,…

Docker attach 命令

docker attach:连接到正在运行中的容器。 语法 docker attach [OPTIONS] CONTAINER要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。 官方文档中说attach后可以通过CTRL-…

提示工程-Prompt Engineering

提示工程 提示工程 1、概述 Prompt Engineering: 提示工程 通过自然语言(英语、汉语等)来给AI下达指示,从而让AI完成你指定给他的工作的过程都可以称之为提示工程。(面向自然语言编程) 提示词要素 指令&…

Spring Web MVC

目录 一.简介 二.建立连接(客户端和服务器) 三.请求 1.传递单个参数 2.传递多个参数 3.对象 4.数组/集合 5.JSON 6.URL参数 7.上传文件 8.获取cookie和session (1)获取cookie (2)获取session …

electron 问题记录

23年11月24 electron项目npm install 卡在一个地方不动 原因:主要是 install electron 会卡住 解决方法: # 先解决install electron卡死 npm install -g cnpm --registryhttps://registry.npmmirror.com cnpm install electron# 然后下载其他依赖 np…

4D Gaussian Splatting:用于实时的动态场景渲染

Wu G, Yi T, Fang J, et al. 4d gaussian splatting for real-time dynamic scene rendering[J]. arXiv preprint arXiv:2310.08528, 2023. 更多参考资料如下: 文章总结:4D Gaussian Splatting for Real-Time Dynamic Scene Rendering;疑难问…

C#,《小白学程序》第二十一课:大数的减法(BigInteger Subtract)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

js返回顶部按钮

返回顶部模块 你可以使用 JavaScript 和 CSS 来实现滚动到底部时显示侧边栏&#xff0c;并点击返回顶部按钮返回页面顶部的效果。下面是一个简单的示例代码&#xff1a; HTML&#xff1a; <!DOCTYPE html> <html> <head><style>#sidebar {position:…

[网络] 4. HTTP/1.1 相比 HTTP/1.0 提高了什么性能?

HTTP/1.1 相比 HTTP/1.0 性能上的改进 ● 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。 ● 支持管道&#xff08;pipeline&#xff09;网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&#xff0c;可以减…

python中模块的创建及引用(import as,import,from)

模块&#xff08;module&#xff09;简介&#xff1a; 1.模块化&#xff0c;模块化指将一个完整的程序分解为一个一个的小模块&#xff0c; 通过将模块组合&#xff0c;来搭建出一个完整的程序 2.不采用模块化就是统一将所有的代码编写到一个文件中&#xff0c;采用 模块化就是…

Linux内核--内存管理(十二)内存映射

目录 一、引言 二、用户态内存映射 ------>2.1、小块内存申请 ------>2.2、大内存块申请 三、用户态缺页异常 ------>3.1、匿名页映射 ------>3.2、文件映射 ------>3.3、页交换 四、内核态内存映射及缺页异常 五、总结 一、引言 内存映射不仅是物理…

Redis-Redis 高并发分布式锁

集群分布式场景高并发 1.negix配置代理和路由 高并发场景超卖问题 1.使用原生redis控制超卖时(若是商品&#xff0c;则可以将商品id作为锁对象)&#xff0c;会遇到的问题 问题一&#xff1a;若直接使用&#xff1a;将获取锁的对象和设置的超时的时间分开&#xff0c;则不能控…

css实现图片绕中心旋转,鼠标悬浮按钮炫酷展示

vue模板中代码 <div class"contentBox clearfix home"><div class"circle"><img class"in-circle" src"../../assets/img/in-circle.png" alt""><img class"out-circle" src"../../as…

【Android】Android Framework系列--Launcher3各启动场景源码分析

Android Framework系列–Launcher3各启动场景源码分析 Launcher3启动场景 Launcher3是Android系统提供的默认桌面应用(Launcher)&#xff0c;它的源码路径在“packages/apps/Launcher3/”。 Launcher3的启动场景主要包括&#xff1a; 开机后启动&#xff1a;开机时&#xff…