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

1、概念介绍

1. REST 概念

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

在概念中,须要理解如下几个名称:node

  1. 资源(Resource)

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

  1. 资源的表述(Representation)

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

  1. 状态转移(State Transfer)

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

  1. 统一接口(Uniform Interface)

即经过统一的接口对资源进行操做。express

2. REST 特色

REST 一般基于使用 HTTPURI ,和 XML 以及 HTML 这些现有的普遍流行的协议和标准,每一种 URI 表明一种资源。json

REST 一般使用 JSON 数据格式。api

REST 基本架构的四个方法:浏览器

  • GET - 用于获取数据缓存

  • PUT - 用于更新或添加数据

  • DELETE - 用于删除数据

  • POST - 用于添加数据

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

3. REST 优势

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

2、实例介绍

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

  1. 获取全部 user
GET /api/user
复制代码
  1. 获取指定 id 的 user
GET /api/user/100
复制代码
  1. 新建一条 user 记录
POST /api/user
复制代码
  1. 更新一条 user 记录
PUT /api/user/100
复制代码
  1. 删除一条 user 记录
DELETE /api/user/100
复制代码
  1. 获取一个 user 的全部消费帐单
GET  /api/user/100/bill
复制代码
  1. 获取一个 user 指定时间的消费帐单
GET  /api/user/100/bill?from=201910&to=201911
复制代码

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

3、Nodejs 实现 RESTful API

1. 初始化 mock 数据

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

{
   "user1" : {
      "name" : "leo",
      "password" : "123456",
      "profession" : "teacher",
      "id": 1
   },
   "user2" : {
      "name" : "pingan8787",
      "password" : "654321",
      "profession" : "librarian",
      "id": 2
   },
   "user3" : {
      "name" : "robin",
      "password" : "888888",
      "profession" : "clerk",
      "id": 3
   }
}
复制代码

咱们将实现如下 RESTful API :

2. 获取用户列表

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

// index.js
const express = require('express');
const app = express();
const fs = require("fs");

// 定义 读取用户的信息列表 的接口
app.get('/user', (req, res) => {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
       console.log( data );
       res.end( data );
   });
})

const server = app.listen(8081, function () {
    const {address, port} = server.address();
    console.log("server run in: http://%s:%s", address, port);
})
复制代码

3. 添加用户

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

// index.js
// 省略以前文件 只展现须要实现的接口

// mock 一条要新增的数据
const user = {
   "user4" : {
      "name" : "pingan",
      "password" : "password4",
      "profession" : "teacher",
      "id": 4
   }
}

// 定义 添加用户记录 的接口
app.post('/user', (req, res) => {
   // 读取已存在的数据
   fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
       data = JSON.parse( data );
       data["user4"] = user["user4"];
       console.log( data );
       res.end( JSON.stringify(data));
   });
})
复制代码

4. 获取用户详情

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

// index.js
// 省略以前文件 只展现须要实现的接口

// 定义 获取指定用户详情 的接口
app.get('/:id', (req, res) => {
   // 首先咱们读取已存在的用户
   fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
       data = JSON.parse( data );
       const user = data["user" + req.params.id] 
       console.log( user );
       res.end( JSON.stringify(user));
   });
})
复制代码

5. 删除指定用户

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

// index.js
// 省略以前文件 只展现须要实现的接口

// mock 一条要删除的用户id
const id = 2;

app.delete('/user', (req, res) => {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
       data = JSON.parse( data );
       delete data["user" + id];
       console.log( data );
       res.end( JSON.stringify(data));
   });
})
复制代码

参考资料

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

关于我

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

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

微信公众号

bg
相关文章
相关标签/搜索