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

news2025/5/19 0:32:05

目录

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 请求,示例代码如下:

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

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

相关文章

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

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

java并发编程-并发容器

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

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

PPT助手&#xff1a;一款集计时、远程控制与多屏切换于一身的PPT辅助工具 &#x1f4dd;&#x1f3a4; 在现代化的演讲和演示中&#xff0c;如何高效地控制PPT进程、保证展示的流畅性与精准性&#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 、遥控玩具 …

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协议及…

通过 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;从图像中选取某…

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

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

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

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

video标签播放mp4格式视频只有声音没有图像的问题

video标签播放mp4格式视频只有声音没有图像的问题 这是由于视频格式是hevc(H265)编码的&#xff0c;这种编码格式视频video播放有问题主要是由于以下两种原因导致的&#xff1a; 1、浏览器没有开启硬加速模式&#xff1a; 开启方法&#xff08;以谷歌浏览器为例&#xff09;&a…

解决docker部署的容器第二天访问报错139的问题

前阵子我部署项目&#xff0c;把数据库放宿主机上&#xff0c;结果电脑一重启&#xff0c;Docker 直接把数据库删了个精光&#xff01;我当时的表情 be like &#x1f631;&#xff1a;"我的数据呢&#xff1f;&#xff1f;&#xff1f;" 连备份都没来得及做&#xf…

如何对接银行卡二要素核验接口?

银行卡二要素核验接口是一种通过API&#xff08;应用程序编程接口&#xff09;实现对用户提供的银行卡信息进行基本身份验证的技术服务&#xff0c;主要用于核验银行卡号与持卡人姓名是否一致&#xff0c;从而确认用户身份的真实性和操作合法性。 银行卡二要素核验接口通过调用…

深度学习——深入解读各种卷积的应用场景优劣势与实现细节

前言 卷积操作在深度学习领域中占据着核心地位&#xff0c;其在多种神经网络架构中发挥着关键作用。然而&#xff0c;卷积的种类繁多&#xff0c;每种卷积都有其独特的定义、应用场景和优势。 对于那些对深度学习中不同卷积类型&#xff08;例如 2D 卷积、3D 卷积、11 卷积、转…

Pyinstaller 打包flask_socketio为exe程序后出现:ValueError: Invalid async_mode specified

Pyinstaller 打包flask_socketio为exe程序后出现&#xff1a;ValueError: Invalid async_mode specified 一、详细描述问题描述 Traceback (most recent call last): File "app_3.py", line 22, in <module> File "flask_socketio\__init__.py"…