express接口

news2024/10/6 12:24:08

文章目录

    • 什么是接口
    • 创建 API 路由模块
    • 编写 GET 接口
    • 编写 POST 接口
    • 完整代码
    • CORS 跨域资源共享
      • 使用 CORS 中间件解决跨域问题
      • 实现 JSONP 接口

什么是接口

API (Application Programming Interface,应用程序编程接口 ) 是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。API除了有应用“应用程序接口”的意思外,还特指 API的说明文档,也称为帮助文档。

创建 API 路由模块

创建 API 路由模块的方法十分简单,和之前创建自定义模块的方法几乎一样。

const express = require('express')
const router = express.Router()
module.exports = router

然后我们在 test.js 中注册路由:

const express = require('express')
const apiRouter = require('./apiRouter')
const app = express()
app.use('/api',apiRouter)
app.listen(80,()=>{
	console.log('Express server running at http://127.0.0.1')
})

这样我们就可以直接在 API 路由模块中写相应的路由,然后在 test.js 中调用即可。

编写 GET 接口

我们直接在 API 路由模块中编写路由代码。

// 定义 GET 接口
router.get('/get', (req, res) => {
	// 调用 res.send() 方法,向客户端响应处理的结果
	res.send({
		status: 0,				// 0 表示处理成功,1 表示处理失败
		msg: 'GET 请求成功!',	// 状态的描述
		data: req.query			// 通过 req.query 来获取客户端通过查询字符串发送到服务器的数据
	})
})

在这里插入图片描述

编写 POST 接口

和上面一样,我们直接在 API 接口中编写路由代码

//定义 POST 接口
router.post('/post', (req, res) => {
	// 调用 res.send() 方法,向客户端响应结果
	res.send({
		status:0,
		msg: 'POST 请求成功',
		data:req.body // 通过 req.body 获取请求体包含的 url-encoded 格式的数据
	})
})

然后还需要在 test.js 中配置一段代码

//配置解析表单数据的中间件
app.use(express.urlencoded({extended:false}))

完整代码

apiRouter.js

const express = require('express')
const router = express.Router()
// 定义 GET 接口
router.get('/get', (req, res) => {
	// 调用 res.send() 方法,向客户端响应处理的结果
	res.send({
		status: 0,				// 0 表示处理成功,1 表示处理失败
		msg: 'GET 请求成功!',	// 状态的描述
		data: req.query			// 通过 req.query 来获取客户端通过查询字符串发送到服务器的数据
	})
})
//定义 POST 接口
router.post('/post', (req, res) => {
	// 调用 res.send() 方法,向客户端响应结果
	res.send({
		status:0,
		msg: 'POST 请求成功',
		data:req.body // 通过 req.body 获取请求体包含的 url-encoded 格式的数据
	})
})
//向外暴露
module.exports = router

test.js

const express = require('express')
const router = require('./apiRouter')
const app = express()
//配置解析表单数据的中间件
app.use(express.urlencoded({extended: false}))
app.use('/api', router)
app.listen(80, () => {
	console.log('Express server running at http://127.0.0.1')
})

CORS 跨域资源共享

刚刚编写的 GET 和 POST 接口,存在一个很严重的问题:不支持跨域请求。
先来简单介绍一下跨域请求:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 +域名 + 端口号均相同,那么就是同域。

解决接口跨域问题的方案主要有两种:

  1. CORS(主流的解决方案,推荐使用)
  2. JSONP(有缺陷的解决方案,只能支持 GET 请求)

使用 CORS 中间件解决跨域问题

CORS 是 Express 的一个第三方中间件。通过安装和配置 CORS 中间件,可以很方便地解决跨域问题。使用步骤分为如下 3 步:

  1. 运行 npm install cors 安装中间件
  2. 使用 const cors = require(‘cors’) 导入中间件
  3. 在路由之前调用 app.use(cors()) 配置中间件

安装完 CORS 中间件之后,在 test.js 路由之前导入并配置 CORS 中间件,其代码如下:

// 一定要在路由之前配置 cors 这个中间件,从而解决接口跨域的问题
const cors = require('cors')
app.use(cors())

实现 JSONP 接口

步骤如下:

  1. 获取客户端发送过来的回调函数的名字
  2. 得到要通过 JSONP 形式发送给客户端的数据
  3. 根据前两步得到的数据,拼接出一个函数调用的字符串
  4. 把上一步拼接得到的字符串响应给客户端的
//必须在配置 cors 中间件之前,配置 JSONP 的接口
app.get('/api/jsonp', (req, res) => {
	// TODO:定义 JSONP 接口具体的实现过程
	// 1、获取客户端发送过来的回调函数的名字
	const funcName = req.query.callback
	// 2、得到要通过 JSONP 形式发送给客户端的数据
	const data = {name: 'zs', age: 20}
	// 3、根据前两步得到的数据,拼接出一个函数调用的字符串
	const scripStr = `${funcName}(${JSON.stringify(data)})`
	// 4、把上一步拼接得到的字符串响应给客户端
	res.send(scripStr)
})

接下来我们就可以在 html 中调用 $.ajax() ,提供 JSONP 的配置选项来发起 JSONP 请求,其代码如下:

<body>
	<button id="btnJSONP">JSONP</button>
	<script>
		//为 JSONP 按钮绑定点击事件处理函数
		$('#btnJSONP').on('click', function() {
			$.ajax({
				type: 'GET',
				url: 'http://127.0.0.1/api/JSONP',
				dataType: 'jsonp',
				success:function(res) {
					console.log(res)
				}
			})
		})
	</script>
</body>

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

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

相关文章

TCP/IP 网络模型有哪几层

备注&#xff1a;本文参考小林coding相关内容&#xff0c;侵权请联系作者删除 1.应用层 最上层的&#xff0c;也是我们能直接接触到的就是应用层&#xff08;Application Layer&#xff09;&#xff0c;我们电脑或手机使用的应用软件都是在应用层实现。那么&#xff0c;当两个…

高并发系统设计 -- 登录系统设计

同源策略 同源策略是一种安全策略。是游览器最核心最基本的安全功能。防止XSS&#xff0c;CSFR等攻击具体表现是游览器在执行脚本之前&#xff0c;会判断脚本是否与打开的网页是同源的&#xff0c;也就是协议&#xff0c;域名&#xff0c;端口是否都相同&#xff0c;相同就是同…

记录--前端性能监控初步实战

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 在当下前后端分离的主流环境下&#xff0c;前端部分的优化变得越来越重要。为了提升前端的性能和用户体验&#xff0c;我觉得可能需要从三个维度采集数据进行分析。 前端埋点。通过埋点收集和统计…

SCRM与CRM的区别

当私域流量的概念兴起时&#xff0c;企业直接触达用户的场景也越来越丰富&#xff0c;SCRM形式的私域运营已然成为很多企业数字化转型布局的关键阵地。 前言 当私域流量的概念兴起时&#xff0c;企业直接触达用户的场景也越来越丰富&#xff0c;SCRM形式的私域运营已然成为很多…

服务器部署所有前后端分离项目

1、Linux服务器安装好jdk、mysql、redis、node 2、拉取最新代码 gitee仓库项目地址&#xff1a;https://gitee.com/y_project/RuoYi-Vue 拉取代码到本地 3、修改后端配置 3.1、修改系统内上传文件位置的配置&#xff1a; 默认是windows系统的配置&#xff0c;将此配置修改…

JMeter接口测试使用教程哪里有?

JMeter接口测试使用教程哪里有&#xff1f;接口测试是测试工程师的必备技能之一&#xff0c;运用JMeter工具一步步实现接口请求&#xff0c;数据参数化&#xff0c;断言等操作&#xff0c;通过常见的企业实际测试场景详解JMeter各项技术使用&#xff0c;最后结合Jenkins持续集成…

Django搭建个人博客Blog-Day01

创建虚拟环境虚拟环境相当于一个抽屉&#xff0c;在这个抽屉里面安装的任何软件&#xff0c;都不会影响到其他抽屉&#xff0c;所以利用虚拟环境就可以做到同时安装不同版本的第三方库&#xff0c;而互不影响。使用虚拟环境的目的是为了防止一些第三方库出现版本不兼容问题&…

c++11 标准模板(STL)(std::forward_list)(五)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

当我们在谈论DataOps时,我们到底在谈论什么

1. DataOps到底是什么&#xff1f; 伴随着全球数字化转型的高速发展&#xff0c;在云计算、物联网、5G、边缘计算、元宇宙等新技术的驱动下&#xff0c;数据爆炸的时代已经来临。IDC Global DataSphere显示&#xff0c;2021年&#xff0c;全球数据总量达到了84.5ZB&#xff0c…

Java多线程案例——阻塞队列(生产者消费者模型)

一&#xff0c;阻塞队列1.阻塞队列的概念和作用阻塞队列同数据结构中的队列一样都遵守“先进先出”的原则&#xff08;不了解队列相关知识的朋友请查看之前队列的博文&#xff1a;(6条消息) 栈和队列&#xff08;内附模拟实现代码&#xff09;_徐憨憨&#xff01;的博客-CSDN博…

功率放大模块如何选择(安泰功率放大器模块产品介绍)

功率放大器模块系列产品介绍 一、功率放大模块介绍 功率放大模块&#xff1a; 功率放大模块具有体积小&#xff0c;集成度高&#xff0c;使用方便&#xff0c;应用广泛等优点&#xff0c;凭借着输出频率广、输出电压高、输出功率大等特性&#xff0c;能够广泛应用在各种领域…

动态范围控制原理

DRC介绍 开门见山&#xff0c;动态范围的定义就是信号的最大幅值和最小幅值比值的对数(单位dB)&#xff0c; 动态范围会受到系统中各个环节的影响。例如同样是这段音乐&#xff0c;在一个40dB背景噪声的环境中播放&#xff0c;那么由于掩蔽效应等因素的影响&#xff0c;最终实际…

前端跳转第三方网页中间页

前端跳转安全提示 掘金跳转中间页背景介绍跳转过渡页的优点实现原理解析哈喽啊小伙伴们久等了 消失了有半年了 &#xff0c;因为个人工作原因没腾出时间给大家分享日常踩坑和特殊功能的讲解。不过这次我回来了就要好好分享了背景介绍 前端小伙伴一定知道CSDN 和 稀土掘金 两大…

Dev-C++下载安装详细教程

文章目录前言一、下载Dev-C二、安装Dev-C三、使用Dev-C打印HelloWorld总结前言 本文总结了关于Dev-C下载与安装的详细过程&#xff0c;并使用Dev-C打印了“Hello World!”。本篇博客面向C语言初学者&#xff0c;或者考研复试的学生使用&#xff0c;因为大部分学校的考研复试都使…

为什么 TCP 建立连接需要三次握手

TCP 协议是我们几乎每天都会接触到的网络协议&#xff0c;绝大多数网络连接的建立都是基于 TCP 协议的&#xff0c;学过计算机网络或者对 TCP 协议稍有了解的人都知道 —— 使用 TCP 协议建立连接需要经过三次握手&#xff08;three-way handshake&#xff09;。 如果让我们简…

多线程案例-线程池

1.什么是线程池线程存在的意义是当使用进程进行并发编程太重了,此时引入了一个"轻量级的"进程-线程.创建线程比创建进程更高效,销毁线程比销毁进程更高效,调度线程比调度进程更高效..此时我们就用多线程来代替进程进行并发编程了,但是随着对性能的要求的提高,线程相对…

大数据必学Java基础(一百一十八):什么是Maven和它的下载整合

文章目录 什么是Maven和它的下载整合 一、什么是Maven 二、IDEA默认整合了Maven 三、下载地址

【Linux】RHEL8 中nmcli使用,必备!

redhat8中nmcli日常使用 第 2 章 配置以太网连接 Red Hat Enterprise Linux 为管理员提供不同的选项来配置以太网连接。例如&#xff1a; 在命令行中使用 nmcli 配置连接。使用 nmtui 在基于文本的用户界面中配置连接。使用 RHEL 系统角色在一个或多个主机上自动配置连接。使…

电脑小问题:定时关机的设置

设置定时关机生活中&#xff0c;我们有时候需要对电脑进行定时关机。那么&#xff0c;如何设置定时关机呢&#xff1f;步骤如下&#xff1a; 1. 按 win R &#xff0c;弹出命令窗口&#xff0c;输入 taskschd.msc &#xff0c;点击确定。 2. 弹出任务计划程序窗口&#xff0c;…

使用ResNet34实现CIFAR10数据集的训练

如果对你有用的话&#xff0c;希望能够点赞支持一下&#xff0c;这样我就能有更多的动力更新更多的学习笔记了。&#x1f604;&#x1f604; 使用ResNet进行CIFAR-10数据集进行测试&#xff0c;这里使用的是将CIFAR-10数据集的分辨率扩大到32X32&#xff0c;因为算力相关的…