原生JS/JQuery封装请求工具类

原生JS的用途

原生 JavaScript 是一种用于开发网络应用程序的编程语言。它可以用于网页开发、服务器端开发和移动应用开发等多个方面。以下是原生 JavaScript 的一些主要用途:

  1. 网页开发:原生 JavaScript 可用于处理 DOM(文档对象模型)操作,通过修改 HTML 元素的内容、样式和属性来实现交互效果、动态更新页面内容等。

  2. 服务器端开发:通过使用 Node.js,原生 JavaScript 可用于构建服务器端应用程序,处理 HTTP 请求、数据库操作、文件操作等。

  3. 浏览器扩展开发:原生 JavaScript 可用于开发浏览器扩展,为浏览器添加新的功能和特性。

  4. 移动应用开发:通过使用框架如 React Native,原生 JavaScript 可用于开发 iOS 和 Android 移动应用程序。

  5. 游戏开发:原生 JavaScript 可用于开发基于 Web 技术的游戏,利用 HTML5 的 Canvas 和 Web Audio API 来实现游戏的绘制和音频效果。

总之,原生 JavaScript 是一种功能强大的编程语言,可应用于各种开发领域,使开发人员能够构建丰富、交互性强的应用程序和网页。

那jQuery是什么?

jQuery 我们可以理解位它对原生js的封装。向开发者提供更加便捷的编码手段。

JQuery的优势有以下几个:

  1. 简化操作:JQuery提供了简洁而强大的API,可以方便地操作HTML文档、处理事件、进行动画效果等,大大简化了JavaScript编码的复杂性,提高了开发效率。

  2. 跨浏览器兼容性:JQuery封装了许多通用的跨浏览器的解决方案,可以在不同浏览器上保持一致的行为和效果,避免了开发者为不同浏览器编写不同的代码的麻烦。

  3. 插件丰富:JQuery拥有庞大的插件生态系统,提供了大量的插件和扩展,可以满足各种需求,如图像轮播、表单验证、日期选择等,开发者可以直接使用这些插件来实现功能,而不需要从头开始编写代码。

  4. AJAX支持:JQuery提供了简洁易用的AJAX方法,可以方便地进行异步数据请求和交互,大大简化了与服务器进行通信的过程。

  5. 动画效果:JQuery提供了丰富的动画效果,可以实现淡入淡出、滑动、缩放等各种效果,可以为网站添加生动、有吸引力的交互效果,提升用户体验。

总的来说,JQuery的优势在于简化操作、跨浏览器兼容性、丰富的插件生态系统、方便的AJAX支持和强大的动画效果等特点,使得开发者可以更快、更高效地开发出高质量的Web应用。

封装HTTP请求和响应

原生

// 请求拦截器函数  
function requestInterceptor(url, options) {  
    // 在这里添加请求前的逻辑,比如添加请求头  
    console.log('请求拦截器: 正在发送请求到', url);  
    // 你可以根据需要修改 options  
    // 例如,添加一个自定义的请求头  
    options.headers = {  
        ...options.headers,  
        'Custom-Header': 'CustomValue'  
    };  
    return options;  
}  
  
// 响应拦截器函数  
function responseInterceptor(response) {  
    // 在这里添加响应后的逻辑,比如检查状态码、转换数据格式  
    console.log('响应拦截器: 接收到响应', response.status);
    console.log('数据:', response)
    // 检查响应状态码  
    if (!response.ok) {  
        throw new Error(`HTTP error! status: ${response.status}`);  
    }  
      
    // 假设我们期望返回 JSON 格式的数据  
    return response.json();  
}  
  
// 封装 fetch 函数的自定义请求函数  
function customFetch(url, options) {  
    // 请求拦截  
    const interceptedOptions = requestInterceptor(url, options);  
  
    // 使用 fetch 发送请求  
    return fetch(url, interceptedOptions)  
        .then(responseInterceptor) // 响应拦截  
        .then(data => {  
            console.log('请求成功,返回数据:', data);  
            return data; // 返回解析后的数据  
        })  
        .catch(error => {
            console.error('请求失败:', error);
            throw error;  
        });  
}  
  
// 使用封装后的 customFetch 函数发送请求  
// customFetch('https://api.example.com/data', {
//     method: 'GET',
//     headers: {
//         'Content-Type': 'application/json'
//     }
// })
// .then(data => {
//     // 使用返回的数据
// })
// .catch(error => {
//     // 处理错误
// });

jQuery

// 请求拦截器函数  
function requestInterceptor(jqXHR, settings) {  
    // 在这里添加请求前的逻辑,比如修改请求头、添加参数等  
    console.log('请求拦截器: 正在发送请求', settings.url);  
      
    // 例如,添加一个自定义的请求头  
    jqXHR.setRequestHeader('Custom-Header', 'CustomValue');  
}  
  
// 响应拦截器函数  
function responseInterceptor(jqXHR, textStatus, errorThrown) {  
    // 在这里添加响应后的逻辑,比如检查状态码、处理错误等  
    console.log('响应拦截器: 接收到响应', jqXHR.status);  
      
    // 检查响应状态码  
    if (jqXHR.status >= 200 && jqXHR.status < 300) {  
        // 请求成功,可以根据需要处理返回的数据  
        var responseData = jqXHR.responseText; // 或者使用 jqXHR.responseJSON,如果服务器返回的是 JSON  
        console.log('请求成功,返回数据:', responseData);  
    } else {  
        // 请求失败,可以抛出错误或执行其他逻辑  
        console.error('请求失败:', textStatus, errorThrown);  
    }  
}  
  
// 封装 jQuery 的 $.ajax 方法的自定义请求函数  
function customAjax(options) {  
    // 合并默认选项和传入的选项  
    var settings = $.extend({  
        // 默认选项  
    }, options);  
  
    // 发送请求,并在 beforeSend 和 complete 中调用拦截器  
    return $.ajax(settings).done(function(data, textStatus, jqXHR) {  
        // 在这里可以处理成功后的逻辑,如果需要的话  
    }).fail(function(jqXHR, textStatus, errorThrown) {  
        // 在这里可以处理失败后的逻辑,如果需要的话  
    }).always(function(jqXHR, textStatus) {  
        // 始终执行的逻辑,如果需要的话  
    });  
}  
  
// 使用封装后的 customAjax 函数发送请求  
customAjax({  
    url: 'https://api.example.com/data',  
    type: 'GET',  
    beforeSend: function(jqXHR, settings) {  
        // 调用请求拦截器  
        requestInterceptor(jqXHR, settings);  
    },  
    complete: function(jqXHR, textStatus) {  
        // 调用响应拦截器  
        responseInterceptor(jqXHR, textStatus);  
    },  
    success: function(data) {  
        // 处理成功回调,如果需要的话  
    },  
    error: function(jqXHR, textStatus, errorThrown) {  
        // 处理错误回调,如果需要的话  
    }  
});

测试效果

我们写一个后端接口

@RestController
public class HelloWorldController {
    @Autowired
    private TgService tgService;
    @CrossOrigin("*")
    @RequestMapping( "/hello")
    String hello(){
        return "Hello World";
    }

    @RequestMapping("/tg")
    void tg(){
        tgService.sayHello();
    }

}

我们写一个index.html 来测试结果

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="http.js"></script>
</head>
<body>

</body>
<script type="application/javascript" src="http.js"></script>
<script>
    function $(n) {
        return document.getElementById(n);
    }
    customFetch('http://localhost:8080/hello', {
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        },
        mode: 'cors'
    })
        .then(data => {
            // 使用返回的数据
            console.log(data);
        })
        .catch(error => {
            // 处理错误
        });
</script>
</html>

效果图

开启后端服务

打开我们的F12

 这里我们可以看到请求已经通了

 

为什么会有两次请求呢? 

当涉及到HTTP请求时,preflight(预检)请求通常指的是一个OPTIONS请求,它在跨域资源共享(CORS)机制中用于检查实际请求是否可以被服务器接受。预检请求是在实际的跨域请求(如GET、POST等)之前发送的,以获取服务器对跨域请求的支持情况。

预检请求的主要目的是:

  1. 检查请求的方法:确定服务器是否允许即将进行的实际请求方法(如GET、POST、PUT等)。
  2. 检查请求头:确定服务器是否允许实际请求中包含的特定HTTP头。
  3. 检查请求的源:确定请求的源(即发送请求的域名)是否有权限访问目标资源。

如果预检请求成功(即服务器返回了允许跨域请求的响应头),则浏览器会发送实际的跨域请求。如果预检请求失败,则浏览器不会发送实际的跨域请求。

预检请求的响应头中通常会包含一些CORS相关的字段,如Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers等,这些字段用于指示服务器对跨域请求的支持情况。

结尾

快乐的时光总是那么短暂!!

又到了说see you !!的时候了

如果还没看够的话!想学习相关的技术知识!!

三年全栈老司机带你上高速,不迷路。

欢迎点赞,评论,收藏三连!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指针知识大礼包,让你的编程之路更顺畅(四)

1. 回调函数是什么&#xff1f; 2. qsort使⽤举例 3. qsort函数的模拟实现 4. sizeof和strlen的对⽐ 5. 数组和指针笔试题解析 6. 指针运算笔试题解析 正文开始&#xff1a; 1. 回调函数是什么&#xff1f; 回调函数就是⼀个通过 函数指针 调⽤的函数。 如果你把函数的…

【JavaSE】一维数组和二维数组详解

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 一维数组 基本语法 初始化 遍历和打印 数组是引用型变量 基本类型变量与引用类型变量的区别 null 数组传参和返回 总结 二维数组 基本语法 初始化 遍历和打印 一维数组…

动态表情包怎么制作?超简单的gif动画制作方法

动态gif表情包非常的收大众欢迎&#xff0c;小编也不例外。日常聊天斗图中都少不了它们的存在&#xff0c;gif表情包能够调节聊天的氛围。那么&#xff0c;这种gif表情包是怎么做的呢&#xff1f;下面就跟着小编一起来看看制作gif动画图片的方法&#xff0c;不需要下载任何软件…

基于GA遗传优化的离散交通网络双层规划模型设计matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于GA遗传优化的离散交通网络双层规划模型设计.优化输出路段1和路段2的收费情况收敛过程。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序…

独家原创!TCN-BiGRU-Attention一键实现西储大学故障诊断与讲解!附带处理好的Excel故障诊断数据集!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 数据介绍与故障诊断讲解 1.数据预处理 2.特…

【Python】基础语法(1)

目 录 一.常量和表达式二.变量和类型变量是什么变量的语法(1) 定义变量(2) 使用变量 变量的类型(1) 整数(2) 浮点数(小数)(3) 字符串(4) 布尔(5) 其他 为什么要有这么多类型?动态类型特性 三.注释注释是什么注释的语法(1) 注释行(2) 文档字符串 注释的规范 四.输入输出和用户交…

Android熄屏/亮屏,旋转屏幕/横竖屏切换生命周期变化与activity销毁重建

Android熄屏/亮屏&#xff0c;旋转屏幕/横竖屏切换生命周期变化与activity销毁重建 1、熄屏/亮屏 熄屏后&#xff0c;Android生命周期走&#xff1a; onPause onStop 接着点亮Android手机屏幕&#xff0c;生命周期走&#xff1a; onRestart onStart onResume 2、旋转屏幕&…

JavaScript动态渲染页爬取——Playwright的使用

Playwright的使用 Playwright是微软在2020年年初开源的新一代自动化测试工具&#xff0c;其功能和Selenium、Pyppeteer等类似&#xff0c;都可以驱动浏览器进行各种自动化操作。Playwright对市面上的主流浏览器都提供了支持&#xff0c;API功能简洁又强大&#xff0c;虽然诞生…

nginx界面管理工具之nginxWebUI 搭建与使用

nginx界面管理工具之nginxWebUI 搭建与使用 一、nginxWebUI 1.nginx网页配置工具 官网地址: http://www.nginxwebui.cn 源码地址&#xff1a;https://git.chihiro.org.cn/chihiro/nginxWebUI 2.功能说明 本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, tcp协议…

EXCEL VBA将word里面的指定的关键词替换掉后并标记红色字体

EXCEL VBA将word里面的指定的关键词替换掉后并标记红色字体 Sub 开关() Call 新建副本 Call ReplaceAndHighlightInFolder End Sub Sub 新建副本()fpath ThisWorkbook.Path & "\"Dim MyFile As ObjectSet MyFile CreateObject("Scripting.FileSystemObjec…

FireWorks:加速科学计算和工作流程的强大工具

FireWorks&#xff1a;加速科学计算和工作流程的强大工具 FireWorks是一个功能强大的开源工具&#xff0c;旨在简化和加速科学计算和工作流程。它提供了一个灵活的编排框架&#xff0c;使研究人员和工程师能够高效地设计、管理和执行复杂的计算任务和工作流。本文将深入探讨Fir…

Hadoop安装部署-DataNode集群版

Hahoop分布式文件系统支持DataNode节点的大规模扩展&#xff0c;本文主要描述DataNode集群版的安装部署。 如上所示&#xff0c;Hadoop分布式文件系统中每个文件是以数据块的方式存储在不同的DataNode中&#xff0c;每个数据块都支持高可用性&#xff0c;当其中一个数据块对应的…

vue watch 深度监听

vue2文档&#xff1a;API — Vue.js vue3文档&#xff1a;侦听器 | Vue.js watch 可以用来监听页面中的数据&#xff0c;但如果监听的源是对象或数组&#xff0c;则使用深度监听&#xff0c;强制深度遍历源&#xff0c;以便在深度变更时触发回调。 一&#xff0c;监听 <t…

项目管理—项目合同签订后客户又不认了

大家好&#xff0c;我是不会魔法的兔子&#xff0c;是一名执业律师&#xff0c;创建[项目管理者的法小院儿]&#xff0c;持续从法律的角度分享项目管理中的风险及预防问题&#xff0c;让项目管理者能够提早发现与解决项目执行过程中的风险&#xff0c;同时欢迎大家一起交流&…

从快递公司内部辞职的快递员才告诉你的寄快递的真相!

我们知道现在寄快递有很多种方法&#xff0c;但是每种方法也都花费不少&#xff0c;但是我们知道最省钱的寄快递的方法吗&#xff1f;别急&#xff0c;小编了解到快递员告诉我许多快递物流的真相。我们寄快递无非就是去快递驿站寄快递&#xff0c;然后称重&#xff0c;然后计算…

七大 QC 工具图的定义与示例(看这篇就够了)

前言 七大 QC 工具图是通过数值的方式进行数据分析的工具&#xff0c;分别是鱼骨图、直方图、柏拉图、散布图、管制图、检查图和层别图。其实&#xff0c;我们在日常生活与工作中经常看到它们&#xff0c;只是样子和名字对不上而已&#xff0c;今天写这篇文章就是为了帮助自己…

蓝桥杯单片机---第十届省赛题目解析

文章目录 比赛题目一、代码相关定义、声明1.头文件声明2.变量声明 二、主要函数1.main函数2.按键扫描3.数码管显示4.LED显示5.定时器中断 三、次要函数1.初始化函数Init2.按键函数Key3.LED函数Led4.数码管函数Seg5.iic函数中6.onewire函数中 总结 比赛题目 这里因为我没有这个题…

如何搭建属于自己的Docker私有仓库

华子目录 Docker registry仓库介绍分类registry组成&#xff08;repository和index&#xff09;Repositoryindex 拉取上床仓库镜像拉取上传 知名docker仓库在docker hub商创建自己的docker registry将镜像上传到自己的registry从registry仓库中拉取镜像 搭建私有仓库Distributi…

备战蓝桥杯---树学初步1

LCA&#xff08;最近公共祖先&#xff09; 定义&#xff1a;有根树的两个节点u,v&#xff0c;他们的LCA是一个节点x,其中x是他们的公共祖先并且X的深度尽可能大。 法1---Tarjan算法&#xff1a; 核心&#xff1a;DFS并查集 在并查集中建立仅有u的集合&#xff0c;设该集合祖…

Redis入门到实战-第十三弹

Redis入门到实战 Redis中JSON数据类型常见操作官网地址Redis概述JSON常见操作更新计划 Redis中JSON数据类型常见操作 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是…