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