1. 简介
1.1 接口是什么
- 接口是 前后端通信的桥梁
- 简单理解:一个接口就是 服务中的一个路由规则 ,根据请求响应结果
- 接口的英文单词是 API (Application Program Interface),所以有时也称之为 API 接口
- 这里的接口指的是『数据接口』, 与编程语言(Java,Go 等)中的接口语法不同
1.2 接口的作用
实现 前后端通信
1.3 接口的开发与调用
大多数接口都是由 后端工程师 开发的, 开发语言不限 一般情况下接口都是由 前端工程师 调用的,但有时 后端工程师也会调用接口 ,比如短信接口,支付接口 等
1.4 接口的组成
一个接口一般由如下几个部分组成:
- 请求方法
- 接口地址(URL)
- 请求参数
- 响应结果 一个接口示例 www.free-api.com/doc/325
2. RESTful API
RESTful API 是一种特殊风格的接口,主要特点有如下几个:
- URL 中的路径表示 资源 ,路径中不能有 动词 ,例如 create , delete , update 等这些都不能有
- 操作资源要与 HTTP 请求方法 对应
- 操作结果要与 HTTP 响应状态码 对应 规则示例:
| 操作 | 请求类型 | URL | 返回 |
|---|---|---|---|
| 新增歌曲 | POST | /song | 返回新生成的歌曲信息 |
| 删除歌曲 | DELETE | /song/10 | 返回一个空文档 |
| 修改歌曲 | PUT | /song/10 | 返回更新后的歌曲信息 |
| 修改歌曲 | PATCH | /song/10 | 返回更新后的歌曲信息 |
| 获取所有歌曲 | GET | /song | 返回歌曲列表数组 |
| 获取单个歌曲 | GET | /song/10 | 返回单个歌曲信息 |
3. json-server
- json-server 本身是一个 JS 编写的工具包,可以快速搭建 RESTful API 服务
- 官方地址: github.com/typicode/js…
操作步骤:
- 全局安装 json-server
npm i -g json-server
- 创建 JSON 文件(db.json),编写基本结构
{
"song": [
{ "id": 1, "name": "干杯", "singer": "五月天" },
{ "id": 2, "name": "当", "singer": "动力火车" },
{ "id": 3, "name": "不能说的秘密", "singer": "周杰伦" }
]
}
- 以 JSON 文件所在文件夹作为工作目录 ,执行如下命令
json-server --watch db.json
- 默认监听端口为 3000
4. 接口测试工具
几个接口测试工具:
- apipost:www.apipost.cn/ (中文)
- apifox:www.apifox.cn/ (中文)
- postman:www.postman.com/ (英文)
5. 代码示例
5.1 account.js
var express = require('express');
var router = express.Router();
//导入 moment
const moment = require('moment');
const AccountModel = require('../../models/AccountModel');
//记账本的列表
router.get('/account', function(req, res, next) {
//获取所有的账单信息
// let accounts = db.get('accounts').value();
//读取集合信息
AccountModel.find().sort({time: -1}).exec((err, data) => {
if(err){
res.json({
code: '1001',
msg: '读取失败~~',
data: null
})
return;
}
//响应成功的提示
res.json({
//响应编号
code: '0000',
//响应的信息
msg: '读取成功',
//响应的数据
data: data
});
})
});
//新增记录
router.post('/account', (req, res) => {
//表单验证
//插入数据库
AccountModel.create({
...req.body,
//修改 time 属性的值
time: moment(req.body.time).toDate()
}, (err, data) => {
if(err){
res.json({
code: '1002',
msg: '创建失败~~',
data: null
})
return
}
//成功提醒
res.json({
code: '0000',
msg: '创建成功',
data: data
})
})
});
//删除记录
router.delete('/account/:id', (req, res) => {
//获取 params 的 id 参数
let id = req.params.id;
//删除
AccountModel.deleteOne({_id: id}, (err, data) => {
if(err) {
res.json({
code: '1003',
msg: '删除账单失败',
data: null
})
return;
}
//提醒
res.json({
code: '0000',
msg: '删除成功',
data: {}
})
})
});
//获取单个账单信息
router.get('/account/:id', (req, res) => {
//获取 id 参数
let {id} = req.params;
//查询数据库
AccountModel.findById(id, (err, data) => {
if(err){
return res.json({
code: '1004',
msg: '读取失败~~',
data: null
})
}
//成功响应
res.json({
code: '0000',
msg: '读取成功',
data: data
})
})
});
//更新单个账单信息
router.patch('/account/:id', (req, res) => {
//获取 id 参数值
let {id} = req.params;
//更新数据库
AccountModel.updateOne({_id: id}, req.body, (err, data) => {
if(err){
return res.json({
code: '1005',
msg: '更新失败~~',
data: null
})
}
//再次查询数据库 获取单条数据
AccountModel.findById(id, (err, data) => {
if(err){
return res.json({
code: '1004',
msg: '读取失败~~',
data: null
})
}
//成功响应
res.json({
code: '0000',
msg: '更新成功',
data: data
})
})
});
});
module.exports = router;
5.2 index.js
var express = require('express');
var router = express.Router();
//导入 moment
const moment = require('moment');
const AccountModel = require('../../models/AccountModel');
//测试
// console.log(moment('2023-02-24').toDate())
//格式化日期对象
// console.log(moment(new Date()).format('YYYY-MM-DD'));
//记账本的列表
router.get('/account', function(req, res, next) {
//获取所有的账单信息
// let accounts = db.get('accounts').value();
//读取集合信息
AccountModel.find().sort({time: -1}).exec((err, data) => {
if(err){
res.status(500).send('读取失败~~~');
return;
}
//响应成功的提示
res.render('list', {accounts: data, moment: moment});
})
});
//添加记录
router.get('/account/create', function(req, res, next) {
res.render('create');
});
//新增记录
router.post('/account', (req, res) => {
//插入数据库
AccountModel.create({
...req.body,
//修改 time 属性的值
time: moment(req.body.time).toDate()
}, (err, data) => {
if(err){
res.status(500).send('插入失败~~');
return
}
//成功提醒
res.render('success', {msg: '添加成功哦~~~', url: '/account'});
})
});
//删除记录
router.get('/account/:id', (req, res) => {
//获取 params 的 id 参数
let id = req.params.id;
//删除
AccountModel.deleteOne({_id: id}, (err, data) => {
if(err) {
res.status(500).send('删除失败~');
return;
}
//提醒
res.render('success', {msg: '删除成功~~~', url: '/account'});
})
});
module.exports = router;