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中间件解决跨域问题,使用步骤:
- 安装中间件 cnpm i cors
- 导入中间件 const cors=require('cors)
- 在路由之前,调用中间件 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和路由密切相关,并可以看作是一种接口来实现客户端与后端的交互。