摘要:表述性狀態(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
GET 獲取數(shù)據(jù)
PUT 用于更新和添加數(shù)據(jù)
DELETE 用于刪除數(shù)據(jù)
POST 添加數(shù)據(jù)
一種基于http的架構(gòu)方式
資源與URLREStful全稱(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ù)名下的
使用-或者_(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)系
指一次或者多次請(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í)具有冪等性
安全且冪等,表示一種獲取的表示,會(huì)有緩存
POST不安全且不冪等,使用服務(wù)器端的管理的實(shí)例號(hào)生成資源,創(chuàng)建子資源,用于部分更新資源,如果沒(méi)有修改則不會(huì)更新資源(一種樂(lè)觀鎖的表示)
PUTPUT不安全且冪等。用客戶(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ā)。
Github
推特
basecamp
Groupon
yellowpages
為博客增加一個(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表述如下
URL里帶上版本號(hào)
URL后綴區(qū)分表述格式
超鏈接即狀態(tài)引擎。
在表述格式里加入連接引導(dǎo)客戶(hù)端。即這種鏈接稱(chēng)為流通性
以github為例
狀態(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)的信息。
會(huì)話(huà)狀態(tài)不是作為資源狀態(tài)保存在服務(wù)器端的,而是被客戶(hù)端作為應(yīng)用狀態(tài)進(jìn)行跟蹤的??蛻?hù)端的應(yīng)用在服務(wù)器端指引的超鏈接指引下發(fā)生變遷。
為一種架構(gòu)模式
創(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ì)信息 |
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í)完成了一部分
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文件中
/*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ù)
/*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ò)增刪查改,引起資源狀態(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)越流行,特別是...
摘要:滿(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)約...
摘要:一什么是架構(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博...
摘要:方法和對(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年的博士論文中提出...
摘要:實(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...
閱讀 3226·2021-11-23 09:51
閱讀 3571·2021-11-09 09:46
閱讀 3679·2021-11-09 09:45
閱讀 2951·2019-08-29 17:31
閱讀 1870·2019-08-26 13:39
閱讀 2729·2019-08-26 12:12
閱讀 3627·2019-08-26 12:08
閱讀 2244·2019-08-26 11:31