【全棧修煉】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
相關文章
相關標籤/搜索