【全栈修炼】RESTful架构及实践修炼宝典 - 图1

一、概念介绍

1. REST 概念

REST:(Representational State Transfer)即表现层状态转换,定义了资源的通用访问格式,是一种网络应用程序的设计风格开发方式

在概念中,需要理解以下几个名称:

  1. 资源(Resource)

服务器上获取到的东西任何资源,一条用户记录,一个用户的密码,一张图片等等都是。

  1. 资源的表述(Representation)

资源格式,是 HTML、XML、JSON、纯文本、图片等等,可以用各种各样的格式来表述你获取到的资源。

  1. 状态转移(State Transfer)

URL定位资源,用 HTTP 动词(GET,POST,DELETE,DETC)描述操作。操作是动词,资源是名词。

  1. 统一接口(Uniform Interface)

即通过统一的接口对资源进行操作。

2. REST 特点

REST 通常基于使用 HTTPURI ,和 XML 以及 HTML 这些现有的广泛流行的协议和标准,每一种 URI 代表一种资源。

REST 通常使用 JSON 数据格式。

REST 基本架构的四个方法:

  • GET - 用于获取数据
  • PUT - 用于更新或添加数据
  • DELETE - 用于删除数据
  • POST - 用于添加数据

下面会通过一个场景介绍。

3. REST 优点

  • 可更高效利用缓存来提高响应速度
  • 通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
  • 浏览器即可作为客户端,简化软件需求
  • 相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
  • 不需要额外的资源发现机制
  • 在软件技术演进中的长期的兼容性更好

二、实例介绍

REST 定义了资源的通用访问格式,接下来一个消费者为实例,介绍 RESTful API 定义:

  1. 获取所有 user
  1. GET /api/user
  1. 获取指定 id 的 user
  1. GET /api/user/100
  1. 新建一条 user 记录
  1. POST /api/user
  1. 更新一条 user 记录
  1. PUT /api/user/100
  1. 删除一条 user 记录
  1. DELETE /api/user/100
  1. 获取一个 user 的所有消费账单
  1. GET /api/user/100/bill
  1. 获取一个 user 指定时间的消费账单
  1. GET /api/user/100/bill?from=201910&to=201911

以上其中 RESTful 风格 API 几乎包含常见业务情况。

三、Nodejs 实现 RESTful API

1. 初始化 mock 数据

本案例使用 mock 数据来演示,如下:

  1. {
  2. "user1" : {
  3. "name" : "leo",
  4. "password" : "123456",
  5. "profession" : "teacher",
  6. "id": 1
  7. },
  8. "user2" : {
  9. "name" : "pingan8787",
  10. "password" : "654321",
  11. "profession" : "librarian",
  12. "id": 2
  13. },
  14. "user3" : {
  15. "name" : "robin",
  16. "password" : "888888",
  17. "profession" : "clerk",
  18. "id": 3
  19. }
  20. }

我们将实现以下 RESTful API :

2. 获取用户列表

这一步我们会创建 RESTful API 中的 user,使用 GET 来读取用户的信息列表

  1. // index.js
  2. const express = require('express');
  3. const app = express();
  4. const fs = require("fs");
  5. // 定义 读取用户的信息列表 的接口
  6. app.get('/user', (req, res) => {
  7. fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
  8. console.log( data );
  9. res.end( data );
  10. });
  11. })
  12. const server = app.listen(8081, function () {
  13. const {address, port} = server.address();
  14. console.log("server run in: http://%s:%s", address, port);
  15. })

3. 添加用户

这一步我们会创建 RESTful API 中的 user,使用 POST 来添加用户记录

  1. // index.js
  2. // 省略之前文件 只展示需要实现的接口
  3. // mock 一条要新增的数据
  4. const user = {
  5. "user4" : {
  6. "name" : "pingan",
  7. "password" : "password4",
  8. "profession" : "teacher",
  9. "id": 4
  10. }
  11. }
  12. // 定义 添加用户记录 的接口
  13. app.post('/user', (req, res) => {
  14. // 读取已存在的数据
  15. fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
  16. data = JSON.parse( data );
  17. data["user4"] = user["user4"];
  18. console.log( data );
  19. res.end( JSON.stringify(data));
  20. });
  21. })

4. 获取用户详情

这一步我们在 RESTful API 中的 URI 后面加上 :id,使用 GET 来获取指定用户详情

  1. // index.js
  2. // 省略之前文件 只展示需要实现的接口
  3. // 定义 获取指定用户详情 的接口
  4. app.get('/:id', (req, res) => {
  5. // 首先我们读取已存在的用户
  6. fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
  7. data = JSON.parse( data );
  8. const user = data["user" + req.params.id]
  9. console.log( user );
  10. res.end( JSON.stringify(user));
  11. });
  12. })

5. 删除指定用户

这一步我们会创建 RESTful API 中的 user,使用 DELETE 来删除指定用户

  1. // index.js
  2. // 省略之前文件 只展示需要实现的接口
  3. // mock 一条要删除的用户id
  4. const id = 2;
  5. app.delete('/user', (req, res) => {
  6. fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
  7. data = JSON.parse( data );
  8. delete data["user" + id];
  9. console.log( data );
  10. res.end( JSON.stringify(data));
  11. });
  12. })

参考资料

  1. 《维基百科 - 表现层状态转换》
  2. 《RESTful风格的springMVC》
  3. 《Node.js RESTful API》

关于我

本文首发在 pingan8787个人博客,如需转载请联系本人。

Author 王平安
E-mail pingan8787@qq.com
博 客 www.pingan8787.com
微 信 pingan8787
每日文章推荐 https://github.com/pingan8787/Leo_Reading/issues
ES小册 js.pingan8787.com

微信公众号

【全栈修炼】RESTful架构及实践修炼宝典 - 图2