当前位置: 首页 > news >正文

第十一章:接口

接口

文章目录

  • 接口
    • 一、简介
      • 1.1 接口是什么
      • 1.2 接口的作用
      • 1.3 接口的开发与调用
      • 1.4 接口的组成
    • 二、RESTful API
    • 三、json-server
    • 四、接口测试工具
    • 五、接口的创建

一、简介

1.1 接口是什么

接口是前后端通信的桥梁

简单理解:一个接口就是 服务中的一个路由规则,根据请求响应结果

接口的英文单词是 API(Application Program Interface),所以有时也称之为 API 接口

这里的接口指的是『数据接口』,与编程语言(Java、Go等)中的接口语法不同

1.2 接口的作用

实现 前后端通信

接口的作用

1.3 接口的开发与调用

大多数接口都是由 后端工程师开发的,开发语音不限

一般情况下接口都是由**前端工程师调用的,但有时后端工程师也会调用接口**,比如短信接口、支付接口等

1.4 接口的组成

一个接口一般由如下几个部分组成:

  • 请求方法
  • 接口地址(URL)
  • 请求参数
  • 响应结果

一个接口示例:身份证查询

接口示例

体验一下:https://api.asilu.com/idcard/?id=152502199405148245

二、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返回单个歌曲信息

扩展阅读:RESTful API 设计指南

三、json-server

json-server 本身是一个 JS 编写的工具包,可以快速搭建 RESTful API 服务(json-server 官方地址)

操作步骤:

  1. 全局安装 json-server

    npm i -g json-server
    
  2. 创建 JSON 文件(db.json),编写基本结构

    {"song": [{"id": 1,"name": "干杯","singer": "五月天"},{"id": 2,"name": "当","singer": "动力火车"},{"id": 3,"name": "不能说的秘密","singer": "周杰伦"}]
    }
    
  3. 以 JSON 文件所在文件夹作为工作目录,执行如下命令

    json-server --watch db.json
    

默认监听端口为 3000

四、接口测试工具

介绍几个接口测试工具:

  • apipost (中文)
  • apifox (中文)
  • postman (英文)

五、接口的创建

以“记账本”为例,来创建账单接口:(以 RESTful API 规则来创建接口)

  • 获取账单列表接口
  • 创建账单接口
  • 删除账单接口
  • 获取单条账单接口
  • 更新单个账单接口
  1. 首先在 routes 文件夹下创建 web 文件夹,用来管理网页端的路由规则的文件;再创建 api 文件夹,用来管理接口的路由规则的文件:

    创建api和web

  2. 创建接口路由规则文件 account.js,与账单相关的接口会放到该文件下

  3. 将 account.js 导入到 app.js 中并使用它:

    // 导入 account 接口路由文件
    const accountRouter = require('./routes/api/account')// 使用 account 接口路由文件
    app.use('/api', accountRouter)
    
  4. 对 account.js 开始创建接口路由规则,其接口路由规则的格式如下:(按照 RESTful API 规则创建接口

    使用 res.json() 来直接返回一个 json 格式的数据:(补充:render 和 json 不能同时使用

    res.json({// 响应编号(一般用 20000 或 0000 来表示成功;用 1001~100n 来表示失败)code: 'xxxx',// 响应的信息(成功的信息|失败的信息)msg: 'xxxx',// 响应的数据(成功为获取到的 json 数据或空对象;失败为 null)data: xxxx
    })
    

    比如:设置获取所有账单的接口

    router.get('/account', function (req, res) {AccountModel.find().sort({ time: -1 }).then((data) => {// 成功的响应res.json({// 响应编号(一般用 20000 或 0000 来表示成功)code: '0000',// 响应的信息msg: '读取成功',// 响应的数据data: data})}).catch(() => {// 失败的响应res.json({code: '1001',msg: '读取失败',data: null})})
    })
    
  5. 进行接口测试:(注意:进行接口测试时,需要将数据库启动以及 http 服务也要启动

代码示例:

/*** 该文件是用来创建记账单接口:*      1.获取账单列表接口*      2.创建账单接口*      3.删除账单接口*      4.获取单条账单接口*      5.更新单个账单接口*/
var express = require('express');
var router = express.Router();// 导入 moment  --- 用来修改时间的格式
const moment = require('moment')
// 导入 AccountModel
const AccountModel = require('../../model/AccountModel')// 1.获取账单列表接口
router.get('/account', function (req, res) {AccountModel.find().sort({ time: -1 }).then((data) => {// 成功的响应res.json({// 响应编号(一般用 20000 或 0000 来表示成功)code: '0000',// 响应的信息msg: '读取成功',// 响应的数据data: data})}).catch(() => {// 失败的响应res.json({code: '1001',msg: '读取失败',data: null})})
});// 2.创建账单接口
router.post('/account', (req, res) => {AccountModel.create({...req.body,// 修改 time 的值time: moment(req.body.time).toDate()}).then((data) => {// 成功提醒res.json({code: '0000',msg: '创建成功',data: data})}).catch(() => {res.json({code: '1002',msg: '创建失败',data: null})})
})// 3.删除账单接口
router.delete('/account/:id', (req, res) => {// 获取要删除记录的idlet id = req.params.id// 删除数据库中的数据AccountModel.deleteOne({ _id: id }).then(() => {// 删除提醒res.json({code: '0000',msg: '删除成功',data: {}})}).catch(() => {res.json({code: '1003',msg: '删除失败',data: null})})
})// 4.获取单条账单接口
router.get('/account/:id', (req, res) => {// 获取单条账单的 idlet id = req.params.id// 根据 id 去查询对应的账单AccountModel.findById(id).then((data) => {// 成功响应res.json({code: '0000',msg: '查询成功',data: data})}).catch(() => {// 失败响应res.json({code: '1004',msg: '查询失败',data: null})})
})// 5.更新单个账单接口(patch:局部更新  put:整体替换掉)
router.patch('/account/:id', (req, res) => {// 获取单条账单的 idlet { id } = req.params// 根据 id 去更新账单信息AccountModel.updateOne({ _id: id }, req.body).then(() => {// 再次查询数据库,来获取更新后的账单信息AccountModel.findById(id).then((data) => {res.json({code: '0000',msg: '更新成功',data: data})}).catch(() => {res.json({code: '1004',msg: '查询失败',data: null})})}).catch(() => {res.json({code: '1005',msg: '更新失败',data: null})})
})module.exports = router;

相关文章:

  • Linux C编译器从零开发三
  • 02-ES6新语法
  • shell 三剑客-grep
  • SpringSecurity-入门代码
  • 【Linux】如何创建yum 组(yum groups)
  • 计算机类期刊含金量横纵向对比(一)
  • 计算机网络 —— 运输层(UDP和TCP)
  • 面试专区|【32道HDFS高频题整理(附答案背诵版)】
  • 2024 年 Python 基于 Kimi 智能助手 Moonshot Ai 模型搭建微信机器人(更新中)
  • 003.Linux SSH协议工具
  • 工具清单 - CI CD
  • GaussDB技术解读——GaussDB架构介绍(五)
  • 如何快速翻译pdf英文论文(5分钟就可以翻译一篇几十页的英文论文)
  • AI智能盒子助力中钢天源设备工厂升级安全防护
  • Docker 命令大全
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • chrome扩展demo1-小时钟
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • FastReport在线报表设计器工作原理
  • JavaScript函数式编程(一)
  • Koa2 之文件上传下载
  • Redux系列x:源码分析
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue自定义指令实现v-tap插件
  • XML已死 ?
  • 理解在java “”i=i++;”所发生的事情
  • 前端相关框架总和
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​Spring Boot 分片上传文件
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # wps必须要登录激活才能使用吗?
  • #vue3 实现前端下载excel文件模板功能
  • #在 README.md 中生成项目目录结构
  • $.ajax()参数及用法
  • (3)选择元素——(17)练习(Exercises)
  • (9)STL算法之逆转旋转
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (回溯) LeetCode 131. 分割回文串
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (论文阅读30/100)Convolutional Pose Machines
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)ORM
  • (转)Sql Server 保留几位小数的两种做法
  • (转)winform之ListView
  • (转)菜鸟学数据库(三)——存储过程