Express接口

1.创建基本的服务器

// 导入express模块
const express = require('express');
const send = require('send');// 创建express的 服务器实例
const app = express()// 启动服务器
app.listen(80, () => {console.log('express server running at ');})

2.创建API路由接口

// 导入express模块
const express = require('express');
const send = require('send');// 创建express的 服务器实例
const app = express()// 导入路由模块
const router = require('./03apiRouter.js')
// 把路由模块 注册到app上
app.use('./api', router)// 启动服务器
app.listen(80, () => {console.log('express server running at ');})

 03apiRouter.js

const express = require('express')
const router = express.Router()// 在这里挂载对应的路由module.exports = router

3.编写get  和  post  接口

入口程序

// 导入express模块
const express = require('express');// 创建express的 服务器实例
const app = express()// 配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))// 导入路由模块
const router = require('./03apiRouter.js')
// 把路由模块 注册到app上
app.use('/api', router)// 启动服务器
app.listen(80, () => {console.log('express server running at ');})

 03apiRouter.js

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

4.跨域问题

4.1解决方案

  • CORS   (主流解决方案,推荐)
  • JSONP (只支持GET请求,有缺陷)

4.2cors

cors中间件解决跨域问题,使用步骤:

  1. 安装中间件    cnpm i cors 
  2. 导入中间件   const cors=require('cors)
  3. 在路由之前,调用中间件  app.use(cors())

cors概念

 cors注意事项

 代码实现

 03apiRouter.js

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

入口程序

// 导入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('./03apiRouter.js')
// 把路由模块 注册到app上
app.use('/api', router)// 启动服务器
app.listen(80, () => {console.log('express server running at ');})

 

cors响应头部

        Access-Control-Allow-Origin

 

         Access-Ctrol-Allow-Header

        Access-Control-Allow-Methods

cors请求分类

        简单请求

        预检请求

         区别

4.3JSONP

 JSONP概念

// 导入express模块
const express = require('express');// 创建express的 服务器实例
const app = express()// 配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))// !!!!!!必须在配置cors之前,配置JSONP接口
app.get('/api/jsonp', (req, res) => {//1. 得到函数名称const funName = req.query.callback// 2.定义要发送给客户端的数据对象const data = { name: 'slx', age: 22 }// 在JavaScript中,对象的属性名是一个标识符,标识符通常是一个没有引号的字符串。// 因此,在定义对象时,对象的属性名不需要加引号。// 3.拼接出函数调用  fun()const scriptStr = `${funName}(${JSON.stringify(data)})`// 4.把拼接对象 响应给客户端res.send(scriptStr)})// 一定要在路由之前,配置中间件cors,从而解决接口跨域问题
const cors = require('cors')
app.use(cors())// 导入路由模块
const router = require('./03apiRouter.js')
// 把路由模块 注册到app上
app.use('/api', router)// 启动服务器
app.listen(80, () => {console.log('express server running at ');})

  03apiRouter.js

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

5.API、路由、接口的区别和联系

API(Application Programming Interface)、路由(Routing)和接口(Interface)是三个在软件开发中常用的概念,它们在不同上下文中有不同的含义和用途。

**API(Application Programming Interface)**:

- API是应用程序提供给其他程序或开发者使用的接口,用于访问和交互应用程序的功能和数据。
- API定义了一组规则和约定,使得不同的软件可以相互通信和集成,提供了一种标准化的方式让不同的系统之间进行交互。
- 在Web开发中,API通常指用于与后端服务器通信的接口,通过HTTP请求和响应来传递数据,比如RESTful API。

**路由(Routing)**:

- 路由是用于根据URL的不同路径和HTTP请求方法将请求映射到相应的处理程序或控制器的机制。
- 路由的作用是帮助将客户端的请求分发到正确的处理程序,以便执行相应的操作并返回适当的响应。
- 在Web应用程序中,路由定义了不同URL路径与后端代码的映射关系,它可以实现根据请求路径调用不同的业务逻辑处理,并返回相应的结果。

**接口(Interface)**:

- 在编程中,接口是一个抽象的规范,定义了类或对象应该实现的方法和属性,但并不提供具体的实现。
- 接口定义了一组合约,规定了类或对象应该具备的行为,让不同的类可以遵循同样的接口进行开发,从而保持代码的一致性和可扩展性。
- 接口通常用于实现多态性,允许不同的类实现相同的接口,并可以通过接口来调用具体的实现代码。

**联系**:

- 在Web开发中,API和路由有密切的联系。API通常是通过路由来定义的,即将不同的URL路径映射到对应的API处理程序或控制器。API提供了一种规范的方式让客户端可以通过HTTP请求来访问后端服务,而路由则负责将这些请求分发到正确的API处理程序。

- 接口的概念在不同的编程范式中都有应用。在面向对象编程中,接口用于定义类的规范,使得不同的类可以遵循相同的接口进行开发。在Web开发中,API和路由也可以看作是一种接口,它定义了客户端与后端之间的交互规范和映射关系。

综上所述,API、路由和接口是在软件开发中常用的概念,它们分别用于定义应用程序的接口规范、将URL请求映射到相应的处理程序,并在不同编程范式中定义类的规范。在Web开发中,API和路由密切相关,并可以看作是一种接口来实现客户端与后端的交互。

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

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

相关文章

「网络编程」传输层协议_ TCP协议学习_及原理深入理解(二 - 完结)[万字详解]

「前言」文章内容大致是传输层协议,TCP协议讲解的第二篇,续上篇TCP。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 二、TCP协议2.9 TCP连接管理机制2.9.1 三次握手2.9.2 四次挥手2.9.3 演示查看TIME_WAIT和CLOSE_WAIT状态2.9.…

MySQL 远程操作mysql

可以让别人在他们的电脑上操作我电脑上的数据库 create user admin identified with mysql_native_password by admin; //设置账号密码都为admingrant all on *.* to admin; //给admin账号授权 授权完成

使用elementplus实现文本框的粘贴复制

需求: 文本框仅用于显示展示数据并且用户可以进行复制,并不会进行修改和编辑, 注意点: 1.首先且文本为多行。所以不能使用普通的el-input,这种一行超出就会隐藏了,如果多行超出行数也会隐藏(…

第16节:R语言医学分析实例:肺切除手术的Apriori关联规则分析

关联规则 肺切除手术的Apriori关联规则分析。 分析的目的是确定患有肺癌并需要接受肺切除术的患者的共病症状。 了解哪些症状是共病的可以帮助改善患者护理和药物处方。 分析类型是关联规则学习,通过探索变量之间的关联或频繁项集,尝试在大型数据集中找到见解和隐藏关系(H…

用blender做一层石墨烯

文章目录 1 创建正六边形2 复制正六边形3 阵列4 球棍模型 1 创建正六边形 ShiftA->网格->圆环->左下角出现添加圆环菜单,将顶点设为6,得到一个正六边形。按下tab键进入编辑模式->快捷键F填充,得到下图 2 复制正六边形 首先将轴…

Django的FBV和CBV

Django的FBV和CBV 基于django开发项目时,对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV,function base views,其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…

Redis主从复制、哨兵机制、集群分片

一.主从复制 1.概述 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave)。 数据的复制是单向的,只能由主节点到从节点默认情况下,每台Redis服务器都是主节…

AUTOSAR从入门到精通-【应用篇】基于CAN总线的嵌入式人机交互终端的 设计与开发

前言 在计算机出现后,因其先进的科学技术能力,影响着人类的生产活动和社会 活动,它以强大的生命力快速发展,随着在社会中的普及率越来越广,应用越来 越多,操作计算机的难度和疲劳感成为困扰大众的问题。如何实现计算机与用户 之间更好的互动交流成为了值得思考的发展方面…

机器学习深度学习——权重衰减

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——模型选择、欠拟合和过拟合 📚订阅专栏:机器学习&&深度学习 希望文章对你…

数据结构8-哈希表

数据结构8-哈希表 动态分配内存方式&#xff1a; #include <stdio.h> #include <stdlib.h>#define SIZE 20struct DataItem {int data; int key; };struct DataItem* hashArray[SIZE]; struct DataItem* dummyItem; struct DataItem* item;//获取键值 int has…

flink任务性能优化

1、使用异步算子&#xff0c;异步执行操作 2、将下游数据需要的数据以参数的形式向下传递 3、当服务器资源有限的情况下&#xff0c;慎用RocksDBStateBackend RocksDBStateBackend performance will be poor because of the current Flink memory configuration! RocksDB wi…

Rust的入门篇(上)

Rust的入门篇(上) 最近跟着菜鸟一起入门了比较火的Rust语言&#xff0c;下面整理一下学习的笔记吧。 1. Helloworld程序 fn main(){println!("hello rust") }2. 格式化字符串 fn main(){let a 12;// 格式化字符串println!("a{}", a);println!("a…

Vue2.0基础

1、概述 Vue(读音/vju/&#xff0c;类似于view)是一套用于构建用户界面的渐进式框架&#xff0c;发布于2014年2月。与其它大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff08;也就是可以理解为HTMLCSSJS&#xff09;&#xff…

使用Idea提交项目到远程仓库

使用Idea提交项目到远程仓库 1.在Idea中打开本地要推送的项目2.创建远程仓库并提交 1.在Idea中打开本地要推送的项目 tips: 首先你得有git工具&#xff0c;没有的话可以参考下面的这篇文章 git与gitee结合使用&#xff0c;提交代码&#xff0c;文件到远程仓库 从导航栏中选择 V…

uC-OS2 V2.93 STM32L476 移植:系统移植篇

前言 上一篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG STM32L476RG 的 裸机工程&#xff0c;并且下载了 uC-OS2 V2.93 的源码&#xff0c;接下来&#xff0c;开始系统移植 开发环境 win10 64位 Keil uVision5&#xff0c;MDK V5.36 uC-OS2 V2.93 开发板&#xff1a;NUC…

Flink DataStream API详解

DataStream API 参考&#xff1a;https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/datastream_api.html Data Sources Source是程序读取其输入的位置&#xff0c;您可以使用env.addSource&#xff08;sourceFunction&#xff09;将Source附加到程序中。Fl…

安全狗V3.512048版本绕过

安全狗安装 安全狗详细安装、遇见无此服务器解决、在windows中命令提示符中进入查看指定文件夹手动启动Apache_安全狗只支持 glibc_2.14 但是服务器是2.17_黑色地带(崛起)的博客-CSDN博客 安全狗 safedogwzApacheV3.5.exe 右键电脑右下角安全狗图标-->选择插件-->安装…

Jvm实际运行情况-JVM(十七)

上篇文章说jmap和jstat的命令&#xff0c;如何查看youngGc和FullGc耗时和次数。 Jmap-JVM&#xff08;十六&#xff09; Jvm实际运行情况 背景&#xff1a; 机器配置&#xff1a;2核4G JVM内存大小&#xff1a;2G 系统运行天数&#xff1a;7天 期间发生FULL GC次数和耗时…

untiy代码打压缩包,可设置密码

1、简单介绍&#xff1a; 用的是一个插件SharpZipLib&#xff0c;在vs的Nuget下载&#xff0c;也可以去github下载https://github.com/icsharpcode/SharpZipLib 用这个最主要的是因为&#xff0c;这个不用请求windows的文件读写权限&#xff0c;关于这个权限我搞了好久&#…