Restful 表述性狀態傳遞

Restful
REST表述性狀態傳遞
REST一般基於使用HTTP,URL,XML,HTML。
REST使用的數據格式爲JSONjava

HTTP方法

GET 獲取數據
PUT 用於更新和添加數據
DELETE 用於刪除數據
POST 添加數據git

RESTful

一種基於http的架構方式github

資源與URL

REStful全稱爲表述性狀態轉移。任何事物只要有被引用的必要都爲資源。資源能夠爲實體,能夠爲抽象的概念。web

資源舉例

用戶的手機號
用戶的我的信息
用戶手機潛在的價值
資源要被識別,要有惟一的標識。
URL能夠當作資源的地址,能夠當作資源的名稱。
以github舉例
倉庫地址 https://github.com/mySoul8012...
我的信息地址 https://github.com/mySoul8012
看URL可知倉庫是在那個用戶名下的express

一些設計技巧

使用-或者_來進行資源的分割
使用/來表示資源的層級關係
使用?將資源進行過濾 /pulls?state=closed 表示已經關閉的推送請求,URL對應的是一種特定的查詢結果。
.或者:表示同級的資源關係編程

統一的資源接口

冪等

指一次或者屢次請求一個資源的時候,應該具備相同的反作用。屬於語義化的一個詞
HTTP協議是一種面向資源的應用層協議
GET用於獲取資源,不該該有反作用,因此稱爲其冪等性,例如請求一個資源的時候,不會改變其狀態,此時說明GET具備冪等性
HTTP的DELETE,會刪除資源,此時具備反作用,可是屢次的反作用是相同的,仍是具備其冪等性
POST爲建立一個資源,每次反作用都是不一樣的,即沒有冪等性
PUT爲更新資源,對於同一個URL一次和屢次的是相同的,此時具備冪等性json

GET

安全且冪等,表示一種獲取的表示,會有緩存api

POST

不安全且不冪等,使用服務器端的管理的實例號生成資源,建立子資源,用於部分更新資源,若是沒有修改則不會更新資源(一種樂觀鎖的表示)瀏覽器

PUT

PUT不安全且冪等。用客戶端管理的實例,建立一個資源,經過替換的方式更新資源緩存

DELETE

不安全可是冪等

四種總結

四種tcp方式,都是不安全,由於都是明文傳輸,須要使用https,完成加密,防止被抓包

一些問題

一個框架 rails

官方網站 https://rubyonrails.org/
或者名爲 Ruby on Rails
一種基於Ruby語言即面向對象,命令式,函數式,動態的通用編程語言,由日本科學家發明。特色是函數式編程
這是一個開源的web應用框架,嚴格按照MVC架構開發。

應用

Github
推特
basecamp
Groupon
yellowpages

POST和PUT

爲博客增長一個Java分類,生成的路徑名爲/categories/java 採用PUT方法,完成更新,由於此時是由客戶端決定的

客戶端不必定支持HTTP方法

rails 框架是經過隱藏參數的方法,達到傳遞真實請求的方式

資源的表述

客戶端獲取的只是資源的表述。即資源的外在表現。
資源的表述包括數據和描述數據的元數據。
經過HTTP內容的協商,客戶端經過頭部信息達到
以github爲例,JSON表述以下
此處輸入圖片的描述

一些常見的表述

URL裏帶上版本號
URL後綴區分表述格式

處理不支持的表述格式

此處輸入圖片的描述

資源的連接

超連接即狀態引擎。
在表述格式里加入鏈接引導客戶端。即這種連接稱爲流通性
以github爲例
此處輸入圖片的描述

狀態的轉移

應用狀態和資源狀態

狀態應該區分應用狀態和資源狀態。
客戶端維護應用狀態。
服務端維護資源狀態。
客戶端和服務端交互必須是無狀態的。
Cookie是保存一些服務器不依賴於會話狀態便可依賴的信息。

應用狀態的轉移

會話狀態不是做爲資源狀態保存在服務器端的,而是被客戶端做爲應用狀態進行跟蹤的。客戶端的應用在服務器端指引的超連接指引下發生變遷。
爲一種架構模式

建立RESTful

建立一個JSON數據資源文件

{
    "user1": {
        "name": "mahesh",
        "password": "password",
        "profession": "teacher",
        "id": 1
    },
    "user2": {
        "name": "suresh",
        "password": "password2",
        "profession": "libraian",
        "id": 2
    },
    "user3": {
        "name": "ramesh",
        "password": "password3",
        "profession": "clerk",
        "id": 3
    },
}

即根據JSON文件有如下api

序號 Url Http方法 發送內容 結果
1 listUsers GET 顯示全部用戶列表
2 addUser POST JSON字符串 添加新用戶
3 deleteUsers DELETE JSON字符串 刪除用戶
4 id GET 顯示用戶詳細信息

獲取用戶列表

http://127.0.0.1:1937/listUsers
/*server.js*/
var express = require('express');    // 引入express框架
var app = express();
var fs = require('fs');     // 引入文件模塊

// 建立get請求
app.get('/listUsers', (req, res) => {
    fs.readFile(__dirname + '/' + 'users.json', 'utf8', (err, data) => {    // 讀取文件
        console.log( data );
        res.end(data);    // 將讀取到的內容返回給客戶端
    });
});

// 啓動server
var server = app.listen(1937, () => {
    console.log(server.address());
})

查看一下JSON數據
此處輸入圖片的描述
這樣暫時完成了一部分

添加用戶

JSON.parse有個小坑,最後不容許使用,做爲結尾
/*server.js*/
var express = require('express');    // 引入express框架
var app = express();
var fs = require('fs');     // 引入文件模塊

// 添加用戶的數據
var user = {
    "user4": {
        "name":"mohit",
        "password":"password4",
        "profession":"teacher",
        "id":4
    }
}

// 建立get請求
app.get('/addUser', (req, res) => {
    // 讀取已存在的數據
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        if (err) {
            return console.log(err);
        };

        data = JSON.parse(data);    // 將傳入的JSON轉換爲對象格式
        data["user4"] = user["user4"];    
        console.log(data);
        res.end( JSON.stringify(data) );    // 將對象轉換成爲JSON格式
    });
});

// 啓動server
var server = app.listen(1937, () => {
    console.log(server.address());
})
{
    "user1": {
        "name": "mahesh",
        "password": "password",
        "profession": "teacher",
        "id": 1
    },
    "user2": {
        "name": "suresh",
        "password": "password2",
        "profession": "libraian",
        "id": 2
    },
    "user3": {
        "name": "ramesh",
        "password": "password3",
        "profession": "clerk",
        "id": 3
    }
}

訪問 http://127.0.0.1:1937/addUser
返回的JSON數據
此處輸入圖片的描述
此時本地的JSON數據仍舊未發生改變,若是要其發生改變須要fs的寫模塊,將JSON數據寫入JSON文件中

顯示用戶詳情

/*server.js*/
var express = require('express');    // 引入express框架
var app = express();
var fs = require('fs');     // 引入文件模塊

// 添加用戶的數據
var user = {
    "user4": {
        "name":"mohit",
        "password":"password4",
        "profession":"teacher",
        "id":4
    }
}

// 建立獲取用戶列表路由
app.get('/listUsers', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
       console.log( data );
       res.end( data );
   });
})

// 建立添加用戶路由請求
app.get('/addUser', (req, res) => {
    // 讀取已存在的數據
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        if (err) {
            return console.log(err);
        };

        data = JSON.parse(data);    // 將傳入的JSON轉換爲對象格式
        data["user4"] = user["user4"];    
        console.log(data);
        res.end( JSON.stringify(data) );    // 將對象轉換成爲JSON格式
    });
});

// 添加顯示用戶詳情路由
app.get('/:id', (req, res) => {
    // 首先讀取已存在的用戶
    fs.readFile( __dirname + '/' + "users.json", 'utf8', (err, data) => {
        data = JSON.parse( data );
        var user = data["user" + req.params.id]    // 獲取get獲得的值
        console.log( user );
        res.end( JSON.stringify(user) );
    })
})

// 啓動server
var server = app.listen(1937, () => {
    console.log(server.address());
})

查看瀏覽器獲得的JSON數據
此處輸入圖片的描述

刪除用戶

/*server.js*/
var express = require('express');    // 引入express框架
var app = express();
var fs = require('fs');     // 引入文件模塊


// 建立獲取用戶列表路由
app.get('/listUsers', (req, res) => {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
       console.log( data );
       res.end( data );
   });
})

// 建立添加用戶路由請求
app.get('/addUser', (req, res) => {
    // 讀取已存在的數據
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        if (err) {
            return console.log(err);
        };

        // 添加用戶
        var user = {
        "user4": {
        "name":"mohit",
        "password":"password4",
        "profession":"teacher",
        "id":4
                }
        }

        data = JSON.parse(data);    // 將傳入的JSON轉換爲對象格式
        data["user4"] = user["user4"];    
        console.log(data);
        res.end( JSON.stringify(data) );    // 將對象轉換成爲JSON格式
    });
});

// 添加顯示用戶詳情路由
app.get('/:id', (req, res) => {
    // 首先讀取已存在的用戶
    fs.readFile( __dirname + '/' + "users.json", 'utf8', (err, data) => {
        data = JSON.parse( data );
        var user = data["user" + req.params.id]    // 獲取get獲得的值
        console.log( user );
        res.end( JSON.stringify(user) );
    })
})

var app = express();    // 不清楚爲何這裏要從新定義?
// 刪除用戶
app.get('/deleteUser', (req, res) => {

   // 首先獲取用戶信息
   fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => {
       data = JSON.parse( data );
       delete data["user" + 2];
       
       console.log( data );
       res.end( JSON.stringify(data));
   });
})

// 啓動server
var server = app.listen(1937, () => {
    console.log(server.address());
})

不清楚爲何要從新定義一個類。

相關文章
相關標籤/搜索