Express学习(四)

使用Express写接口

创建基本的服务器

在这里插入图片描述

创建API路由模块

编写GET接口

在这里插入图片描述
在这里插入图片描述

编写POST接口

在这里插入图片描述

CORS跨域资源共享

  • 什么是CORS
    CORS由一系列HTTP响应头组成,这些HTTP响应头决定浏览器是否阻止前端JS代码跨域获取资源。浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如果接口服务器配置了CORS相关的HTTP响应头 ,就可以解除浏览器前端的跨域访问限制。
  • 新建一个test.html文件,在文件内输入!,点击!即可快速初始化html文件
  • 使用cors中间件解决跨域问题
  • 使用步骤如下
    • 运行npm install cors安装中间件
    • 使用const cors = require('cors')导入中间件
    • 在路由之前调用app.use(cors())配置中间件
  • 代码如下
  • API.js
//路由模块
const express = require('express')
const router = express.Router()router.get('/get', (req, res) => {//获取到客户端通过查询字符串发送到服务器的数据const query = req.query//调用res.send()方法把数据响应给客户端res.send({status: 0,  //状态0表示成功,1表示失败msg: 'GET请求成功!',  //状态描述data: query    //需要响应给客户端的具体数据})
})router.post('/post', (req, res) => {//获取客户端通过请求体发送到服务器的 URL-encoded数据//如果要获取URL-encoded格式的请求体数据,必须配置中间件app.use(express.urlencoded({ extended: false}))const body = req.body//调用res.send()方法把数据响应给客户端res.send({status: 0,    //状态0表示成功,1表示失败msg: 'POST请求成功!',  //状态描述消息data: body    //需要响应给客户端的具体数据})
})module.exports = router
  • test.js
//导入express模块
const express = require('express')//创建express服务器实例
const app = express()//配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))//一定要在路由之前配置之cors这个中间件,从而解决接口跨域的问题
const cors = require('cors')
app.use(cors())//导入并注册路由模块
const router = require('./API')
app.use('/api', router)//调用app.listen方法指定端口号并启动服务器
app.listen(80, () => {console.log('Express server running at http://127.0.0.1')
})
  • test.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdn.staticfile.net/jquery/3.7.1/jquery.min.js"></script>
</head><body><!--输入以下内容--><button id="btnGET">GET</button><button id="btnPOST">POST</button><script>//测试GET接口$('#btnGET').on('click', function () {$.ajax({type: 'GET',url: 'http://127.0.0.1/api/get',data: { name: 'zs', age: 20 },success: function (res) {console.log(res)},})})//测试POST接口$('#btnPOST').on('click', function () {$.ajax({type: 'POST',url: 'http://127.0.0.1/api/get',data: { bookname: '区块链', author: 'thq' },success: function (res) {console.log(res)},})})</script></body></html>
  • 终端运行test.js文件
    在这里插入图片描述

  • 然后在网页中打开html文件

  • 点击GET和POST按钮

  • 注意事项

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

CORS响应头部

  • Access-Control-Allow-Origin
    响应头部可以携带一个Access-Control-Allow-Origin字段,如下,下面的字段值将只允许来自http://itcast.cn的请求
res.setHeader('Access-Control-Allow-Origin', 'http://itcast.cn')

下面的字段表示允许来自任何域的请求

res.setHeader('Access-Control-Allow-Origin', '*')
  • Access-Control-Allow-Headers
    默认情况下,CORS仅支持客户端向服务器发送如下的9个请求头:
    Accept、Accept-Language、 Content-Language、 DPR、DownlinkSave-Data Viewport-Width, Width Content-Type (值仅限于 text/plain、 multipart/form-data、application/x-www-form-urlencoded 三者之一)
    如果客户端向服务器发送了额外的请求头信息,则需要在服务器端,通过Access-Control-Allow-Headers对额外的请求头进行声明,否则请求失败。例如如下允许使用Conten-Type和X-Custom-Header请求头
res.setHeader('Access-Control-Allow-Headers', 'Conten-Type, X-Custom-Header')
  • Access-Control-Allow-Methods
    默认情况下,CORS仅支持客户端发起GET、POST、HEAD请求。
    如果客户端希望通过PUT、DELETE等方式请求服务器的资源,则需要在服务器通过Access-Control-Allow-Methods来指明实际请求所允许使用的HTTP方法。如下,
//只允许POST、GET、DELETE、HEAD请求方法
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, DELETE, HEAD')
//允许所有的HTTP请求方法
res.setHeader('Access-Control-Allow-Methods', '*')

CORS请求的分类

  • 简单请求
    • 请求方式:GET、POST、HEAD三者之一
    • HTTP 头部信息不超过以下几种字段: 无自定义头部字段、Accept、Accept-LanguageContent-Language、DPR.Downlink、Save-Data、 Viewport-Width、 Width 、Content-Type (只有三个值application/x-www-formurlencoded、multipart/form-data、text/plain)。
  • 预检请求
    在浏览器与服务器正式通信之前,浏览器会发送OPTION请求进行预检,以获知服务器是否允许该实际请求,所以这一次的OPTION请求称为预检请求。服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据。
    • 请求方式:GET、POST、HEAD之外的请求Method类型
    • 请求头中包含自定义头部字段
    • 向服务器发送了application/json格式的数据。
  • 简单请求和预检请求的区别
    • 简单请求的特点:客户端与服务器之间只会发生一次请求
    • 预检请求的特点:客户端与服务器之间会发生两次请求,OPTION预检请求成功之后才会发起真正的请求。

示例

  • 修改之前的test.html代码如下
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdn.staticfile.net/jquery/3.7.1/jquery.min.js"></script>
</head><body><!--输入以下内容--><button id="btnGET">GET</button><button id="btnPOST">POST</button><!--添加一个新的按钮--><button id="btnDelete">DELETE</button><script>$(function () {//测试GET接口$('#btnGET').on('click', function () {$.ajax({type: 'GET',url: 'http://127.0.0.1/api/get',data: { name: 'zs', age: 20 },success: function (res) {console.log(res)},})})//测试POST接口$('#btnPOST').on('click', function () {$.ajax({type: 'POST',url: 'http://127.0.0.1/api/post',data: { bookname: '区块链', author: 'thq' },success: function (res) {console.log(res)},})})//为删除按钮绑定点击事件处理函数$('#btnDelete').on('click', function () {$.ajax({type: 'DELETE',url: 'http://127.0.0.1/api/delete',data: { bookname: '区块链', author: 'thq' },success: function (res) {console.log(res)},})})})</script></body></html>
  • 然后在API.js文件中添加代码
//路由模块
const express = require('express')
const router = express.Router()router.get('/get', (req, res) => {//获取到客户端通过查询字符串发送到服务器的数据const query = req.query//调用res.send()方法把数据响应给客户端res.send({status: 0,  //状态0表示成功,1表示失败msg: 'GET请求成功!',  //状态描述data: query    //需要响应给客户端的具体数据})
})router.post('/post', (req, res) => {//获取客户端通过请求体发送到服务器的 URL-encoded数据//如果要获取URL-encoded格式的请求体数据,必须配置中间件app.use(express.urlencoded({ extended: false}))const body = req.body//调用res.send()方法把数据响应给客户端res.send({status: 0,    //状态0表示成功,1表示失败msg: 'POST请求成功!',  //状态描述消息data: body    //需要响应给客户端的具体数据})
})//定义DELETE接口
router.delete('/delete', (req, res) => {res.send({satus: 0,msg: 'DELET请求成功',})
})module.exports = router

然后我们运行test.js文件启动服务器,然后打开网页,点击DELETE按钮即可看到出现了两次请求
在这里插入图片描述

JSONP接口

  • 概念
    浏览器通过 < script >标签的src属性,请求服务器上的数据,同时,服务器返回一个函数的调用。这种请求数据的方式叫做JSONP。
  • 特点
    • JSONP不属于真正的Ajax请求,因为它没有使用XMLHttpRequest这个对象。
    • JSONP仅支持GET请求,不支持POST、PUT、DELETE等请求。
  • 创建JSONP接口的注意事项
    如果项目中已经配置了CORS跨域资源共享,为了防止冲突,必须在配置CORS中间件之前声明JSONP的接口,否则JSONP接口会被处理成开启了CORS的接口,示例代码如下
//优先创建JSONP接口,这个接口不会被处理成CORS接口
app.get('/api/jsonp', (req, res) => { })//再配置CORS中间件,后续的所有接口都会被处理成CORS接口
app.use(cors())//这是一个开启了CORS的接口
app.get('/api/get', (req, res) => { })
  • 实现JSONP接口的步骤
    • 获取客户端发送过来的回调函数的名字
    • 得到要通过JSONP形式发送给客户端的数据
    • 根据前两步得到的数据,拼接出一个函数调用的字符串
    • 把上一步拼接得到的字符串,响应给客户端的
app.get('/api/jsonp', (req, res) => {
//获取客户端发送过来的回调函数的名字
const funcName = req.query.callback
//得到要通过JSONP形式发送给客户端的数据
const data = { name: 'zs', age: 22 }
//根据前两步得到的数据,拼接出一个函数调用的字符串
const scriptStr = `${funcName}(${JSON.stringify(data)})`
//把上一步拼接得到的字符串,响应给客户端的<script>标签进行解析执行
res.send(scriptStr)
})
  • 示例
    在之前的test.js文件中添加代码后如下
//导入express模块
const express = require('express')//创建express服务器实例
const app = express()//配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))//必须在配置cors中间件之前配置JSONP的接口
app.get('/api/jsonp', (req, res) => {//得到函数的名称const funcName = req.query.callback//定义要发送到客户端的数据对象const data = { name: 'zs', age: 22 }//拼接出一个函数的调用const scriptStr = `${funcName}(${JSON.stringify(data)})`//把拼接的字符串响应给客户端res.send(scriptStr)
})//一定要在路由之前配置之cors这个中间件,从而解决接口跨域的问题
const cors = require('cors')
app.use(cors())//导入并注册路由模块
const router = require('./API')
app.use('/api', router)//调用app.listen方法指定端口号并启动服务器
app.listen(80, () => {console.log('Express server running at http://127.0.0.1')
})
  • 使用jQuery发起JSONP请求
    调用$.ajax()函数,提供JSONP的配置选项,从而发起JSONP请求。
    在test.html文件中添加代码后如下
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdn.staticfile.net/jquery/3.7.1/jquery.min.js"></script>
</head><body><!--输入以下内容--><button id="btnGET">GET</button><button id="btnPOST">POST</button><button id="btnDelete">DELETE</button><button id="btnJSONP">DELETE</button><script>$(function () {//测试GET接口$('#btnGET').on('click', function () {$.ajax({type: 'GET',url: 'http://127.0.0.1/api/get',data: { name: 'zs', age: 20 },success: function (res) {console.log(res)},})})//测试POST接口$('#btnPOST').on('click', function () {$.ajax({type: 'POST',url: 'http://127.0.0.1/api/post',data: { bookname: '区块链', author: 'thq' },success: function (res) {console.log(res)},})})//为删除按钮绑定点击事件处理函数$('#btnDelete').on('click', function () {$.ajax({type: 'DELETE',url: 'http://127.0.0.1/api/delete',data: { bookname: '区块链', author: 'thq' },success: function (res) {console.log(res)},})})//为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></html>
  • 然后打开网页,点击JSONP
    在这里插入图片描述

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

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

相关文章

数据结构和算法:栈与队列

栈 栈 &#xff08;stack&#xff09;是一种遵循先入后出逻辑的线性数据结构 把堆叠元素的顶部称为“栈顶”&#xff0c;底部称为“栈底”。 将把元素添加到栈顶的操作叫作“入栈”&#xff0c;删除栈顶元素的操作叫作“出栈”。 栈的常用操作 /* 初始化栈 */ stack<int&g…

专升本 C语言笔记-07 逗号运算符

1.逗号表达式的用法 就是用逗号隔开的多个表达式。逗号表达式&#xff0c;从左向右依次执行。 2.逗号表达式的特性 2.1.当没有括号时&#xff0c;第一个表达式为整个表达式的值。 代码 int x 3,y 5,a 0; a x,y; printf("a %d",a); 说明:因为逗号优先级最低,会…

【CSS颜色】

本文章属于学习笔记&#xff0c;在https://www.freecodecamp.org/chinese/learn/2022/responsive-web-design/中练习 三、CSS颜色 1、有两种主要的颜色模型:电子设备中使用的加性RGB(红、绿、蓝)模型和印刷品中使用的减色CMYK(青色、品红、黄色、黑色)模型。 使用RGB模型。这…

学习JAVA的第二十一天(基础)

多线程 线程&#xff1a; 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 进程&#xff1a; 程序的基本执行实体 并发&#xff1a; 在同一时刻&#xff0c;有多个指令在单个CPU上交替执行 并行&#xff1a; 在同一时刻&…

【C语言】Windows下的C语言线程编程详解

文章目录 1. 头文件1.1 windows.h1.2 process.h 2. 创建线程3. 线程同步3.1 线程同步方式3.1 互斥量&#xff08;Mutex&#xff09;3.2 事件&#xff08;Event&#xff09; 4. 线程的结束与资源管理5.线程池&#xff08;简要&#xff09; 在Windows平台下&#xff0c;C语言提供…

活动会议线上直播,如何扩大曝光?媒体直播分流解析

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 线上直播扩大曝光与媒体直播分流解析 一、扩大曝光策略&#xff1a; 平台选择&#xff1a;选择用户基数大、活跃度高的直播平台进行直播。 预告宣传&#xff1a;提前发布直播预告&…

k8s-Istio服务网络 27

官网&#xff1a;https://istio.io/latest/zh/about/service-mesh/ Istio与k8s的区别 SpringCloud传统微服务结合k8s与Istio与k8s结合&#xff1a; Istio数据面&#xff1a;通过envoy以sidecar方式拦截svc的流量来进行治理。 Istio控制面&#xff1a;pilot list/watch APIserv…

HarmonyOS NEXT应用开发之异常处理案例

介绍 本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法&#xff0c;主要分为应用崩溃、应用卡死以及系统查杀三种。 效果图预览 使用说明&#xff1a; 点击构建应用崩溃事件&#xff0c;3s之后应用退出&#xff0c;然后打开应用进入应用异常页面&#x…

nginx启动闪退

在nginx目录下cmd&#xff0c;nginx -t&#xff0c;找到原因是&#xff1a;“在端口80上运行NGINX时&#xff0c;因为端口80是HTTP默认端口&#xff0c;需要管理员权限才能访问” 所以修改端口号&#xff1a; 在nginx.conf文件中&#xff0c;修改listen&#xff1a;80为8080 …

【C++】类的默认成员函数(下)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、运算符重载1.1 引例1.2 概念及运用&#xff1a;1.3 牛刀小试:1.4 重载1.5 运…

Python网络基础爬虫-python基本语法

文章目录 逻辑语句if,else,elifforwhile异常处理 函数与类defpassclass 逻辑语句 熟悉C/C语言的人们可能很希望Python提供switch语句&#xff0c;但Python中并没有这个关键词&#xff0c;也没有这个语句结构。但是可以通过if-elif-elif-…这样的结构代替&#xff0c;或者使用字…

目标检测——YOLOv2算法解读

论文&#xff1a;YOLO9000: Better, Faster, Stronger 作者&#xff1a;Joseph Redmon, Ali Farhadi 链接&#xff1a;https://arxiv.org/pdf/1612.08242v1.pdf 代码&#xff1a;http://pjreddie.com/yolo9000/ YOLO系列其他文章&#xff1a; YOLOv1通俗易懂版解读SSD算法解读…

记一次生产慢sql索引优化及思考

记一次生产慢sql索引优化及思考 问题重现 夜黑风高的某一晚&#xff0c;突然收到一条运营后台数据库慢sql的报警&#xff0c;耗时竟然达到了60s。看了一下&#xff0c;还好不是很频繁&#xff0c;内心会更加从容排查问题&#xff0c;应该是特定条件下没有走到索引导致&#x…

[论文精读]Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection

论文网址&#xff1a;[2304.08876] 用于定向微小目标检测的动态粗到细学习 (arxiv.org) 论文代码&#xff1a;https://github.com/ChaselTsui/mmrotate-dcfl 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&…

支付模块-基于消息队列发送支付通知消息

消息队列发送支付通知消息 需求分析 订单服务作为通用服务&#xff0c;在订单支付成功后需要将支付结果异步通知给其他对接的微服务&#xff0c;微服务收到支付结果根据订单的类型去更新自己的业务数据 技术方案 使用消息队列进行异步通知需要保证消息的可靠性即生产端将消息…

深入了解 大语言模型(LLM)微调方法

引言 众所周知&#xff0c;大语言模型(LLM)正在飞速发展&#xff0c;各行业都有了自己的大模型。其中&#xff0c;大模型微调技术在此过程中起到了非常关键的作用&#xff0c;它提升了模型的生成效率和适应性&#xff0c;使其能够在多样化的应用场景中发挥更大的价值。 那么&…

服务器命令

服务器命令 服务器命令top查看任务 服务器命令 top查看任务 、ps 命令 ps 命令是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和它所运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等。总之大部分信息都是可以通过执行…

pytorch模型转onnx格式,编写符号函数实现torch算子接口和onnx算子的映射,新建简单算子--模型部署记录整理

对于深度学习模型来说&#xff0c;模型部署指让训练好的模型在特定环境中运行的过程。相比于软件部署&#xff0c;模型部署会面临更多的难题&#xff1a; 运行模型所需的环境难以配置。深度学习模型通常是由一些框架编写&#xff0c;比如 PyTorch、TensorFlow。由于框架规模、依…

掌握Go语言:深入encoding/gob包的高效数据序列化

掌握Go语言&#xff1a;深入encoding/gob包的高效数据序列化 引言理解Gob和它的使用场景Gob的概念和设计目标Gob的适用场景和优势 开始使用Gob基本的Gob编码和解码示例代码编码&#xff08;序列化&#xff09;解码&#xff08;反序列化&#xff09; Gob编码高级应用自定义类型的…

【Java语言】遍历List元素时删除集合中的元素

目录 前言 实现方式 1.普通实现 1.1 使用【for循环】 方式 1.2 使用【迭代器】方式 2.jdk1.8新增功能实现 2.1 使用【lambda表达式】方式 2.2 使用【stream流】方式 注意事项 1. 使用【for循环】 方式 2. 不能使用增强for遍历修改元素 总结 前言 分享几种从List中移…