接口 ( API : Application Program Interface )

138 阅读4分钟

1. 简介

1.1 接口是什么

  • 接口是 前后端通信的桥梁
  • 简单理解:一个接口就是 服务中的一个路由规则 ,根据请求响应结果
  • 接口的英文单词是 API (Application Program Interface),所以有时也称之为 API 接口
  • 这里的接口指的是『数据接口』, 与编程语言(Java,Go 等)中的接口语法不同

1.2 接口的作用

实现 前后端通信

在这里插入图片描述

1.3 接口的开发与调用

大多数接口都是由 后端工程师 开发的, 开发语言不限 一般情况下接口都是由 前端工程师 调用的,但有时 后端工程师也会调用接口 ,比如短信接口,支付接口 等

1.4 接口的组成

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

在这里插入图片描述

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

在这里插入图片描述

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

扩展阅读:www.ruanyifeng.com/blog/2014/0…

3. json-server

  • json-server 本身是一个 JS 编写的工具包,可以快速搭建 RESTful API 服务
  • 官方地址: github.com/typicode/js…

操作步骤:

  1. 全局安装 json-server
npm i -g json-server
  1. 创建 JSON 文件(db.json),编写基本结构
{
	"song": [
		{ "id": 1, "name": "干杯", "singer": "五月天" },
		{ "id": 2, "name": "当", "singer": "动力火车" },
		{ "id": 3, "name": "不能说的秘密", "singer": "周杰伦" }
	]
}
  1. 以 JSON 文件所在文件夹作为工作目录 ,执行如下命令
json-server --watch db.json
  • 默认监听端口为 3000

4. 接口测试工具

几个接口测试工具:

  1. apipost:www.apipost.cn/ (中文)
  2. apifox:www.apifox.cn/ (中文)
  3. 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;