摘要:因此,誤解幾乎是與之俱來的。這是完全錯誤的。就像所強(qiáng)調(diào)的,對于一個被稱作的來說,狀態(tài)轉(zhuǎn)移管理是一個必須要完成的需求。你可以將其稱為或是,但是請不要把它叫做。
2000年的時候,Douglas Crockford聲明JavaScript是最被誤解的編程語言。這種誤解來源于不良的命名規(guī)范,錯誤設(shè)計,非標(biāo)準(zhǔn)模式等等。因此,誤解幾乎是與之俱來的。
我也在關(guān)于Restful架構(gòu)上發(fā)表了一個相似的意見:REST是世界上被誤解最嚴(yán)重的架構(gòu)模式。
事實上,大多人認(rèn)為,創(chuàng)建一個RESTful API只需要基于URL和HTTP動詞。這是完全錯誤的。
這個誤解存在太久了。但是和JavaScript不同,REST規(guī)范講述的非常清晰。它的命名本身就強(qiáng)調(diào)了狀態(tài)的轉(zhuǎn)化,但是這個概念卻是所謂的RESTful API設(shè)計者們所最為忽視的。
如果你隨便問十個開發(fā)者,他們的API是否支持HATEOAS,至少九個人會睜大雙眼回答:你到底在說啥?
REST名字本身已經(jīng)解釋的很清楚了。REST并沒有指定使用的協(xié)議以及如何標(biāo)記一個資源。它強(qiáng)調(diào)的是表現(xiàn)層狀態(tài)轉(zhuǎn)移。就像Roy Fielding所強(qiáng)調(diào)的,對于一個被稱作RESTful的API來說,狀態(tài)轉(zhuǎn)移管理是一個必須要完成的需求。
一個真正的RESTful API會提供給客戶端一個新的狀態(tài),以及切換到后序狀態(tài)的方法。它提供了資源的表示(不一定用JSON的形式)和指向別的資源的富鏈接,如下所示:
{ "id": 463219, "firstName": "John", "lastName": "Smith", "company": "Acme Inc.", "salary": 72500, "links": [ { "href": "https://api.myapp.com/employees/employee/463219", "rel": "self" }, { "href": "https://api.myapp.com/companies/company/375", "rel": "company" }, { "href": "https://api.myapp.com/payments/employee/463219", "rel": "payments" } ] }
這里的資源進(jìn)行自我描述之后,提供了相關(guān)資源的鏈接。
不管你是使用HTTP協(xié)議還是其它的,REST方法的關(guān)鍵點(diǎn)在于由服務(wù)器進(jìn)行客戶狀態(tài)的轉(zhuǎn)化。客戶端的狀態(tài)幾乎完全是由服務(wù)器進(jìn)行轉(zhuǎn)化的。因此,API的版本也有其存在的意義。客戶對于RESTful接口的了解僅限于入口點(diǎn)。其它的應(yīng)該從解析服務(wù)器的響應(yīng)來獲取。這個場景很少有應(yīng)用能夠?qū)崿F(xiàn)。
單純的根據(jù)HTTP動詞進(jìn)行CRUD操作的API和狀態(tài)轉(zhuǎn)換沒有任何關(guān)系。你可以將其稱為WEB API或是HTTP API,但是請不要把它叫做RESTful。
詞匯補(bǔ)充
HATEOAS: Hypermedia As The Engine Of Application State
客戶端和服務(wù)端完全通過超媒體進(jìn)行交互。REST客戶端只需要對超媒體有一定的了解,無需知道別的信息。
REST客戶端從一個簡單且固定的URL進(jìn)入REST應(yīng)用??蛻舳酥笏龅娜魏尾僮鞫纪ㄟ^服務(wù)器返回的資源決定。
比如,你發(fā)出這樣一個HTTP請求,試圖獲取賬號為12345的信息:
GET /accounts/12345 HTTP/1.1 Host: bank.example.com Accept: application/xml ...
得到的響應(yīng)是一個XML形式的信息如下:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: ...12345 100.00
這個響應(yīng)包含了所有可能的狀態(tài)轉(zhuǎn)化連接,如存款,取款,轉(zhuǎn)賬或是關(guān)閉賬戶
當(dāng)檢索到該賬戶透支時,會返回如下信息:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: ...12345 -25.00
現(xiàn)在只剩下一個可用鏈接:存錢。其它的鏈接都將不可用。
想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號!將會不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68638.html
摘要:無需檢查的異常也是的子類。從低層拋出的需檢查異常強(qiáng)制要求調(diào)用方捕獲或是拋出該異常。當(dāng)前執(zhí)行的線程將會停止并報告該異常。單元測試允許我在使用中查看異常,并且作為一個可以被執(zhí)行的文檔來使用。不要捕獲最高層異常繼承的異常同樣是的子類。 前言 異常處理的問題之一是知道何時以及如何去使用它。我會討論一些異常處理的最佳實踐,也會總結(jié)最近在異常處理上的一些爭論。 作為程序員,我們想要寫高質(zhì)量的能夠解...
摘要:這個例子想要說明兩個事情中以為結(jié)尾的方法將會異步執(zhí)行默認(rèn)情況下即指沒有傳入的情況下,異步執(zhí)行會使用實現(xiàn),該線程池使用一個后臺線程來執(zhí)行任務(wù)。這個例子展示了如何使用一個固定大小的線程池來實現(xiàn)大寫操作。 前言 這篇博客回顧JAVA8的CompletionStageAPI以及其在JAVA庫中的標(biāo)準(zhǔn)實現(xiàn)CompletableFuture。將會通過幾個例子來展示API的各種行為。 因為Compl...
摘要:什么是仿射變換一組設(shè)備無關(guān)的坐標(biāo)被用來將所有的坐標(biāo)信息傳遞給對象。對象作為對象狀態(tài)的一部分。類代表一個的仿射變化,將一組的坐標(biāo)進(jìn)行線性映射到另一組保留了平行關(guān)系和豎直關(guān)系的坐標(biāo)中。 什么是仿射變換 一組設(shè)備無關(guān)的坐標(biāo)被用來將所有的坐標(biāo)信息傳遞給Graphics2D對象。AffineTransform對象作為Graphics2D對象狀態(tài)的一部分。該對象定義了如何將用戶空間的坐標(biāo)轉(zhuǎn)化為設(shè)備...
摘要:是指可能導(dǎo)致程序終止的非常嚴(yán)重的時間。具有最高的級別,旨在關(guān)閉中的日志功能。因此為每一個消息選擇一個合適的日志級別是非常重要的。日志的個小建議將日志訪日代碼塊它能顯著的減少因為字符串拼接而帶來的性能的影響。 前言 首先,這篇文章沒有進(jìn)行任何的日志功能的詳細(xì)介紹,而是對日志提出了幾種最佳實踐。適合對日志記錄有所了解的同學(xué)閱讀。下面是正文: JAVA日志管理既是一門科學(xué),又是一門藝術(shù)??茖W(xué)...
摘要:前言上一篇文章請參考貓頭鷹的深夜翻譯核心并發(fā)一安全發(fā)布發(fā)布一個對象是指該對象的引用對當(dāng)前的域之外也可見比如,從方法中獲取一個引用。任務(wù)的功能性接口表示一個沒有返回值的任務(wù)表示一個包含返回值的計算。 前言 上一篇文章請參考貓頭鷹的深夜翻譯:核心JAVA并發(fā)(一) 安全發(fā)布 發(fā)布一個對象是指該對象的引用對當(dāng)前的域之外也可見(比如,從getter方法中獲取一個引用)。要確保一個對象被安全的發(fā)...
閱讀 1667·2021-09-26 09:55
閱讀 5289·2021-09-22 15:40
閱讀 2027·2019-08-30 15:53
閱讀 1508·2019-08-30 11:15
閱讀 1725·2019-08-29 15:41
閱讀 1879·2019-08-28 18:13
閱讀 3159·2019-08-26 12:00
閱讀 1681·2019-08-26 10:30