当前位置: 首页 > article >正文

Express学习笔记(三)——使用 Express 写接口

目录

1. 创建基本的服务器

2. 创建 API 路由模块

3. 编写 GET 接口

4. 编写 POST 接口

5. CORS 跨域资源共享

5.1 接口的跨域问题

5.2 使用 cors 中间件解决跨域问题

5.3 什么是 CORS

5.4 CORS 的注意事项

5.5 CORS 响应头部 - Access-Control-Allow-Origin

5.6 CORS 响应头部 - Access-Control-Allow-Headers

5.7 CORS 响应头部 - Access-Control-Allow-Methods

5.8 CORS请求的分类

5.9 简单请求

5.10 预检请求

5.11 简单请求和预检请求的区别

6. JSONP 接口

6.1 回顾 JSONP 的概念与特点

6.2 创建 JSONP 接口的注意事项

6.3 实现 JSONP 接口的步骤

6.4 实现 JSONP 接口的具体代码

6.5 在网页中使用 jQuery 发起 JSONP 请求


1. 创建基本的服务器

2. 创建 API 路由模块

3. 编写 GET 接口

4. 编写 POST 接口

注意:
  • 如果要获取 URL-encoded 格式的请求体数据,必须配置中间件 app.use(express.urlencoded({ extended: false }))

5. CORS 跨域资源共享

5.1 接口的跨域问题

刚才编写的 GET 和 POST接口,存在一个很严重的问题: 不支持跨域请求
解决接口跨域问题的方案主要有两种:
  • CORS(主流的解决方案,推荐使用
  • JSONP(有缺陷的解决方案:只支持 GET 请求)

5.2 使用 cors 中间件解决跨域问题

cors 是 Express 的一个第三方中间件。通过安装和配置 cors 中间件,可以很方便地解决跨域问题。
使用步骤分为如下 3 步:
  • ① 运行 npm install cors 安装中间件
  • ② 使用 const cors = require('cors') 导入中间件
  • ③ 在路由之前调用 app.use(cors()) 配置中间件

router.js模块:

// 路由模块
const express = require('express')
const apiRouter = express.Router()// 在这里挂载对应的路由
// 定义 get 接口
apiRouter.get('/get', (req, res) => {// 通过 req.query 获取客户端通过查询字符串,发送到服务器的数据const query = req.query// 调用 res.send() 方法,向客户端响应处理的结果res.send({status: 0, // 0 表示处理成功,1 表示处理失败msg: 'GET请求成功', //状态的描述data: query // 需要响应给客户端的数据})
})// 定义 post 接口
apiRouter.post('/post', (req, res) => {// 1. 通过 req.body 获取请求体中包含的 url-encoded 格式的数据const body = req.body// 2. 调用 res.send() 方法,向客户端响应结果res.send({status: 0,msg: 'POST请求成功',data: body})
})// 定义 DELETE 接口
apiRouter.delete('/delete', (req, res) => {res.send({status: 0,msg: 'DELETE请求成功'})
})// 导出路由
module.exports = apiRouter

app.js模块:

// 导入 express 模块
const express = require('express')
// 导入路由
const apiRouter = require('./21-router.js')// 创建 express 服务器实例
const app = express()// 配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))// 一定要在路由之前,配置 cors 这个中间件,从而解决接口跨域问题
const cors = require('cors')
app.use(cors())// 注册路由
app.use('/api', apiRouter)// 调用 app.listen() 方法,指定端口号并且启动服务器
app.listen(80, () => {console.log('express server is running at http://127.0.0.1')
})

5.3 什么是 CORS

  • CORS (Cross-Origin Resource Sharing,跨域资源共享)由一系列 HTTP 响应头组成,这些 HTTP 响应头决定浏览器是否阻止前端 JS 代码跨域获取资源

  • 浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如果接口服务器配置了 CORS 相关的 HTTP 响应头,就可以解除浏览器端的跨域访问限制

5.4 CORS 的注意事项

  • ① CORS 主要在服务器端进行配置。客户端浏览器无须做任何额外的配置,即可请求开启了 CORS 的接口。
  • ② CORS 在浏览器中有兼容性。只有支持 XMLHttpRequest Level2 的浏览器,才能正常访问开启了 CORS 的服务端接口(例如:IE10+、Chrome4+、FireFox3.5+)。

5.5 CORS 响应头部 - Access-Control-Allow-Origin

响应头部中可以携带一个 Access-Control-Allow-Origin 字段,其语法如下:
其中,origin 参数的值指定了 允许访问该资源的外域 URL
例如,下面的字段值将 只允许 来自 http://itcast.cn 的请求:
如果指定了 Access-Control-Allow-Origin 字段的值为 通配符 * ,表示允许来自任何域的请求,示例代码如下:

5.6 CORS 响应头部 - Access-Control-Allow-Headers

默认情况下,CORS 支持 客户端向服务器 发送如下的 9 个 请求头
  • Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width、Content-Type (值仅限于 text/plain、multipart/form-data、application/x-www-form-urlencoded 三者之一)
如果客户端向服务器 发送了额外的请求头信息 ,则需要在 服务器端 ,通过 Access-Control-Allow-Headers 对额外的请求头进行声明 ,否则这次请求会失败!

5.7 CORS 响应头部 - Access-Control-Allow-Methods

默认情况下,CORS 仅支持客户端发起 GET、POST、HEAD 请求。
如果客户端希望通过 PUT DELETE 等方式请求服务器的资源,则需要在服务器端,通过 Access-Control-Alow-Methods 来 指明实际请求所允许使用的 HTTP 方法
示例代码如下:

5.8 CORS请求的分类

客户端在请求 CORS 接口时,根据 请求方式 请求头 的不同,可以将 CORS 的请求分为 两大类 ,分别是:
  • ① 简单请求
  • ② 预检请求

5.9 简单请求

同时满足以下两大条件的请求,就属于简单请求:
  • 请求方式
    • GET、POST、HEAD 三者之一
  • HTTP 头部信息不超过以下几种字段:
    • 无自定义头部字段、Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type(只有三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)

5.10 预检请求

只要符合以下任何一个条件的请求,都需要进行预检请求:
  • ① 请求方式为 GET、POST、HEAD 之外的请求 Method 类型
  • ② 请求头中包含自定义头部字段
  • ③ 向服务器发送了 application/json 格式的数据
在浏览器与服务器正式通信之前,浏览器会 先发送 OPTION 请求进行预检,以获知服务器是否允许该实际请求 ,所以这一次的 OPTION 请求称为“预检请求”。 服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据

5.11 简单请求预检请求的区别

简单请求的特点
  • 客户端与服务器之间只会发生一次请求
预检请求的特点
  • 客户端与服务器之间会发生两次请求,OPTION 预检请求成功之后,才会发起真正的请求

6. JSONP 接口

6.1 回顾 JSONP 的概念特点

概念
  • 浏览器端通过 <script> 标签的 src 属性,请求服务器上的数据,同时,服务器返回一个函数的调用。这种请求数据的方式叫做 JSONP。
特点
  • ① JSONP 不属于真正的 Ajax 请求,因为它没有使用 XMLHttpRequest 这个对象。
  • ② JSONP 仅支持 GET 请求,不支持 POST、PUT、DELETE 等请求。

6.2 创建 JSONP 接口的注意事项

如果项目中 已经配置了 CORS 跨域资源共享,为了 防止冲突 必须在配置 CORS 中间件之前声明 JSONP 的接口 。否则JSONP 接口会被处理成开启了 CORS 的接口。示例代码如下:

6.3 实现 JSONP 接口的步骤

① 获取 客户端发送过来的 回调函数的名字
② 得到要 通过 JSONP 形式 发送给客户端的数据
③ 根据前两步得到的数据, 拼接出一个函数调用的字符串
④ 把上一步拼接得到的字符串,响应给客户端的 <script> 标签进行解析执行

6.4 实现 JSONP 接口的具体代码

6.5 在网页中使用 jQuery 发起 JSONP 请求

调用 $.ajax() 函数, 提供 JSONP 的配置选项 ,从而发起 JSONP 请求,示例代码如下:

相关文章:

Express学习笔记(三)——使用 Express 写接口

目录 1. 创建基本的服务器 2. 创建 API 路由模块 3. 编写 GET 接口 4. 编写 POST 接口 5. CORS 跨域资源共享 5.1 接口的跨域问题 5.2 使用 cors 中间件解决跨域问题 5.3 什么是 CORS 5.4 CORS 的注意事项 5.5 CORS 响应头部 - Access-Control-Allow-Origin 5.6 COR…...

透视飞鹤2024财报:如何打赢奶粉罐里的科技战?

去年乳制品行业压力还是不小的&#xff0c;尼尔森IQ指出2024年国内乳品市场仍处在收缩区间。但是&#xff0c;总有龙头能抗住压力&#xff0c;飞鹤最近交出的2024财报中就有很多亮点。 比如&#xff0c;2024年飞鹤营收207.5亿元、同比增长6%&#xff0c;净利润36.5亿元&#x…...

【HarmonyOS Next之旅】DevEco Studio使用指南(十)

目录 1 -> Optimize Imports功能 2 -> 父/子类快速跳转 3 -> 查看接口/类的层次结构 4 -> 代码自动补全 1 -> Optimize Imports功能 使用编辑器提供的Optimize Imports&#xff0c;可以快速清除未使用的import&#xff0c;并根据设置的规则对import进行合并…...

数据框的添加

在地图制图中&#xff0c;地图全图显示的同时希望也能够显示局部放大图&#xff0c;以方便查看地物空间位置的同时&#xff0c;也能查看地物具体的相对位置。例如&#xff0c;在一个名为airport的数据集全图制图过程中&#xff0c;希望能附上机场区域范围的局部地图&#xff0c…...

java并发编程-并发容器

并发容器 CopyOnWriteArrayListCopyOnWriteArraySetConcurrentHashMapConcurrentSkipListMap迭代器的fail-fast与fail-safe机制应用场景 CopyOnWriteArrayList 线程不安全容器&#xff1a;ArrayList代替Vector、synchronizedList适用于读多写少的场景&#xff0c;对读操作不加…...

【3.软件工程】3.2 瀑布模型

瀑布模型全解析&#xff1a;从理论到实践的经典软件开发框架 &#x1f30a; 一、瀑布模型核心流程图 #mermaid-svg-87uBSLYlWEdrgikJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-87uBSLYlWEdrgikJ .error-icon{…...

使用 PyTorch 的 `torch.rot90` 进行张量旋转:数据增强的利器

使用 PyTorch 的 torch.rot90 进行张量旋转:数据增强的利器 在深度学习和计算机视觉领域,数据增强是一项至关重要的技术。通过对训练数据进行各种变换,如旋转、翻转、裁剪等,我们可以增加数据的多样性,从而提高模型的泛化能力。PyTorch 提供的 torch.rot90 函数是一个简单…...

数据一体化/数据集成对于企业数据架构的重要性

在数字化时代&#xff0c;企业的核心竞争力已经从传统的资源和规模优势转向数据驱动的智能化能力。数据一体化作为信息化发展的核心趋势&#xff0c;不仅是技术升级的必然选择&#xff0c;更是企业实现数字化转型的关键路径。 一、数据一体化/数据集成&#xff1a;数字化转型的…...

PPT助手:一款集计时、远程控制与多屏切换于一身的PPT辅助工具

PPT助手&#xff1a;一款集计时、远程控制与多屏切换于一身的PPT辅助工具 &#x1f4dd;&#x1f3a4; 在现代化的演讲和演示中&#xff0c;如何高效地控制PPT进程、保证展示的流畅性与精准性&#xff0c;成为了每个演讲者必须面对的挑战。无论是商务汇报、学术演讲&#xff0…...

Oracle中的UNION原理

Oracle中的UNION操作用于合并多个SELECT语句的结果集&#xff0c;并自动去除重复行。其核心原理可分为以下几个步骤&#xff1a; 1. 执行各个子查询 每个SELECT语句独立执行&#xff0c;生成各自的结果集。 如果子查询包含过滤条件&#xff08;如WHERE&#xff09;、排序&…...

算法设计学习7

实验目的及要求&#xff1a; 目标是通过实验深入理解堆栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;这两种常见的数据结构&#xff0c;掌握它们的基本操作及应用场景&#xff0c;提高对数据结构的认识和应用能力。通过本实验&#xff0c;学生将深化对堆…...

AF3 OpenFoldDataset类解读

AlphaFold3 data_modules 模块的 OpenFoldDataset 类是一个自定义的数据集类,继承自 torch.utils.data.Dataset。它的目的是在训练时实现 随机过滤器(stochastic filters),用于从多个不同的数据集(OpenFoldSingleDataset 或 OpenFoldSingleMultimerDataset)中进行样本选择…...

大数据(4)Hive数仓三大核心特性解剖:面向主题性、集成性、非易失性如何重塑企业数据价值?

目录 背景&#xff1a;企业数据治理的困境与破局一、Hive数据仓库核心特性深度解析1. ‌面向主题性&#xff08;Subject-Oriented&#xff09;&#xff1a;从业务视角重构数据‌2. ‌集成性&#xff08;Integrated&#xff09;&#xff1a;打破数据孤岛的统一视图‌3. ‌非易失…...

AI模拟了一场5亿年的进化

蛋白质是生命的基石。从驱动肌肉运动的分子引擎&#xff0c;到捕捉光能的光合作用机器&#xff0c;再到细胞内的信息处理系统&#xff0c;这些功能复杂的分子贯穿了生命的每一个环节。尽管科学界早已解析了蛋白质的化学结构&#xff0c;但蛋白质的设计逻辑于人类而言&#xff0…...

大模型应用初学指南

随着人工智能技术的快速发展&#xff0c;检索增强生成&#xff08;RAG&#xff09;作为一种结合检索与生成的创新技术&#xff0c;正在重新定义信息检索的方式&#xff0c;RAG 的核心原理及其在实际应用中的挑战与解决方案&#xff0c;通用大模型在知识局限性、幻觉问题和数据安…...

如何通过管理系统提升团队协作效率

在现代企业管理中&#xff0c;团队协作效率的高低直接关系到企业的竞争力和运营效率。随着信息技术的不断发展&#xff0c;管理系统作为提升团队协作效率的重要工具&#xff0c;逐渐受到企业的重视。本文将深入探讨如何通过管理系统提升团队协作效率&#xff0c;为企业提供实用…...

云手机如何防止设备指纹被篡改

云手机如何防止设备指纹被篡改 云手机作为虚拟化设备&#xff0c;其设备指纹的防篡改能力直接关系到账户安全、反欺诈和隐私保护。以下以亚矩阵云手机为例&#xff0c;讲解云手机防止设备指纹被篡改的核心技术及实现方式&#xff1a; 系统层加固&#xff1a;硬件级安全防护 1…...

XT1870 同步升压 DC-DC 变换器

1、 产品概述 XT1870 系列产品是一款低功耗、高效率、低纹波、工 作频率高的 PFM 控制升压 DC-DC 变换器。 XT1870 系列产品仅需要 3 个外部元器 , 即可完成低输 入的电池电压输入。 2、用途 数码相机、电子词典 LED 手电筒、 LED 灯 血压计、MP3 、遥控玩具 …...

Sentinel实战(一)、1、sentinel介绍、安装及初始化服务监控

spring cloud Alibaba -Sentinel、sentinel介绍、安装及初始化服务监控 一、Sentinel简单了解一)、Sentinel基本概念二)、Sentinel设计理念1、流量控制2、熔断降级1)、什么是熔断降级2)、熔断降级的设计理念3、系统负载保护三)、Sentinel工作机制二、Sentinel服务安装一)…...

如何重构前端项目

重构前端项目是指对现有的前端代码进行重新设计和改造&#xff0c;以提高代码质量、可维护性、可扩展性和性能。 重构前端项目的一般步骤: 1.评估项目: 了解项目的规模、复杂度、技术栈和现有的问题和挑战&#xff0c;以及重构的目标和范围。 2.制定计划: 制定一个详细的计划…...

seaweedfs分布式文件系统

seaweedfs https://github.com/seaweedfs/seaweedfs.git go mod tidy go -o bin ./… seaweed占不支持smb服务&#xff0c;只能用fuse的方式mount到本地文件系统 weed master 默认端口&#xff1a;9333&#xff0c;支持浏览器访问 weed volume 默认端口&#xff1a;8080 weed …...

Spring Boot后端开发全攻略:核心概念与实战指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、全栈领域优质创作者、高级开发工程师、高级信息系统项目管理师、系统架构师&#xff0c;数学与应用数学专业&#xff0c;10年以上多种混合语言开发经验&#xff0c;从事DICOM医学影像开发领域多年&#xff0c;熟悉DICOM协议及…...

PostgreSQL pg_repack 重新组织表并释放表空间

pg_repack pg_repack是 PostgreSQL 的一个扩展&#xff0c;它允许您从表和索引中删除膨胀&#xff0c;并可选择恢复聚集索引的物理顺序。与CLUSTER和VACUUM FULL不同&#xff0c;它可以在线工作&#xff0c;在处理过程中无需对已处理的表保持独占锁定。pg_repack 启动效率高&a…...

通过 Markdown 改进 RAG 文档处理

通过 Markdown 改进 RAG 文档处理 作者&#xff1a;Tableau 原文地址&#xff1a;https://zhuanlan.zhihu.com/p/29139791931 通过 Markdown 改进 RAG 文档处理https://mp.weixin.qq.com/s/LOBOKNA71dANXHuwxe7yxw 如何将 PDF 转换为 Markdown 以获得更好的 LLM RAG 结果 Mar…...

高速电路 PCB 设计要点一

3 高速电路 PCB 设计要点 3.1 PCB设计与信号完整性 随着电子技术的发展&#xff0c;电路的规模越来越大&#xff0c;单个器件集成的功能越来越多&#xff0c;速率越来越高&#xff0c;而器件的尺寸越来越小。由于器件尺寸的减小&#xff0c;器件引脚信号变化沿的速率变得越来…...

【Centos】centos7内核升级-亲测有效

相关资源 通过网盘分享的文件&#xff1a;脚本升级 链接: https://pan.baidu.com/s/1yrCnflT-xWhAPVQRx8_YUg?pwd52xy 提取码: 52xy –来自百度网盘超级会员v5的分享 使用教程 将脚本文件上传到服务器的一个目录 执行更新命令 yum install -y linux-firmware执行脚本即可 …...

Opencv计算机视觉编程攻略-第八节 检测兴趣点

目录 1.检测图像中的角点 2.快速检测特征 3.尺度不变特征的检测 4.多尺度FAST 特征的检测 在计算机视觉领域&#xff0c;兴趣点&#xff08;也称关键点或特征点&#xff09;应用包括目标识别、图像配准、视觉跟踪、三维重建等。这个概念的原理是&#xff0c;从图像中选取某…...

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays论文阅读

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays 1. 论文的研究目标与实际问题意义1.1 研究目标1.2 解决的实际问题1.3 实际意义2. 论文提出的新方法、模型与公式2.1 核心创新:标量化近似表达式关键推导步骤:公式优势:2.2 与经典方法的对比传统方…...

基于微信小程序的医院挂号预约系统设计与实现

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大…...

如何保障话费api接口的稳定性?

保障话费接口的稳定性是确保服务高效运行的关键。以下是基于最新信息的建议&#xff1a; 1. 选择可靠的API服务提供商 信誉和稳定性&#xff1a;选择有良好声誉和稳定服务记录的提供商&#xff0c;查看其服务水平协议&#xff08;SLA&#xff09;以确保高可用性。技术支持&…...