成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Restful 表述性狀態(tài)傳遞

Eirunye / 1779人閱讀

摘要:表述性狀態(tài)傳遞通?;谑褂?,,,。使用的數(shù)據(jù)格式為方法獲取數(shù)據(jù)用于更新和添加數(shù)據(jù)用于刪除數(shù)據(jù)添加數(shù)據(jù)一種基于的架構(gòu)方式資源與全稱(chēng)為表述性狀態(tài)轉(zhuǎn)移??蛻?hù)端維護(hù)應(yīng)用狀態(tài)。是保存一些服務(wù)器不依賴(lài)于會(huì)話(huà)狀態(tài)即可依賴(lài)的信息。

Restful
REST表述性狀態(tài)傳遞
REST通?;谑褂肏TTP,URL,XML,HTML。
REST使用的數(shù)據(jù)格式為JSON

HTTP方法

GET 獲取數(shù)據(jù)
PUT 用于更新和添加數(shù)據(jù)
DELETE 用于刪除數(shù)據(jù)
POST 添加數(shù)據(jù)

RESTful

一種基于http的架構(gòu)方式

資源與URL

REStful全稱(chēng)為表述性狀態(tài)轉(zhuǎn)移。任何事物只要有被引用的必要都為資源。資源可以為實(shí)體,可以為抽象的概念。

資源舉例

用戶(hù)的手機(jī)號(hào)
用戶(hù)的個(gè)人信息
用戶(hù)手機(jī)潛在的價(jià)值
資源要被識(shí)別,要有唯一的標(biāo)識(shí)。
URL可以看成資源的地址,可以看成資源的名稱(chēng)。
以github舉例
倉(cāng)庫(kù)地址 https://github.com/mySoul8012...
個(gè)人信息地址 https://github.com/mySoul8012
看URL可知倉(cāng)庫(kù)是在那個(gè)用戶(hù)名下的

一些設(shè)計(jì)技巧

使用-或者_(dá)來(lái)進(jìn)行資源的分割
使用/來(lái)表示資源的層級(jí)關(guān)系
使用?將資源進(jìn)行過(guò)濾 /pulls?state=closed 表示已經(jīng)關(guān)閉的推送請(qǐng)求,URL對(duì)應(yīng)的是一種特定的查詢(xún)結(jié)果。
.或者:表示同級(jí)的資源關(guān)系

統(tǒng)一的資源接口 冪等

指一次或者多次請(qǐng)求一個(gè)資源的時(shí)候,應(yīng)該具有相同的副作用。屬于語(yǔ)義化的一個(gè)詞
HTTP協(xié)議是一種面向資源的應(yīng)用層協(xié)議
GET用于獲取資源,不應(yīng)該有副作用,所以稱(chēng)為其冪等性,例如請(qǐng)求一個(gè)資源的時(shí)候,不會(huì)改變其狀態(tài),此時(shí)說(shuō)明GET具有冪等性
HTTP的DELETE,會(huì)刪除資源,此時(shí)具有副作用,但是多次的副作用是相同的,還是具有其冪等性
POST為創(chuàng)建一個(gè)資源,每次副作用都是不同的,即沒(méi)有冪等性
PUT為更新資源,對(duì)于同一個(gè)URL一次和多次的是相同的,此時(shí)具有冪等性

GET

安全且冪等,表示一種獲取的表示,會(huì)有緩存

POST

不安全且不冪等,使用服務(wù)器端的管理的實(shí)例號(hào)生成資源,創(chuàng)建子資源,用于部分更新資源,如果沒(méi)有修改則不會(huì)更新資源(一種樂(lè)觀鎖的表示)

PUT

PUT不安全且冪等。用客戶(hù)端管理的實(shí)例,創(chuàng)建一個(gè)資源,通過(guò)替換的方式更新資源

DELETE

不安全但是冪等

四種總結(jié)

四種tcp方式,都是不安全,因?yàn)槎际敲魑膫鬏?,需要使用https,完成加密,防止被抓包

一些問(wèn)題 一個(gè)框架 rails

官方網(wǎng)站 https://rubyonrails.org/
或者名為 Ruby on Rails
一種基于Ruby語(yǔ)言即面向?qū)ο螅钍?,函?shù)式,動(dòng)態(tài)的通用編程語(yǔ)言,由日本科學(xué)家發(fā)明。特點(diǎn)是函數(shù)式編程
這是一個(gè)開(kāi)源的web應(yīng)用框架,嚴(yán)格按照MVC架構(gòu)開(kāi)發(fā)。

應(yīng)用

Github
推特
basecamp
Groupon
yellowpages

POST和PUT

為博客增加一個(gè)Java分類(lèi),生成的路徑名為/categories/java 采用PUT方法,完成更新,因?yàn)榇藭r(shí)是由客戶(hù)端決定的

客戶(hù)端不一定支持HTTP方法

rails 框架是通過(guò)隱藏參數(shù)的方法,達(dá)到傳遞真實(shí)請(qǐng)求的方式

資源的表述

客戶(hù)端獲取的只是資源的表述。即資源的外在表現(xiàn)。
資源的表述包括數(shù)據(jù)和描述數(shù)據(jù)的元數(shù)據(jù)。
通過(guò)HTTP內(nèi)容的協(xié)商,客戶(hù)端通過(guò)頭部信息達(dá)到
以github為例,JSON表述如下

一些常見(jiàn)的表述

URL里帶上版本號(hào)
URL后綴區(qū)分表述格式

處理不支持的表述格式

資源的鏈接

超鏈接即狀態(tài)引擎。
在表述格式里加入連接引導(dǎo)客戶(hù)端。即這種鏈接稱(chēng)為流通性
以github為例

狀態(tài)的轉(zhuǎn)移 應(yīng)用狀態(tài)和資源狀態(tài)

狀態(tài)應(yīng)該區(qū)分應(yīng)用狀態(tài)和資源狀態(tài)。
客戶(hù)端維護(hù)應(yīng)用狀態(tài)。
服務(wù)端維護(hù)資源狀態(tài)。
客戶(hù)端和服務(wù)端交互必須是無(wú)狀態(tài)的。
Cookie是保存一些服務(wù)器不依賴(lài)于會(huì)話(huà)狀態(tài)即可依賴(lài)的信息。

應(yīng)用狀態(tài)的轉(zhuǎn)移

會(huì)話(huà)狀態(tài)不是作為資源狀態(tài)保存在服務(wù)器端的,而是被客戶(hù)端作為應(yīng)用狀態(tài)進(jìn)行跟蹤的??蛻?hù)端的應(yīng)用在服務(wù)器端指引的超鏈接指引下發(fā)生變遷。
為一種架構(gòu)模式

創(chuàng)建RESTful

創(chuàng)建一個(gè)JSON數(shù)據(jù)資源文件

{
    "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
    },
}

即根據(jù)JSON文件有以下api

序號(hào) Url Http方法 發(fā)送內(nèi)容 結(jié)果
1 listUsers GET 顯示所有用戶(hù)列表
2 addUser POST JSON字符串 添加新用戶(hù)
3 deleteUsers DELETE JSON字符串 刪除用戶(hù)
4 id GET 顯示用戶(hù)詳細(xì)信息
獲取用戶(hù)列表
http://127.0.0.1:1937/listUsers
/*server.js*/
var express = require("express");    // 引入express框架
var app = express();
var fs = require("fs");     // 引入文件模塊

// 創(chuàng)建get請(qǐng)求
app.get("/listUsers", (req, res) => {
    fs.readFile(__dirname + "/" + "users.json", "utf8", (err, data) => {    // 讀取文件
        console.log( data );
        res.end(data);    // 將讀取到的內(nèi)容返回給客戶(hù)端
    });
});

// 啟動(dòng)server
var server = app.listen(1937, () => {
    console.log(server.address());
})

查看一下JSON數(shù)據(jù)

這樣暫時(shí)完成了一部分

添加用戶(hù)
JSON.parse有個(gè)小坑,最后不允許使用,作為結(jié)尾
/*server.js*/
var express = require("express");    // 引入express框架
var app = express();
var fs = require("fs");     // 引入文件模塊

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

// 創(chuàng)建get請(qǐng)求
app.get("/addUser", (req, res) => {
    // 讀取已存在的數(shù)據(jù)
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        if (err) {
            return console.log(err);
        };

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

// 啟動(dòng)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
    }
}

訪(fǎng)問(wèn) http://127.0.0.1:1937/addUser
返回的JSON數(shù)據(jù)

此時(shí)本地的JSON數(shù)據(jù)仍舊未發(fā)生改變,如果要其發(fā)生改變需要fs的寫(xiě)模塊,將JSON數(shù)據(jù)寫(xiě)入JSON文件中

顯示用戶(hù)詳情
/*server.js*/
var express = require("express");    // 引入express框架
var app = express();
var fs = require("fs");     // 引入文件模塊

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

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

// 創(chuàng)建添加用戶(hù)路由請(qǐng)求
app.get("/addUser", (req, res) => {
    // 讀取已存在的數(shù)據(jù)
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        if (err) {
            return console.log(err);
        };

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

// 添加顯示用戶(hù)詳情路由
app.get("/:id", (req, res) => {
    // 首先讀取已存在的用戶(hù)
    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) );
    })
})

// 啟動(dòng)server
var server = app.listen(1937, () => {
    console.log(server.address());
})

查看瀏覽器得到的JSON數(shù)據(jù)

刪除用戶(hù)
/*server.js*/
var express = require("express");    // 引入express框架
var app = express();
var fs = require("fs");     // 引入文件模塊


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

// 創(chuàng)建添加用戶(hù)路由請(qǐng)求
app.get("/addUser", (req, res) => {
    // 讀取已存在的數(shù)據(jù)
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        if (err) {
            return console.log(err);
        };

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

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

// 添加顯示用戶(hù)詳情路由
app.get("/:id", (req, res) => {
    // 首先讀取已存在的用戶(hù)
    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();    // 不清楚為什么這里要重新定義?
// 刪除用戶(hù)
app.get("/deleteUser", (req, res) => {

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

// 啟動(dòng)server
var server = app.listen(1937, () => {
    console.log(server.address());
})

不清楚為什么要重新定義一個(gè)類(lèi)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96400.html

相關(guān)文章

  • 那些年,我們一起誤解過(guò)的REST

    摘要:通過(guò)增刪查改,引起資源狀態(tài)的改變,稱(chēng)為狀態(tài)轉(zhuǎn)移。用于獲取資源的元信息。方法與方法類(lèi)似,都可以查詢(xún)資源的元信息放在的,但不會(huì)返回資源的表述。表示請(qǐng)求有問(wèn)題,如參數(shù)錯(cuò)誤等。表示當(dāng)前請(qǐng)求的某前置條件不符合。網(wǎng)關(guān)錯(cuò)誤,從上游服務(wù)器收到無(wú)效響應(yīng)。 歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~ 本文由sammyshen 發(fā)表于云+社區(qū)專(zhuān)欄 最近幾年REST API越來(lái)越流行,特別是...

    DesGemini 評(píng)論0 收藏0
  • Spring Boot 2.x(十):構(gòu)建優(yōu)雅的RESTful接口

    摘要:滿(mǎn)足這些約束條件和原則的應(yīng)用程序或設(shè)計(jì)就是。需要注意的是,是設(shè)計(jì)風(fēng)格而不是標(biāo)準(zhǔn)。同一個(gè)路徑,因?yàn)檎?qǐng)求方式的不同,而去找尋不同的接口,完成對(duì)資源狀態(tài)的轉(zhuǎn)變。一個(gè)符合風(fēng)格的就可以稱(chēng)之一個(gè)的接口。 RESTful 相信在座的各位對(duì)于RESTful都是略有耳聞,那么RESTful到底是什么呢? REST(Representational State Transfer)表述性狀態(tài)轉(zhuǎn)移是一組架構(gòu)約...

    nevermind 評(píng)論0 收藏0
  • 理解RESTful架構(gòu)與json-server模擬REST api的使用

    摘要:一什么是架構(gòu)即的縮寫(xiě),我們把他翻譯為表述性狀態(tài)傳遞,是博士在年他的博士論文中提出來(lái)的一種軟件架構(gòu)風(fēng)格。是個(gè)無(wú)狀態(tài)的協(xié)議,所以狀態(tài)就保存在服務(wù)器端。只要少量的數(shù)據(jù)就可使用,支持和。同時(shí)支持,同時(shí)提供一系列的查詢(xún)方法如。 一、什么是RESTful架構(gòu)? REST即Representational State Transfer的縮寫(xiě),我們把他翻譯為表述性狀態(tài)傳遞,是Roy Fielding博...

    Atom 評(píng)論0 收藏0
  • SpringMVC+RestFul詳細(xì)示例實(shí)戰(zhàn)教程(實(shí)現(xiàn)跨域訪(fǎng)問(wèn))

    摘要:方法和對(duì)應(yīng)的方法定義定義重啟服務(wù)器,運(yùn)行上面的程序。五添加支持實(shí)現(xiàn)跨域訪(fǎng)問(wèn)當(dāng)訪(fǎng)問(wèn)時(shí),你可能需要面對(duì)同源策略問(wèn)題。錯(cuò)誤如下一般來(lái)說(shuō),在服務(wù)器端,我們?cè)陧憫?yīng)中返回額外的訪(fǎng)問(wèn)控制頭,實(shí)現(xiàn)跨域鏈接。 一、理解 REST REST(Representational State Transfer),中文翻譯叫表述性狀態(tài)轉(zhuǎn)移。是 Roy Thomas Fielding 在他2000年的博士論文中提出...

    U2FsdGVkX1x 評(píng)論0 收藏0
  • RESTful API 實(shí)踐

    摘要:實(shí)現(xiàn)與它們所提供的服務(wù)是解耦的,這促進(jìn)了獨(dú)立的可進(jìn)化性。正確的情況返回與響應(yīng)碼,在錯(cuò)誤的情況下他們通常返回或。示例用于刪除由標(biāo)識(shí)的資源。成功刪除返回及響應(yīng)正文或沒(méi)有正文響應(yīng)??蛻?hù)不存在,不合法資源命名一切在工藝軟件開(kāi)發(fā)的命名是成功的關(guān)鍵。 什么是 REST? REST 即表述性狀態(tài)傳遞(英文:Representational State Transfer,簡(jiǎn)稱(chēng)REST)是Roy Fie...

    dayday_up 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<