摘要:實(shí)現(xiàn)與它們所提供的服務(wù)是解耦的,這促進(jìn)了獨(dú)立的可進(jìn)化性。正確的情況返回與響應(yīng)碼,在錯(cuò)誤的情況下他們通常返回或。示例用于刪除由標(biāo)識(shí)的資源。成功刪除返回及響應(yīng)正文或沒有正文響應(yīng)。客戶不存在,不合法資源命名一切在工藝軟件開發(fā)的命名是成功的關(guān)鍵。
什么是 REST?
REST 即表述性狀態(tài)傳遞(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構(gòu)風(fēng)格(http://www.ics.uci.edu/~field...)。它是一種針對(duì)網(wǎng)絡(luò)應(yīng)用的設(shè)計(jì)和開發(fā)方式,可以降低開發(fā)的復(fù)雜性,提高系統(tǒng)的可伸縮性。
六個(gè)約束:統(tǒng)一接口(Uniform Interface)
無狀態(tài)(Stateless)
緩存(Cacheable)
客戶-服務(wù)器(Client-Server)
分層系統(tǒng)(Layered System)
按需代碼(Code on Demand)
統(tǒng)一接口(Uniform Interface)使REST 架構(gòu)風(fēng)格區(qū)別于其他基于網(wǎng)絡(luò)的架構(gòu)風(fēng)格的核心特征是,它強(qiáng)調(diào)組件之間要有一個(gè)統(tǒng)一的接口。通過在組件接口上應(yīng)用通用性的軟件工程原則,整體的系統(tǒng)架構(gòu)得到了簡化,交互的可見性也得到了改善。實(shí)現(xiàn)與它們所提供的服務(wù)是解耦的,這促進(jìn)了獨(dú)立的可進(jìn)化性。然而,付出的代價(jià)是,統(tǒng)一接口降低了效率,因?yàn)樾畔⒍际褂脴?biāo)準(zhǔn)化的形式來轉(zhuǎn)移,而不能使用特定于應(yīng)用的需求的形式。REST 接口被設(shè)計(jì)為可以高效地轉(zhuǎn)移大粒度的超媒體數(shù)據(jù),并針對(duì)Web的常見情況做了優(yōu)化,但是這也導(dǎo)致了該接口對(duì)于其他形式的架構(gòu)交互并不是最優(yōu)的。
無狀態(tài)(Stateless)通信必須在本質(zhì)上是無狀態(tài)的,因此從客戶到服務(wù)器的每個(gè)請(qǐng)求都必須包含理解該請(qǐng)求所必需的所有信息,不能利用任何存儲(chǔ)在服務(wù)器上的上下文,會(huì)話狀態(tài)因此要全部保存在客戶端。
緩存(Cacheable)為了改善網(wǎng)絡(luò)的效率。緩存約束要求一個(gè)請(qǐng)求的響應(yīng)中的數(shù)據(jù)被隱式地或顯式地標(biāo)記為可緩存的或不可緩存的。如果響應(yīng)是可緩存的,那么客戶端緩存就可以為以后的相同請(qǐng)求重用這個(gè)響應(yīng)的數(shù)據(jù)。
客戶-服務(wù)器(Client-Server)通過分離用戶接口和數(shù)據(jù)存儲(chǔ)這兩個(gè)關(guān)注點(diǎn),我們改善了用戶接口跨多個(gè)平臺(tái)的可移植性;同時(shí)通過簡化服務(wù)器組件,改善了系統(tǒng)的可伸縮性。然而,對(duì)于 Web來說,最重要的是這種關(guān)注點(diǎn)的分離允許組件獨(dú)立地進(jìn)化,從而支持多個(gè)組織領(lǐng)域的Internet規(guī)模的需求。
分層系統(tǒng)(Layered System)分層系統(tǒng)風(fēng)格通過限制組件的行為(即,每個(gè)組件只能“看到”與其交互的緊鄰層),將架構(gòu)分解為若干等級(jí)的層。通過將組件對(duì)系統(tǒng)的知識(shí)限制在單一層內(nèi),為整個(gè)系統(tǒng)的復(fù)雜性設(shè)置了邊界,并且提高了底層獨(dú)立性。我們能夠使用層來封裝遺留的服務(wù),使新的服務(wù)免受遺留客戶端的影響,通過將不常用的功能轉(zhuǎn)移到一個(gè)共享的中間組件中,從而簡化組件的實(shí)現(xiàn)。中間組件還能夠通過支持跨多個(gè)網(wǎng)絡(luò)和處理器的負(fù)載均衡,來改善系統(tǒng)的可伸縮性。
按需代碼(Code on Demand)通過減少必須被預(yù)先實(shí)現(xiàn)的功能的數(shù)目,簡化了客戶端的開發(fā)。允許在部署之后下載功能代碼也改善了系統(tǒng)的可擴(kuò)展性。然而,這也降低了可見性,因此它只是 REST 的一個(gè)可選的約束。
HTTP 動(dòng)作 GETHTTP GET 用于檢索(讀取)資源。正確的情況返回JSON與200 HTTP響應(yīng)碼,在錯(cuò)誤的情況下他們通常返回404(NOT FOUND)或400(BAD REQUEST)。
示例
GET http://www.example.com/custom...
GET http://www.example.com/custom...
GET http://www.example.com/bucket...
通過GET它應(yīng)該永遠(yuǎn)不會(huì)修改服務(wù)器上的任何資源。
POSTHTTP POST 通常用于創(chuàng)建資源。正確的情況返回201 HTTP響應(yīng)碼及Location header(資源 URI)。
PUT示例
POST http://www.example.com/customers
POST http://www.example.com/custom...
HTTP PUT 通常用于更新資源。將請(qǐng)求正文內(nèi)容替換已知資源的原始數(shù)據(jù)。
DELETE示例
PUT http://www.example.com/custom...
PUT http://www.example.com/custom...
HTTP DELETE 用于刪除由URI標(biāo)識(shí)的資源。成功刪除返回200 HTTP及響應(yīng)正文或沒有正文響應(yīng)204 HTTP(NO CONTENT)。
示例
DELETE http://www.example.com/custom...
DELETE http://www.example.com/custom...
DELETE http://www.example.com/bucket...
下表是 URI 結(jié)合 HTTP METHOD 建議的返回值
HTTP Verb(Method) | /customers | /customers/{id} |
GET | 200 (OK)??蛻袅斜?,數(shù)據(jù)量大可使用分頁排序篩選 | 200 (OK)。單個(gè)客戶。404 (Not Found) ID客戶不存在,400 (BAD REQUEST) ID不合法 |
POST | 201 (Created),"Location" header 為 /customers/{id} 包含新的資源ID | 404 (Not Found) |
PUT | 404 (Not Found) | 200 (OK)或者204 (No Content)。404 (Not Found) ID客戶不存在,400 (BAD REQUEST) ID不合法 |
DELETE | 404 (Not Found) | 200 (OK)或者204 (No Content)。404 (Not Found) ID客戶不存在,400 (BAD REQUEST) ID不合法 |
一切在工藝軟件開發(fā)的命名是成功的關(guān)鍵。
除了適當(dāng)?shù)膽?yīng)用 HTTP Verb(Method),資源命名可以說是最受爭議和最重要的概念。當(dāng)資源被命名好時(shí),API 是直觀和易于使用的。做得太差,同樣的 API 能感覺太表面化和難以使用和理解。下面是一些提示,讓你去當(dāng)創(chuàng)建資源 URI 為您新的 API。
資源 URI 應(yīng)使用名詞而不是動(dòng)詞命名。一個(gè) RESTful URI 應(yīng)該指一種資源,而不是采取行動(dòng)。名詞具有屬性而動(dòng)詞沒有。
服務(wù)套件中每個(gè)資源至少有一個(gè) URI 標(biāo)識(shí)它。URI 應(yīng)遵循一種可預(yù)見,分層結(jié)構(gòu),以增加可理解性,從而提高可用性。
在一個(gè)訂單系統(tǒng)與客戶、訂單、行項(xiàng)目的資源設(shè)計(jì):
創(chuàng)建一個(gè)新的客戶
POST http://www.example.com/customers
讀取客戶 ID 為 33245
GET http://www.example.com/custom...
相同的 URI 將用于更新(PUT)與刪除(DELETE)客戶
這里為產(chǎn)品設(shè)計(jì)的 URI:
POST http://www.example.com/products
創(chuàng)建一個(gè)新的產(chǎn)品
GET|PUT|DELETE http://www.example.com/produc...
讀取、更新、刪除 ID 為 66432 的產(chǎn)品為
現(xiàn)在變得很有趣,我們?nèi)绾螢榭蛻魟?chuàng)建新的訂單?
一種選擇是
POST http://www.example.com/orders
毫無疑問它是可以工作的,但它卻在客戶的上下文之外下面的 URI 更清晰
POST http://www.example.com/custom...
現(xiàn)在我們知道這個(gè)訂單是為客戶 33245 創(chuàng)建的獲取 33245 客戶訂單使用如下 URI
GET http://www.example.com/custom...
現(xiàn)在,我們繼續(xù)來看分層的 URI 設(shè)計(jì)。如下:
POST http://www.example.com/custom...
這會(huì)將行項(xiàng)目添加到訂單 #8769(這是客戶 #33245),獲取該 URI 資源會(huì)返回訂單下所有的行項(xiàng)目,如果行項(xiàng)目毫無意義或者在客戶的上下文以外的地方能感覺到我們會(huì)提供這樣一個(gè) URI
POST www.example.com/orders/8769/lineitems
Response Body 簡單響應(yīng)看看一些廣泛使用的 API 來得到資源命名竅門和利用你的隊(duì)友來完善您的 API 資源。
Twitter: https://dev.twitter.com/docs/api
Facebook: http://developers.facebook.co...
LinkedIn: https://developer.linkedin.co...
GitHub: https://developer.github.com/v3/
分頁響應(yīng)示例
{ "url":"https://api.github.com/gists/20c98223d9b59e1d48e5", "id":"1", "description":"description of gist", "public":true, "user":{ "login":"octocat", "id":1, "avatar_url":"https://github.com/images/error/octocat_happy.gif", "gravatar_id":"somehexcode", "url":"https://api.github.com/users/octocat" }, "comments":0, "comments_url":"https://api.github.com/gists/19d18b30e8af75090307/comments/", "html_url":"https://gist.github.com/1", "git_pull_url":"git://gist.github.com/1.git", "git_push_url":"[email protected]:1.git", "created_at":"2010-04-14T02:15:15Z" }
total_count 總記錄數(shù)
items 數(shù)據(jù)項(xiàng)
錯(cuò)誤響應(yīng)示例
{ "total_count":40, "items":[ { "id":3081286, "name":"Tetris", "full_name":"dtrupenn/Tetris", "owner":{ "login":"dtrupenn", "id":872147, "type":"User" }, "private":false, "html_url":"https://github.com/dtrupenn/Tetris", "description":"A C implementation of Tetris using Pennsim through LC4", "fork":false, "url":"https://api.github.com/repos/dtrupenn/Tetris", "created_at":"2012-01-01T00:31:50Z", "updated_at":"2013-01-05T17:58:47Z", "pushed_at":"2012-01-01T00:37:02Z" } ] }
code 錯(cuò)誤碼
message 錯(cuò)誤信息
參考資源示例
{ "code": 12345, "message": "錯(cuò)誤描述" }
http://www.restapitutorial.com/
https://www.oschina.net/trans...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67438.html
摘要:其他交互一般會(huì)遵循一些數(shù)據(jù)結(jié)構(gòu)協(xié)議或者狀態(tài)值,比如不同的操作結(jié)果對(duì)應(yīng)不同的狀態(tài)值,且出錯(cuò)會(huì)返回指定的錯(cuò)誤信息方便前端進(jìn)行提示等。 RESTful這種架構(gòu)已經(jīng)具有很長的時(shí)間和歷程了,但似乎最近restful這個(gè)詞出現(xiàn)的頻率特別高,目前不是很清楚是因?yàn)槲易詡€(gè)兒現(xiàn)在是以restful風(fēng)格寫程序產(chǎn)生的孕婦效應(yīng),還是單頁面程序開發(fā)的流行造成的。 其實(shí)一開始我也是不想寫這篇文章的,因?yàn)榫W(wǎng)絡(luò)上與re...
摘要:路由設(shè)計(jì)路由設(shè)計(jì)以用戶注冊(cè)為例介紹如何閉環(huán)用戶注冊(cè)開發(fā)注意點(diǎn)使用郵箱注冊(cè)驗(yàn)證郵箱是否注冊(cè)目前真實(shí)開發(fā)業(yè)務(wù)大部分都是手機(jī)號(hào)注冊(cè),這塊由于沒有購買短信服務(wù)首先,在文件夾下新建上圖中對(duì)應(yīng)真實(shí)業(yè)務(wù)邏輯現(xiàn)附上業(yè)務(wù)實(shí)現(xiàn)代碼加密國際化工具類用戶服務(wù) 路由設(shè)計(jì) 路由設(shè)計(jì) 以用戶注冊(cè)為例介紹如何閉環(huán)用戶注冊(cè)開發(fā)注意點(diǎn):(1)使用郵箱注冊(cè)(2)驗(yàn)證郵箱是否注冊(cè) 【目前真實(shí)開發(fā)業(yè)務(wù)大部分都是手機(jī)號(hào)注冊(cè),這塊...
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開發(fā) API 實(shí)戰(zhàn),讓 API 開發(fā)更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項(xiàng)目中使用 - API 文檔撰寫方案 推薦 Laravel API 項(xiàng)目必須使用的 8 個(gè)...
摘要:則是目前比較成熟的一套互聯(lián)網(wǎng)應(yīng)用程序的設(shè)計(jì)理論。則允許操作,不一樣,報(bào)錯(cuò)返回或者加入黑名單。再看下我們的數(shù)據(jù)庫中的用戶信息,值也被存入了進(jìn)來,便于我們之后進(jìn)行權(quán)限驗(yàn)證。訪問同時(shí)將我們的值在中以傳入正確獲得用戶名則表示我們?cè)L問請(qǐng)求通過了驗(yàn)證。 showImg(https://segmentfault.com/img/remote/1460000008629635?w=800&h=534)...
摘要:則是目前比較成熟的一套互聯(lián)網(wǎng)應(yīng)用程序的設(shè)計(jì)理論。則允許操作,不一樣,報(bào)錯(cuò)返回或者加入黑名單。再看下我們的數(shù)據(jù)庫中的用戶信息,值也被存入了進(jìn)來,便于我們之后進(jìn)行權(quán)限驗(yàn)證。訪問同時(shí)將我們的值在中以傳入正確獲得用戶名則表示我們?cè)L問請(qǐng)求通過了驗(yàn)證。 showImg(https://segmentfault.com/img/remote/1460000008629635?w=800&h=534)...
摘要:通常情況下,偽都是基于第一層次與第二層次設(shè)計(jì)的。為了解決這個(gè)版本不兼容問題,在設(shè)計(jì)的一種實(shí)用的做法是使用版本號(hào)。例如,建議第三位版本號(hào)通常表示兼容升級(jí),只有不兼容時(shí)才需要變更服務(wù)版本。 原文地址:梁桂釗的博客 博客地址:blog.720ui.com 歡迎關(guān)注公眾號(hào):「服務(wù)端思維」。一群同頻者,一起成長,一起精進(jìn),打破認(rèn)知的局限性。 有一段時(shí)間沒怎么寫文章了,今天提筆寫一篇自己對(duì) API 設(shè)...
閱讀 1839·2021-11-11 16:55
閱讀 761·2019-08-30 15:53
閱讀 3600·2019-08-30 15:45
閱讀 748·2019-08-30 14:10
閱讀 3277·2019-08-30 12:46
閱讀 2134·2019-08-29 13:15
閱讀 2035·2019-08-26 13:48
閱讀 943·2019-08-26 12:23