文章編號:11218時間:2024-09-30人氣:
接口是軟件設計中至關重要的概念,它們允許對象之間進行松散耦合,提高代碼的可重用性、可維護性和可擴展性。在設計和使用接口時,需要注意一些最佳實踐和常見陷阱。
接口應該只定義必要的操作,避免包含不必要的細節。這有助于保持接口的清晰性和可理解性,并防止耦合過度。
接口和方法的名稱應該清楚地描述它們的用途。避免使用模糊或通用的術語,因為這可能會導致混淆。
接口應該清晰地定義客戶端和實現之間期望的契約。這包括返回類型、參數類型和異常處理行為。
接口不應該引用它們實現的類,因為這會導致循環依賴,使得代碼難以維護。
在設計接口時,如果已經存在標準的、廣為人知的接口,則優先使用它們。這有助于確保代碼與其他系統和庫的一致性和互操作性。
過于寬泛的接口可以引入不必要的耦合,并使代碼難以理解。在設計接口時,應盡可能具體,只包含必要的細節。
過于狹窄的接口會限制可重用性,并導致代碼重復。在設計接口時,應考慮接口的未來可擴展性和不同場景下的使用情況。
隨著時間的推移,接口可能會變得膨脹,包含越來越多的方法。這會降低接口的可理解性和可維護性。應定期審查和重構接口,以移除不必要的或過時的操作。
接口繼承過多會增加接口的復雜性和耦合度。在繼承接口時,應仔細考慮繼承的關系,并確保它不會導致不必要的耦合或沖突。
在使用 Java 8 中引入的默認實現時,應謹慎。默認實現可以方便快速地實現接口,但如果使用不當,可能會導致難以理解和意外的行為。
接口是促進代碼重用、可維護性和可擴展性的強大工具。通過遵循最佳實踐并避免常見陷阱,我們可以設計出清晰、簡潔且可重用的接口,從而提升軟件的設計質量。
1,《Head First Java》java入門書籍《Head First Java》是本完整的面向對象(object-oriented,OO)程序設計和Java的學習指導。 此書是根據學習理論所設計的,讓你可以從學習程序語言的基礎開始一直到包括線程、網絡與分布式程序等項目。 最重要的,你會學會如何像個面向對象開發者一樣去思考。 《HeadFirstJava(中文版)(第2版)(涵蓋Java5.0)》的圖文并茂學習方式能讓你快速地在腦海中掌握住知識。 敞開心胸準備好學習這些關鍵性的主題:Java程序語言;面向對象程序開發;Swing圖形化接口;使用JavaAPI函數庫;編寫、測試與部署應用程序;處理異常;多線程;網絡程序設計;集合與泛型。 如果你想要看一本正經的書,去找其他的。 如果你真地想要好好地學習Java,你會需要《Head First Java》。 這本書可是Amazon編輯推薦的十大好書之一!強烈推薦學習此書,非常適合初學者入門。 2《Java從入門到精通》適合自學者《Java從入門到精通》這本書主要針對java基礎,對于沒有學過java的人才說,是一個不錯的選擇。 通過這本書,大家可以從零開始,慢慢來學習,而且實操很多,不會讓你看到最后出現只會理論的情況。 為什么說培訓的人不用看呢?因為這本書上的內容和許多培訓機構的書籍有很多重復的地方,所以參加培訓的同學就可以不看了。 如果覺得自學太難太慢的話,那就報培訓機構吧.3.《Thinking in java》(中文名:《Java編程思想》)適合中級自學者和培訓者《Java編程思想》可以說是最經典的java著作,是所有java程序員必備教科書。 這本書不管是正在學習還是已經工作許多年的程序員,都可以從這本書中得到你想要的東西。 這本書具有教材和工具書的作用,就像一本字典,想知道什么都可以從中查詢。 雖然這本書很好,但并不建議初學者學習,對于初學者難度較大。 4.《瘋狂Java講義》適合自學者看《瘋狂的講義》這本書比較適合自學者,內容比較項目化,實操方法很多,如果你想進行java的深入學習,不妨看看這本書。 《瘋狂Java講義(第5版)》深入介紹了Java編程的相關方面,全書內容覆蓋了Java的基本語法結構、Java的面向對象特征、Java集合框架體系、Java泛型、異常處理、Java GUI編程、JDBC數據庫編程、Java注釋、Java的IO流體系、Java多線程編程、Java網絡通信編程和Java反射機制。 覆蓋了、、、和、、、包下絕大部分類和接口。 本書重點介紹了Java的模塊化系統,還詳細介紹了Java 10、Java 11的使用var聲明局部變量、在Lambda表達式中使用var聲明變量、改進的javac命令、基于嵌套的訪問控制、HTTP Client網絡編程,以及Java 10、Java 11新增的各種API功能。 5.《Java核心技術》最適合報培訓班的看這本書分為兩個部分,第一個部分講的是基礎知識,第二個部分講的是高級特性。 由于內容非常有層次,所以非常適合自學和上培訓機構的同學學習。 尤其對參加培訓的同學作用較大,因為一般培訓機構講的非???,有很多東西沒辦法及時消化吸收,很多基礎和核心的東西就會掌握的不牢固,那么這本書正好彌補了這個缺失。 6.《Java開發實戰經典》適合自學者看該書是一本綜合講解Java核心技術的書籍,在書中使用大量的代碼及案例進行知識點的分析與運用,并且給出一些比較成熟的開發步驟,幫助讀者更好地進行Java的開發。 從作者多年的Java培訓經驗來看,大部分學生對各種高端開發都沒有任何問題,唯一的問題在于Java基礎并不牢固,而且在國內也始終沒有一本真正可以引領讀者入門的好書籍,大部分的書籍都是圍繞概念本身進行講解的,沒有講解清楚為什么要具備這些知識以及該如何去理解這些知識。 本書真正地做到了讓每一位讀者都能清楚地知道每個知識點的來龍去脈,不僅可以很容易地看懂一個程序,而且能真正地靈活運用程序,編寫代碼。 在學習編程語言時,環境、代碼調試等,都是很多讀者最頭疼的地方,而且很多代碼都會存在一些細節上的問題,所以,本書為了讓讀者可以更好地理解每一個知識點,將書中所有內容都錄制成了視頻,讓每一位讀者真正做到輕松學Java、從零開始學Java,以優質的視頻教學為每一位讀者提供最大的支持。 這本書比較適合自學者學習,里面有很多小案例,可以邊學邊練,鞏固知識。
流量世界的復雜性,選型的藝術
流量,如同流動的旋律,其測量涉及到多種因素,包括管道的尺寸與形狀(圓形或矩形),介質的特性(如溫度、壓力、密度、粘度等),流體的流動狀態(如湍流、速度分布),以及安裝環境的苛刻要求。 面對世界范圍內琳瑯滿目的流量儀表種類,如容積式、差壓式、渦輪式等,如何在繁多的選擇中,根據實際需求科學選型,至關重要。 本文將深入解析流量儀表選型的策略,幫助您解鎖流量控制的智慧。
選型原則的五重奏
成功選型,首先要求對流量計的原理和流體特性有深入理解。從五個關鍵方面來考量,讓每一步都精準無誤:
流量與上限流量的考量
上限流量,即流量計的最大流量,是選擇口徑的重要依據。 選擇流量計時,要考慮到管道的經濟流速,如水1.5-3m/s,油品0.2-1m/s。 不同類型的流量計,如玻璃浮子流量計上限流速低,而渦街流量計則較高。 同時,要防止過高的流速導致的氣穴問題,確保流量計的最小背壓設置。
安裝的藝術與陷阱
流量計的安裝細節不容忽視,例如差壓式流量計需要直管段,而容積式流量計則無需。 錯誤安裝如孔板反裝,流速分布不佳,引壓管污染,惡劣環境下的安裝,或流量計置于電磁干擾區域,都可能導致測量誤差。 因此,遵循專業指導,確保每一步安裝都遵循最佳實踐。
總結來說,流量儀表選型是一場精密的工程,需要深思熟慮各種因素,才能確保測量的準確性和系統的可靠性。 通過科學的選型,您將能更好地駕馭流量的世界,提升生產效率和控制精度。
安全是恒久的話題,對于基于WSDL和SOAP的Web Service,我們有WS-Security這樣的安全規范來指導實現認證、授權、身份管理等安全需求。 那么,RESTful API有無成熟可用規范或實現框架呢?如何保證RESTful API的安全性呢?如何對RESTful API進行版本控制,請分享您認為實用的做法?HTTP1.1規范中給出的動詞對于設計RESTful API夠用嗎?您在實際項目中會擴展自己的動詞嗎?在什么情況下需要擴展?今年5月份發布的JAX-RS 2.0規范對于RSTfulAPI的設計最有價值的特性是哪個(些)? 它(們)用于解決什么問題?能否為InfoQ的讀者們推薦一款實用的RESTful API開發框架,并說明您的推介理由。 HTTP2.0規范正在制定當中,您對它的期待是什么?InfoQ:什么是好的RESTful API?相信每個人都有自己的評判標準。 那么,您認為一個好的RESTful API應該具有哪些特征呢? 李錕:一個好的RESTful API,應該具備以下特征:這個API應該是對瀏覽器友好的,能夠很好地融入Web,而不是與Web格格不入。 瀏覽器是最常見和最通用的REST客戶端。 好的RESTful API應該能夠使用瀏覽器+HTML完成所有的測試(不需要使用編程語言)。 這樣的API還可以很方便地使用各種自動化的Web功能測試、性能測試工具來做測試。 Web前端應用(基于瀏覽器的RIA應用、移動App等等)也可以很方便地將多個RESTful API的功能組合起來,建造Mashup類的應用。 這個API中所包含的資源和對于資源的操作,應該是直觀和容易理解的,并且符合HTTP協議的要求。 REST開發又被稱作“面向資源的開發”,這說明對于資源的抽象,是設計RESTful API的核心內容。 RESTful API建模的過程與面向對象建模類似,是以名詞為核心的。 這些名詞就是資源,任何可命名的抽象概念都可以定義為一個資源。 而HTTP協議并不是一種傳輸協議,它實際提供了一個操作資源的統一接口。 對于資源的任何操作,都應該映射到HTTP的幾個有限的方法(常用的有GET/POST/PUT/DELETE四個方法,還有不常用的PATCH/HEAD/OPTIONS方法)上面。 所以RESTful API建模的過程,可以看作是具有統一接口約束的面向對象建模過程。 按照HTTP協議的規定,GET方法是安全且冪等的,POST方法是既不安全也不冪等的(可以用來作為所有寫操作的通配方法),PUT、DELETE方法都是不安全但冪等的。 將對資源的操作合理映射到這四個方法上面,既不過度使用某個方法(例如過度使用GET方法或POST方法),也不添加過多的操作以至于HTTP的四個方法不夠用。 如果發現資源上的操作過多,以至于HTTP的方法不夠用,應該考慮設計出更多的資源。 設計出更多資源(以及相應的URI)對于RESTful API來說并沒有什么害處。 這個API應該是松耦合的。 RESTful API的設計包括了三個循序漸進、由低到高的層次:資源抽象、統一接口、超文本驅動。 正是這三個層次確保了RESTful API的松耦合性。 當設計面向互聯網的API時,松耦合變成了一種“必須有”的強需求。 緊耦合的API非常脆弱,一旦公布出去,服務器端和客戶端都無法持續進化。 尤其是服務器端,公布出去的接口根本不敢改,改了之后,幾乎所有客戶端應用立即無法正常工作。 REST這種架構風格就是緊耦合API的解毒劑,這個話題可以談的很深,這里就不展開了。 感興趣的讀者可以參考《REST實戰》。 這個API中所使用的表述格式應該是常見的通用格式在RESTful API中,對于資源的操作,是通過在服務器端-客戶端之間傳遞資源的表述來間接完成的。 資源的表述可以有很多種格式,并且在響應和請求中的資源表述格式也會有所不同。 GET/POST響應中的資源表述格式,常見的有HTML、XML、JSON;POST/PUT請求中的資源表述格式,常見的有標準的HTML表單參數、XML、JSON。 這些常見表述格式,處理起來非常容易,有大量的框架和庫提供支持。 所以除非有很合理的要求,通常不需要使用自定義的私有格式。 使用HTTP響應狀態代碼來表達各種出錯情況HTTP響應狀態代碼,是HTTP協議這個統一接口中用來表達出錯情況的標準機制。 響應狀態代碼分成兩部分:status code和reason phase。 兩部分都是可定制的,也可以使用標準的status code,只定制reason phase。 如果一個所謂的“RESTful API”對于任何請求都返回200 OK響應,在響應的消息體中返回出錯情況信息,這種做法顯然不符合“確保操作語義的可見性”這個REST架構風格的基本要求。 這個API應該對于HTTP緩存是友好的充分利用好HTTP緩存是RESTful API可伸縮性的根本。 HTTP協議是一個分層的架構,從兩端的user agent到origin server之間,可以插入很多中間組件。 而在整個HTTP通信鏈條的很多位置,都可以設置緩存。 HTTP協議內建有很好的緩存機制,可以分成過期模型和驗證模型兩套緩存機制。 如果API設計者完全沒有考慮過如何利用HTTP緩存,那么這個API的可伸縮性會有很多問題。 李建業:首先說明一下,對REST這個概念,我一般把它理解為REST風格的架構,但是現在實踐中最為廣泛認知的是HTTP,而它是REST的一個實現,所以RESTful API也可以不太嚴格的指基于HTTP的API——當然,即使是不嚴格的時候,API本身也應該力求遵循REST架構風格。 我認為,一個RESTful API最重要的一點應該是——“盡可能少的先驗信息”,這一條也同時是我判斷一個好的RESTful API的標準。 比如HTTP動詞,在實踐中,大家可能會常常糾結于有效利用 HTTP 動詞,但這卻并不是特別重要的事情——除非你理解這么做的價值。 HTTP 動詞最重要的地方在于它是標準闡明了的行為,也就是說,如果我們的“客戶端”遵循約定,那么就不必要發明新的動詞,也就不必增加“先驗信息”;但是,所謂“先驗信息”,針對的是客戶端——對API來說就是調用者,對于一些企業內部系統,或者一些傳統系統,由于“資源”很穩定,對資源的操作也很穩定,這些系統的“調用客戶端”不是瀏覽器而是另一個系統,此時如果強制對應到HTTP動詞,反而會變成額外的“先驗信息”,這時我就不會太拘泥HTTP動詞,自己制定一套動詞放在參數中也可以接受——只要動詞不變化,這個系統依然是REST風格的。 再比如Response里面的Content-Type,這個有時會被新手忽略,但這其實很重要,因為一般涉及到系統間協同的API,往往不會使用普通的文本,比較常見的是使用json表達復雜結構,而這與通常的缺省理解不同(缺省一般會認為是text/plain和text/html),所以如果在API中忘記用Content-Type進行區分的話,后續對多種類型的客戶端接入的支持就會變成陷阱(我們多次遇到過這個問題)。 而如果一開始就檢查是否增加先驗知識(缺省Content-Type為plain或者允許指定Content-Type),那這一困難就可以避免了。 丁雪豐:首先,應該正確地使用HTTP的統一接口,比如HTTP的動詞,如果不分青紅皂白清一色POST那顯然還有改進的余地;其次,資源有合適的粒度,可以從三個方面來評判資源的粒度是否合理——網絡的效率、表述的大小以及客戶端使用時的易用程度;最后,是表述的設計,除了表述的正文內容,還有其中的URI和鏈接,這些都是評判一個RESTful API好壞的標準。 馬鈞:在我看來,一個好的API標準,就是能盡量利用到HTTP協議的特性,將HTTP當成一種轉移協議,而不是傳輸協議。 包括但不限于:利用HTTP的各種動詞來明確操作;包含有內容協商,可以根據請求頭提供的參數選擇一個資源最合適的媒體類型、語言、字符集和編碼的表現;使用不同的返回代碼來描述各種狀態。 但實際上見到過的很多聲稱RESTful API,包括國內的和國外的,能符合這些條件的并不多。 提供的API是我見到過的較為不錯的RESTful API,可以作為范例參考。 InfoQ:安全是恒久的話題,對于基于WSDL和SOAP的Web Service,我們有WS-Security這樣的安全規范來指導實現認證、授權、身份管理等安全需求。 那么,RESTful API有無成熟可用規范或實現框架呢?如何保證RESTful API的安全性呢?李錕:保證RESTful API的安全性,主要包括三大方面:a) 對客戶端做身份認證b) 對敏感的數據做加密,并且防止篡改c) 身份認證之后的授權對客戶端做身份認證,有幾種常見的做法:在請求中加簽名參數為每個接入方分配一個密鑰,并且規定一種簽名的計算方法。 要求接入方的請求中必須加上簽名參數。 這個做法是最簡單的,但是需要確保接入方密鑰的安全保存,另外還要注意防范replay攻擊。 其優點是容易理解與實現,缺點是需要承擔安全保存密鑰和定期更新密鑰的負擔,而且不夠靈活,更新密鑰和升級簽名算法很困難。 使用標準的HTTP身份認證機制HTTP Basic身份認證安全性較低,必須與HTTPS配合使用。 HTTP Digest身份認證可以單獨使用,具備中等程度的安全性。 HTTP Digest身份認證機制還支持插入用戶自定義的加密算法,這樣可以進一步提高API的安全性。 不過插入自定義加密算法在面向互聯網的API中用的不是很多。 這個做法需要確保接入方“安全域-用戶名-密碼”三元組信息的安全保存,另外還要注意防范replay攻擊。 優點:基于標準,得到了廣泛的支持(大量HTTP服務器端、客戶端庫)。 在服務器端做HTTP身份認證的職責可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)來承擔,對應用開發者來說是透明的。 HTTP身份認證機制(RFC 2617)非常好地體現了“分離關注點”的設計原則,而且保持了操作語義的可見性。 缺點:這類基于簡單用戶名+密碼機制的安全性不可能高于基于非對稱密鑰的機制(例如數字證書)。 使用OAuth協議做身份認證OAuth協議適用于為外部應用授權訪問本站資源的情況。 其中的加密機制與HTTP Digest身份認證相比,安全性更高。 需要注意,OAuth身份認證與HTTP Digest身份認證之間并不是相互取代的關系,它們的適用場景是不同的。 OAuth協議更適合于為面向最終用戶維度的API提供授權,例如獲取隸屬于用戶的微博信息等等。 如果API并不是面向最終用戶維度的,例如像七牛云存儲這樣的存儲服務,這并非是OAuth協議的典型適用場景。 對敏感的數據做加密,并且防止篡改,常見的做法有:部署SSL基礎設施(即HTTPS),敏感數據的傳輸全部基于SSL。 僅對部分敏感數據做加密(例如預付費卡的卡號+密碼),并加入某種隨機數作為加密鹽,以防范數據被篡改。 身份認證之后的授權,主要是由應用來控制。 通常應該實現某種基于角色+用戶組的授權機制,這方面的框架有不少(例如Spring Security),不過大多數開發團隊還是喜歡自己來實現相關功能。 李建業:我不認為安全是RESTful API需要考慮的問題,事實上我覺得這是兩個正交的問題。 當然,如果使用RESTful API來提供認證、授權和身份管理,那也算是雙方有關系,但是這和其它風格的API設計所要考慮的問題似乎沒什么區別,不值得特別注意。 但是在具體設計層面,這兩者的“正交點”上似乎確實有些問題,因為REST是一個推崇狀態無關原則的架構風格,而認證和授權通?;诘谌浇鉀Q方案,所以往往會出現違背有狀態約束的問題,這個地方我也沒有特別的想法,當然這個困難和原問題關系不大。 至于WS-族的協議,我不太了解,不太能參與討論。 丁雪豐:對于RESTful API,常見的安全措施都是可以繼續使用的。 例如,為了防篡改,可以對全部參數進行簽名;為了防范重放攻擊可以在請求中增加一次性的Token,或者短時間內有效的Token;對內容加密可以實現數據防泄露……;對于DDoS攻擊,各種HTTP流量清洗策略,都可以繼續發揮作用,因為這就是基本的HTTP請求。 在授權和認證方面,OAuth 2.0已經基本成熟了,并且得到了廣泛地應用。 如果可以,接入第三方賬戶體系是個不錯的選擇,比如Google和Facebook的,國內的當然也有幾個候選。 馬鈞:個人認為RESTful的安全性分為幾個層次,在安全要求較高的場合,可以通過HTTPs這樣的加密協議來保證網絡層的安全,應用層的安全可以通過OAuth實現認證,而對于資源的訪問授權,則只能依靠應用程序來實現了。 InfoQ:如何對RESTful API進行版本控制,請分享您認為實用的做法?李錕:一個比較簡單實用的做法是直接在URI中插入版本號,這樣做允許多個版本的API并行運行。 另一個做法是在HTTP請求中加入自定義頭信息,標明使用的版本號。 不過這個做法其實對瀏覽器不夠友好,簡單地使用瀏覽器+HTML無法測試。 李建業:目前比較好的方式還是在uri設計中添加版本信息,其它方法都不如這個實用。 丁雪豐:個人認為最好的版本化,就是沒有明顯的版本。 在對已發布的服務進行變更時,要盡量做到兼容,其中包括URI、鏈接和各種不同的表述的兼容,最關鍵的就是在擴展時不能破壞現有的客戶端。 例如,要變更一個參數,可以選擇同時兼容新舊兩種輸入,或者保持老參數不動,提供一個新的參數,在文檔中必須做出說明,不推薦新用戶再繼續使用之前的參數。 如果必須要進行不兼容的變更,那么可以選擇標記不同的版本號,這時可以選擇在路徑或參數中增加版本信息。 也有做法是增加HTTP標頭,只是在調用時會稍有不便,推薦前兩種方法。 馬鈞:RESTfulAPI的版本升級,盡量兼容之前的版本,保證原有的API都能正常工作,可以通過HTTP 301轉跳到新的資源。 另外一種實用的做法就是在url中保留版本號,同時提供多個版本供客戶端使用,如 或者 /v1/ 這樣。 InfoQ:HTTP1.1規范中給出的動詞對于設計RESTful API夠用嗎?您在實際項目中會擴展自己的動詞嗎?在什么情況下需要擴展?李錕:這個問題取決于設計者如何看待和設計資源。 如果資源抽象做的很好,對于某個資源的任何操作,通常都能夠映射到CRUD四個類別中。 CRUD四個類別對于操作資源來說,絕大多數情況下是完備的。 HTTP的GET/POST/PUT/DELETE四個方法,對于CRUD四個類別的操作來說是足夠的,映射關系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。 我們通常不會選擇創建自己的動詞,這樣做對于客戶端開發者來說,需要更多的學習成本。 如果在資源上定義的操作過多,我們會選擇拆分出更多的資源。 李建業:一般是夠用的,有時一些“不夠用”的場景是由于我們沒有設計出合理的資源,比如批量操作。 但是,正如之前所說的那樣,對于某些內部的、傳統的(因此模型穩定且已知)系統,API提供者和調用者會有自已的固定動詞表,此時沒必要拘泥。 另外,我不建議擴展動詞,一旦擴展了動詞,其實已經破壞了我之前說的*“盡可能少的先驗信息”*,那么,擴展動詞和重新設計動詞的成本差別不大。 基于這個考慮,我建議盡可能保持動詞不變,除非你想重新設計動詞表。 丁雪豐:一般情況下,常用的HTTP動詞是夠用的,并沒有出現一定要自己擴展動詞的情況。 其實,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE則基本用不太到。 如果出現一時找不到合適的動詞,安全冪等的操作用GET,其他都可以用POST,在設計資源時稍加考慮即可。 馬鈞:在我的實際項目中,只用到了POST,PUT,DELETE,GET這四個動詞。 InfoQ:今年5月份發布的JAX-RS 2.0規范對于RSTfulAPI的設計最有價值的特性是哪個(些)? 它(們)用于解決什么問題?李錕:REST開發框架RESTEasy項目負責人Bill Burke,去年寫了一篇文章介紹JAX-RS 2.0。 我同意Bill在文章中的觀點,在JAX-RS 2.0增加的內容中,最重要的三部分為:a) Client API——用來規范化JAX-RS客戶端的開發方式。 b) Server-side Asynchronous HTTP——用來實現服務器端推送功能,而不需要依靠低效的輪詢方式。 c) Filters and Interceptors——用來分離關注點,將鑒權、日志等邏輯與業務邏輯分離開,更好地實現代碼重用。 這三部分的內容對于開發者來說都很有用。 遵循JAX-RS規范做開發,可以確保服務器端以及客戶端代碼的可移植性。 李建業:我個人關注異步API這部分,主要是因為流式服務將會越來越多,那將大量需要這類支持。 InfoQ:能否為InfoQ的讀者推薦一款實用的RESTful API開發框架,并說明您的推介理由。 李錕:這個問題我就不詳細回答了。 不同的編程語言有不同的REST開發框架,對于REST的支持程度也不同。 開發RESTful API的需求范圍很廣,可選擇的開發框架的范圍也很廣。 保持多樣性是繁榮生態環境的基礎。 像Java就有支持JAX-RS規范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS規范的Spring MVC等等很多框架。 這些框架目前都做的不錯。 我對框架的選擇沒有傾向性。 RESTful API設計的最佳實踐應該是通用的,而不是必須依賴某種特定的開發框架。 李建業:不好意思,這個我不太重視,沒法推薦,不過我可以解釋一下為什么對RESTful API框架不感冒的原因。 REST作為一個架構風格,對我們的系統開發有很大影響,但是這些影響一般是針對架構(例如狀態無關)或者設計(例如資源識別)上的,所以一旦涉及到具體實現,主要工作就基本結束了,此時開發框架能做的事也就只有簡化編程了(相較而言,有的框架還能起到引導設計的作用),而由于RESTful會抽象動詞,所以實現層面中和API規范相關的工作本來就不多,那么框架的價值就更小了。 當然,我們也不可能直接基于servlet/rakc/wsgi來開發,不過一般的編程語言都會提供一些簡單的url route/match策略,我們使用這些就足夠了。 另外,有些框架能幫我們生成全部的動詞支持,但這也未必是好事,我一般傾向于按需實現——用到了再支持,這就更不需要太關注開發框架對RESTful的支持了。 丁雪豐:由于本人是Spring的擁護者,工作中也一直在使用Spring,所以在選擇框架時會更多地傾向Spring MVC(并不是說別的框架不好,這里有些個人主觀的成份)。 如果一定要選擇其他框架,也要選擇能夠方便與Spring集成的框架。 如果在項目中已經使用了Spring,那么沒有什么理由不選擇Spring MVC,鑒于目前Spring在各種項目中的高出鏡率,相信一般情況下都會選擇Spring MVC。 REST的成熟度模型中,第三層就是HATEOAS,Spring目前還提供了Spring Hateoas子項目,對鏈接、資源等方面的支持都做了一定的增強。 馬鈞:我目前在實際項目中使用的是Spray,這是一個開源的 REST/HTTP 工具包和底層網絡 IO 包,基于 Scala 和 Akka 構建。 輕量級、異步、非堵塞、基于 actor 模式、模塊化和可測試是Spray的特點。 InfoQ:HTTP2.0規范正在制定當中,您對它的期待是什么?李錕:我的期待包括兩個方面:應該做的和不應該做的。 HTTP/2.0規范應該做的:與HTTP/1.1協議保持兼容。 兼容的含義是說兩者可以并存,客戶端應用可以根據服務器端的能力,自由地選擇使用HTTP/2.0還是HTTP/1.1,而且選擇過程對應用來說是透明的。 改進HTTP協議(作為資源的統一接口)之中操作語義表達方式的語法,提高網絡傳輸效率。 更好地模塊化,這樣HTTP/2.0協議的實現能夠更好地模塊化。 應用程序可根據需要選擇適當的模塊,而不是要么全有、要么全無。 廢棄掉HTTP/1.1協議中一些很少有人用到的部分,例如采用管道(pipelining)方式發送請求。 增加更多的動詞,以適應除CRUD之外的其他場景。 HTTP/2.0規范不應該做的:HTTP/2.0協議不應該把底層的數據加密機制(即SSL)作為必選項。 HTTP/2.0協議不應該背離REST架構風格的約束,尤其是要確保操作語義對于中間組件的可見性。 在上面這兩個方面,Roy Fileidng曾經與SPDY協議設計者Mike Belshe發生過激烈爭論,詳情請看:Roy Fielding談Google SPDY協議李建業:對此規范關注不多,不知道會不會有對于流的支持,目前我所知道的只有chunk方式進行簡單的支持,但是真正的流需要區分數據通道和控制通道——哪怕是邏輯上的區分,這樣就直接對REST風格產生了很大沖擊,考慮到流式服務在未來的發展潛力,我特別期待業界在這方面有所進展。 丁雪豐:HTTP 2.0很大程度上是借鑒了Google的SPDY,就我而言,首先,希望這個規范能做到與HTTP 1.1的兼容,使用者如果只認識1.1,那么2.0能優雅“降級”;其次,希望2.0能帶來更好的性能,SPDY在這方面還是有所改進的,希望HTTP 2.0能再接再厲;最后,希望這個規范能在最終定稿時附帶一個最佳實踐,正確引導人們合理地使用HTTP 2.0。 馬鈞:沒研究過,估計即使出來,1.1還有很長的生命周期,不會很快被取代。
蟑螂是常見的室內害蟲,它們的出現不僅影響家居環境的整潔,還可能帶來健康隱患。 為了有效地驅趕蟑螂,我們首先需要了解它們的生活習性和害怕的因素,然后采取科學合理的方法進行防治蟑螂的生活習性與害怕的因素要驅趕蟑螂,首先需要了解它們的生活習性和最害怕的因素。 蟑螂是夜行性昆蟲,白天通常躲藏在暗處,比如墻角、家具縫隙和廚房等地。 它們對寒冷和干燥環境比較敏感,喜歡潮濕和溫暖的地方。 蟑螂是雜食性昆蟲,主要以碳水化合物和蛋白質為食,容易在食物殘渣和垃圾堆積的地方繁殖滋生。 另外,蟑螂對某些氣味和化學物質也感到恐懼,比如甲醛、松香、薄荷等氣味,以及一些天然的驅蟲物質。 了解了這些生活習性和害怕的因素,我們可以有針對性地采取措施來驅趕蟑螂。 最有效的驅趕方法1、保持衛生: 衛生是防治蟑螂的首要方法。 定期清掃地面、清洗廚房、儲存食物時使用密封容器,以及定期處理垃圾都能夠減少蟑螂的食物來源,降低蟑螂滋生的可能性。 2、修復漏洞: 密封墻壁、地板和天花板上的裂縫和孔洞,減少蟑螂的進入途徑。 同時,注意修復水管和排水系統中的漏水問題,以減少潮濕環境。 3、利用氣味和化學物質: 利用蟑螂害怕的氣味可以制作驅蟲噴霧,噴灑在蟑螂常出沒的區域。 此外,市售的驅蟲劑和殺蟲劑也可以用于驅趕蟑螂,但使用時要注意安全,避免食品和兒童接觸。 4、設置陷阱和粘貼板: 在蟑螂經常出現的地方設置蟑螂陷阱或粘貼板,可以吸引并捕捉蟑螂。 這些陷阱和粘貼板通常含有引誘劑,對蟑螂有較強的吸引力。 5、天然驅蟲劑: 一些天然物質也有驅趕蟑螂的效果,如硼酸粉、二氧化硅粉等。 這些物質對人類和寵物相對較安全,可以撒在蟑螂經常出沒的區域。 6、定期檢查和維護: 建立定期的檢查制度,及時發現蟑螂問題,采取相應的措施。 同時,保持室內通風,減少潮濕,也能讓蟑螂不易繁殖。 家里驅除蟑螂的最佳實踐綜合以上驅蟲方法,我們可以制定出家里驅除蟑螂的最佳實踐:1、清潔衛生: 堅持室內清潔,尤其是廚房和餐廳區域,清除食物殘渣和垃圾。 定期清理地板、桌面和灶具,減少蟑螂的食物來源。 2、修復漏洞: 密封墻壁和地板上的裂縫,修復漏水問題,降低蟑螂進入的途徑,創造一個不利于它們棲息的環境。 3、使用驅蟲劑: 根據需要可以使用天然驅蟲劑、市售驅蟲劑或者制作驅蟲噴霧,對蟑螂出沒區域進行噴灑。 但務必注意使用時的安全。 4、設置陷阱和粘貼板: 在蟑螂常出沒的地方設置陷阱和粘貼板,捕捉并監控蟑螂的數量。 5、保持通風: 保持室內通風,減少潮濕,使蟑螂不易繁殖。 6、定期檢查: 建立定期的檢查制度,定期查看蟑螂是否有所減少,需要時及時采取相應措施。 總之,蟑螂雖然頑固,但通過了解其生活習性和害怕的因素,以及采取科學的驅蟲方法,我們可以有效地驅趕蟑螂,創造一個清潔、健康的家居環境。 保持衛生、修復漏洞、使用驅蟲劑和陷阱、保持通風和定期檢查,這些綜合的方法可以幫助您有效地驅除蟑螂,保護家庭的健康和舒適。
安全是恒久的話題,對于基于WSDL和SOAP的Web Service,我們有WS-Security這樣的安全規范來指導實現認證、授權、身份管理等安全需求。 那么,RESTful API有無成熟可用規范或實現框架呢?如何保證RESTful API的安全性呢?如何對RESTful API進行版本控制,請分享您認為實用的做法?HTTP1.1規范中給出的動詞對于設計RESTful API夠用嗎?您在實際項目中會擴展自己的動詞嗎?在什么情況下需要擴展?今年5月份發布的JAX-RS 2.0規范對于RSTfulAPI的設計最有價值的特性是哪個(些)? 它(們)用于解決什么問題?能否為InfoQ的讀者們推薦一款實用的RESTful API開發框架,并說明您的推介理由。 HTTP2.0規范正在制定當中,您對它的期待是什么?InfoQ:什么是好的RESTful API?相信每個人都有自己的評判標準。 那么,您認為一個好的RESTful API應該具有哪些特征呢? 李錕:一個好的RESTful API,應該具備以下特征:這個API應該是對瀏覽器友好的,能夠很好地融入Web,而不是與Web格格不入。 瀏覽器是最常見和最通用的REST客戶端。 好的RESTful API應該能夠使用瀏覽器+HTML完成所有的測試(不需要使用編程語言)。 這樣的API還可以很方便地使用各種自動化的Web功能測試、性能測試工具來做測試。 Web前端應用(基于瀏覽器的RIA應用、移動App等等)也可以很方便地將多個RESTful API的功能組合起來,建造Mashup類的應用。 這個API中所包含的資源和對于資源的操作,應該是直觀和容易理解的,并且符合HTTP協議的要求。 REST開發又被稱作“面向資源的開發”,這說明對于資源的抽象,是設計RESTful API的核心內容。 RESTful API建模的過程與面向對象建模類似,是以名詞為核心的。 這些名詞就是資源,任何可命名的抽象概念都可以定義為一個資源。 而HTTP協議并不是一種傳輸協議,它實際提供了一個操作資源的統一接口。 對于資源的任何操作,都應該映射到HTTP的幾個有限的方法(常用的有GET/POST/PUT/DELETE四個方法,還有不常用的PATCH/HEAD/OPTIONS方法)上面。 所以RESTful API建模的過程,可以看作是具有統一接口約束的面向對象建模過程。 按照HTTP協議的規定,GET方法是安全且冪等的,POST方法是既不安全也不冪等的(可以用來作為所有寫操作的通配方法),PUT、DELETE方法都是不安全但冪等的。 將對資源的操作合理映射到這四個方法上面,既不過度使用某個方法(例如過度使用GET方法或POST方法),也不添加過多的操作以至于HTTP的四個方法不夠用。 如果發現資源上的操作過多,以至于HTTP的方法不夠用,應該考慮設計出更多的資源。 設計出更多資源(以及相應的URI)對于RESTful API來說并沒有什么害處。 這個API應該是松耦合的。 RESTful API的設計包括了三個循序漸進、由低到高的層次:資源抽象、統一接口、超文本驅動。 正是這三個層次確保了RESTful API的松耦合性。 當設計面向互聯網的API時,松耦合變成了一種“必須有”的強需求。 緊耦合的API非常脆弱,一旦公布出去,服務器端和客戶端都無法持續進化。 尤其是服務器端,公布出去的接口根本不敢改,改了之后,幾乎所有客戶端應用立即無法正常工作。 REST這種架構風格就是緊耦合API的解毒劑,這個話題可以談的很深,這里就不展開了。 感興趣的讀者可以參考《REST實戰》。 這個API中所使用的表述格式應該是常見的通用格式在RESTful API中,對于資源的操作,是通過在服務器端-客戶端之間傳遞資源的表述來間接完成的。 資源的表述可以有很多種格式,并且在響應和請求中的資源表述格式也會有所不同。 GET/POST響應中的資源表述格式,常見的有HTML、XML、JSON;POST/PUT請求中的資源表述格式,常見的有標準的HTML表單參數、XML、JSON。 這些常見表述格式,處理起來非常容易,有大量的框架和庫提供支持。 所以除非有很合理的要求,通常不需要使用自定義的私有格式。 使用HTTP響應狀態代碼來表達各種出錯情況HTTP響應狀態代碼,是HTTP協議這個統一接口中用來表達出錯情況的標準機制。 響應狀態代碼分成兩部分:status code和reason phase。 兩部分都是可定制的,也可以使用標準的status code,只定制reason phase。 如果一個所謂的“RESTful API”對于任何請求都返回200 OK響應,在響應的消息體中返回出錯情況信息,這種做法顯然不符合“確保操作語義的可見性”這個REST架構風格的基本要求。 這個API應該對于HTTP緩存是友好的充分利用好HTTP緩存是RESTful API可伸縮性的根本。 HTTP協議是一個分層的架構,從兩端的user agent到origin server之間,可以插入很多中間組件。 而在整個HTTP通信鏈條的很多位置,都可以設置緩存。 HTTP協議內建有很好的緩存機制,可以分成過期模型和驗證模型兩套緩存機制。 如果API設計者完全沒有考慮過如何利用HTTP緩存,那么這個API的可伸縮性會有很多問題。 李建業:首先說明一下,對REST這個概念,我一般把它理解為REST風格的架構,但是現在實踐中最為廣泛認知的是HTTP,而它是REST的一個實現,所以RESTful API也可以不太嚴格的指基于HTTP的API——當然,即使是不嚴格的時候,API本身也應該力求遵循REST架構風格。 我認為,一個RESTful API最重要的一點應該是——“盡可能少的先驗信息”,這一條也同時是我判斷一個好的RESTful API的標準。 比如HTTP動詞,在實踐中,大家可能會常常糾結于有效利用 HTTP 動詞,但這卻并不是特別重要的事情——除非你理解這么做的價值。 HTTP 動詞最重要的地方在于它是標準闡明了的行為,也就是說,如果我們的“客戶端”遵循約定,那么就不必要發明新的動詞,也就不必增加“先驗信息”;但是,所謂“先驗信息”,針對的是客戶端——對API來說就是調用者,對于一些企業內部系統,或者一些傳統系統,由于“資源”很穩定,對資源的操作也很穩定,這些系統的“調用客戶端”不是瀏覽器而是另一個系統,此時如果強制對應到HTTP動詞,反而會變成額外的“先驗信息”,這時我就不會太拘泥HTTP動詞,自己制定一套動詞放在參數中也可以接受——只要動詞不變化,這個系統依然是REST風格的。 再比如Response里面的Content-Type,這個有時會被新手忽略,但這其實很重要,因為一般涉及到系統間協同的API,往往不會使用普通的文本,比較常見的是使用json表達復雜結構,而這與通常的缺省理解不同(缺省一般會認為是text/plain和text/html),所以如果在API中忘記用Content-Type進行區分的話,后續對多種類型的客戶端接入的支持就會變成陷阱(我們多次遇到過這個問題)。 而如果一開始就檢查是否增加先驗知識(缺省Content-Type為plain或者允許指定Content-Type),那這一困難就可以避免了。 丁雪豐:首先,應該正確地使用HTTP的統一接口,比如HTTP的動詞,如果不分青紅皂白清一色POST那顯然還有改進的余地;其次,資源有合適的粒度,可以從三個方面來評判資源的粒度是否合理——網絡的效率、表述的大小以及客戶端使用時的易用程度;最后,是表述的設計,除了表述的正文內容,還有其中的URI和鏈接,這些都是評判一個RESTful API好壞的標準。 馬鈞:在我看來,一個好的API標準,就是能盡量利用到HTTP協議的特性,將HTTP當成一種轉移協議,而不是傳輸協議。 包括但不限于:利用HTTP的各種動詞來明確操作;包含有內容協商,可以根據請求頭提供的參數選擇一個資源最合適的媒體類型、語言、字符集和編碼的表現;使用不同的返回代碼來描述各種狀態。 但實際上見到過的很多聲稱RESTful API,包括國內的和國外的,能符合這些條件的并不多。 提供的API是我見到過的較為不錯的RESTful API,可以作為范例參考。 InfoQ:安全是恒久的話題,對于基于WSDL和SOAP的Web Service,我們有WS-Security這樣的安全規范來指導實現認證、授權、身份管理等安全需求。 那么,RESTful API有無成熟可用規范或實現框架呢?如何保證RESTful API的安全性呢?李錕:保證RESTful API的安全性,主要包括三大方面:a) 對客戶端做身份認證b) 對敏感的數據做加密,并且防止篡改c) 身份認證之后的授權對客戶端做身份認證,有幾種常見的做法:在請求中加簽名參數為每個接入方分配一個密鑰,并且規定一種簽名的計算方法。 要求接入方的請求中必須加上簽名參數。 這個做法是最簡單的,但是需要確保接入方密鑰的安全保存,另外還要注意防范replay攻擊。 其優點是容易理解與實現,缺點是需要承擔安全保存密鑰和定期更新密鑰的負擔,而且不夠靈活,更新密鑰和升級簽名算法很困難。 使用標準的HTTP身份認證機制HTTP Basic身份認證安全性較低,必須與HTTPS配合使用。 HTTP Digest身份認證可以單獨使用,具備中等程度的安全性。 HTTP Digest身份認證機制還支持插入用戶自定義的加密算法,這樣可以進一步提高API的安全性。 不過插入自定義加密算法在面向互聯網的API中用的不是很多。 這個做法需要確保接入方“安全域-用戶名-密碼”三元組信息的安全保存,另外還要注意防范replay攻擊。 優點:基于標準,得到了廣泛的支持(大量HTTP服務器端、客戶端庫)。 在服務器端做HTTP身份認證的職責可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)來承擔,對應用開發者來說是透明的。 HTTP身份認證機制(RFC 2617)非常好地體現了“分離關注點”的設計原則,而且保持了操作語義的可見性。 缺點:這類基于簡單用戶名+密碼機制的安全性不可能高于基于非對稱密鑰的機制(例如數字證書)。 使用OAuth協議做身份認證OAuth協議適用于為外部應用授權訪問本站資源的情況。 其中的加密機制與HTTP Digest身份認證相比,安全性更高。 需要注意,OAuth身份認證與HTTP Digest身份認證之間并不是相互取代的關系,它們的適用場景是不同的。 OAuth協議更適合于為面向最終用戶維度的API提供授權,例如獲取隸屬于用戶的微博信息等等。 如果API并不是面向最終用戶維度的,例如像七牛云存儲這樣的存儲服務,這并非是OAuth協議的典型適用場景。 對敏感的數據做加密,并且防止篡改,常見的做法有:部署SSL基礎設施(即HTTPS),敏感數據的傳輸全部基于SSL。 僅對部分敏感數據做加密(例如預付費卡的卡號+密碼),并加入某種隨機數作為加密鹽,以防范數據被篡改。 身份認證之后的授權,主要是由應用來控制。 通常應該實現某種基于角色+用戶組的授權機制,這方面的框架有不少(例如Spring Security),不過大多數開發團隊還是喜歡自己來實現相關功能。 李建業:我不認為安全是RESTful API需要考慮的問題,事實上我覺得這是兩個正交的問題。 當然,如果使用RESTful API來提供認證、授權和身份管理,那也算是雙方有關系,但是這和其它風格的API設計所要考慮的問題似乎沒什么區別,不值得特別注意。 但是在具體設計層面,這兩者的“正交點”上似乎確實有些問題,因為REST是一個推崇狀態無關原則的架構風格,而認證和授權通常基于第三方解決方案,所以往往會出現違背有狀態約束的問題,這個地方我也沒有特別的想法,當然這個困難和原問題關系不大。 至于WS-族的協議,我不太了解,不太能參與討論。 丁雪豐:對于RESTful API,常見的安全措施都是可以繼續使用的。 例如,為了防篡改,可以對全部參數進行簽名;為了防范重放攻擊可以在請求中增加一次性的Token,或者短時間內有效的Token;對內容加密可以實現數據防泄露……;對于DDoS攻擊,各種HTTP流量清洗策略,都可以繼續發揮作用,因為這就是基本的HTTP請求。 在授權和認證方面,OAuth 2.0已經基本成熟了,并且得到了廣泛地應用。 如果可以,接入第三方賬戶體系是個不錯的選擇,比如Google和Facebook的,國內的當然也有幾個候選。 馬鈞:個人認為RESTful的安全性分為幾個層次,在安全要求較高的場合,可以通過HTTPs這樣的加密協議來保證網絡層的安全,應用層的安全可以通過OAuth實現認證,而對于資源的訪問授權,則只能依靠應用程序來實現了。 InfoQ:如何對RESTful API進行版本控制,請分享您認為實用的做法?李錕:一個比較簡單實用的做法是直接在URI中插入版本號,這樣做允許多個版本的API并行運行。 另一個做法是在HTTP請求中加入自定義頭信息,標明使用的版本號。 不過這個做法其實對瀏覽器不夠友好,簡單地使用瀏覽器+HTML無法測試。 李建業:目前比較好的方式還是在uri設計中添加版本信息,其它方法都不如這個實用。 丁雪豐:個人認為最好的版本化,就是沒有明顯的版本。 在對已發布的服務進行變更時,要盡量做到兼容,其中包括URI、鏈接和各種不同的表述的兼容,最關鍵的就是在擴展時不能破壞現有的客戶端。 例如,要變更一個參數,可以選擇同時兼容新舊兩種輸入,或者保持老參數不動,提供一個新的參數,在文檔中必須做出說明,不推薦新用戶再繼續使用之前的參數。 如果必須要進行不兼容的變更,那么可以選擇標記不同的版本號,這時可以選擇在路徑或參數中增加版本信息。 也有做法是增加HTTP標頭,只是在調用時會稍有不便,推薦前兩種方法。 馬鈞:RESTfulAPI的版本升級,盡量兼容之前的版本,保證原有的API都能正常工作,可以通過HTTP 301轉跳到新的資源。 另外一種實用的做法就是在url中保留版本號,同時提供多個版本供客戶端使用,如 或者 /v1/ 這樣。 InfoQ:HTTP1.1規范中給出的動詞對于設計RESTful API夠用嗎?您在實際項目中會擴展自己的動詞嗎?在什么情況下需要擴展?李錕:這個問題取決于設計者如何看待和設計資源。 如果資源抽象做的很好,對于某個資源的任何操作,通常都能夠映射到CRUD四個類別中。 CRUD四個類別對于操作資源來說,絕大多數情況下是完備的。 HTTP的GET/POST/PUT/DELETE四個方法,對于CRUD四個類別的操作來說是足夠的,映射關系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。 我們通常不會選擇創建自己的動詞,這樣做對于客戶端開發者來說,需要更多的學習成本。 如果在資源上定義的操作過多,我們會選擇拆分出更多的資源。 李建業:一般是夠用的,有時一些“不夠用”的場景是由于我們沒有設計出合理的資源,比如批量操作。 但是,正如之前所說的那樣,對于某些內部的、傳統的(因此模型穩定且已知)系統,API提供者和調用者會有自已的固定動詞表,此時沒必要拘泥。 另外,我不建議擴展動詞,一旦擴展了動詞,其實已經破壞了我之前說的*“盡可能少的先驗信息”*,那么,擴展動詞和重新設計動詞的成本差別不大。 基于這個考慮,我建議盡可能保持動詞不變,除非你想重新設計動詞表。 丁雪豐:一般情況下,常用的HTTP動詞是夠用的,并沒有出現一定要自己擴展動詞的情況。 其實,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE則基本用不太到。 如果出現一時找不到合適的動詞,安全冪等的操作用GET,其他都可以用POST,在設計資源時稍加考慮即可。 馬鈞:在我的實際項目中,只用到了POST,PUT,DELETE,GET這四個動詞。 InfoQ:今年5月份發布的JAX-RS 2.0規范對于RSTfulAPI的設計最有價值的特性是哪個(些)? 它(們)用于解決什么問題?李錕:REST開發框架RESTEasy項目負責人Bill Burke,去年寫了一篇文章介紹JAX-RS 2.0。 我同意Bill在文章中的觀點,在JAX-RS 2.0增加的內容中,最重要的三部分為:a) Client API——用來規范化JAX-RS客戶端的開發方式。 b) Server-side Asynchronous HTTP——用來實現服務器端推送功能,而不需要依靠低效的輪詢方式。 c) Filters and Interceptors——用來分離關注點,將鑒權、日志等邏輯與業務邏輯分離開,更好地實現代碼重用。 這三部分的內容對于開發者來說都很有用。 遵循JAX-RS規范做開發,可以確保服務器端以及客戶端代碼的可移植性。 李建業:我個人關注異步API這部分,主要是因為流式服務將會越來越多,那將大量需要這類支持。 InfoQ:能否為InfoQ的讀者推薦一款實用的RESTful API開發框架,并說明您的推介理由。 李錕:這個問題我就不詳細回答了。 不同的編程語言有不同的REST開發框架,對于REST的支持程度也不同。 開發RESTful API的需求范圍很廣,可選擇的開發框架的范圍也很廣。 保持多樣性是繁榮生態環境的基礎。 像Java就有支持JAX-RS規范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS規范的Spring MVC等等很多框架。 這些框架目前都做的不錯。 我對框架的選擇沒有傾向性。 RESTful API設計的最佳實踐應該是通用的,而不是必須依賴某種特定的開發框架。 李建業:不好意思,這個我不太重視,沒法推薦,不過我可以解釋一下為什么對RESTful API框架不感冒的原因。 REST作為一個架構風格,對我們的系統開發有很大影響,但是這些影響一般是針對架構(例如狀態無關)或者設計(例如資源識別)上的,所以一旦涉及到具體實現,主要工作就基本結束了,此時開發框架能做的事也就只有簡化編程了(相較而言,有的框架還能起到引導設計的作用),而由于RESTful會抽象動詞,所以實現層面中和API規范相關的工作本來就不多,那么框架的價值就更小了。 當然,我們也不可能直接基于servlet/rakc/wsgi來開發,不過一般的編程語言都會提供一些簡單的url route/match策略,我們使用這些就足夠了。 另外,有些框架能幫我們生成全部的動詞支持,但這也未必是好事,我一般傾向于按需實現——用到了再支持,這就更不需要太關注開發框架對RESTful的支持了。 丁雪豐:由于本人是Spring的擁護者,工作中也一直在使用Spring,所以在選擇框架時會更多地傾向Spring MVC(并不是說別的框架不好,這里有些個人主觀的成份)。 如果一定要選擇其他框架,也要選擇能夠方便與Spring集成的框架。 如果在項目中已經使用了Spring,那么沒有什么理由不選擇Spring MVC,鑒于目前Spring在各種項目中的高出鏡率,相信一般情況下都會選擇Spring MVC。 REST的成熟度模型中,第三層就是HATEOAS,Spring目前還提供了Spring Hateoas子項目,對鏈接、資源等方面的支持都做了一定的增強。 馬鈞:我目前在實際項目中使用的是Spray,這是一個開源的 REST/HTTP 工具包和底層網絡 IO 包,基于 Scala 和 Akka 構建。 輕量級、異步、非堵塞、基于 actor 模式、模塊化和可測試是Spray的特點。 InfoQ:HTTP2.0規范正在制定當中,您對它的期待是什么?李錕:我的期待包括兩個方面:應該做的和不應該做的。 HTTP/2.0規范應該做的:與HTTP/1.1協議保持兼容。 兼容的含義是說兩者可以并存,客戶端應用可以根據服務器端的能力,自由地選擇使用HTTP/2.0還是HTTP/1.1,而且選擇過程對應用來說是透明的。 改進HTTP協議(作為資源的統一接口)之中操作語義表達方式的語法,提高網絡傳輸效率。 更好地模塊化,這樣HTTP/2.0協議的實現能夠更好地模塊化。 應用程序可根據需要選擇適當的模塊,而不是要么全有、要么全無。 廢棄掉HTTP/1.1協議中一些很少有人用到的部分,例如采用管道(pipelining)方式發送請求。 增加更多的動詞,以適應除CRUD之外的其他場景。 HTTP/2.0規范不應該做的:HTTP/2.0協議不應該把底層的數據加密機制(即SSL)作為必選項。 HTTP/2.0協議不應該背離REST架構風格的約束,尤其是要確保操作語義對于中間組件的可見性。 在上面這兩個方面,Roy Fileidng曾經與SPDY協議設計者Mike Belshe發生過激烈爭論,詳情請看:Roy Fielding談Google SPDY協議李建業:對此規范關注不多,不知道會不會有對于流的支持,目前我所知道的只有chunk方式進行簡單的支持,但是真正的流需要區分數據通道和控制通道——哪怕是邏輯上的區分,這樣就直接對REST風格產生了很大沖擊,考慮到流式服務在未來的發展潛力,我特別期待業界在這方面有所進展。 丁雪豐:HTTP 2.0很大程度上是借鑒了Google的SPDY,就我而言,首先,希望這個規范能做到與HTTP 1.1的兼容,使用者如果只認識1.1,那么2.0能優雅“降級”;其次,希望2.0能帶來更好的性能,SPDY在這方面還是有所改進的,希望HTTP 2.0能再接再厲;最后,希望這個規范能在最終定稿時附帶一個最佳實踐,正確引導人們合理地使用HTTP 2.0。 馬鈞:沒研究過,估計即使出來,1.1還有很長的生命周期,不會很快被取代。
下一篇:接口與繼承的比較接口與繼承的區別
內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://m.sycxjdsbhs.com/article/aaa91f1c4be0e3ba9b69.html,復制請保留版權鏈接!
body,font,family,Arial,Helvetica,sans,serif,font,size,16px,color,333,h1,font,size,24px,margin,bottom,20px,ul,list,style,type,none,padding,0,margin,0,li,margin,bottom...。
本站公告 2024-09-29 18:35:43
迭代器模式是一種設計模式,它允許客戶端以順序方式遍歷和處理集合中的數據,而無需了解集合的內部結構,問題在遍歷和處理集合中的數據時,我們通常會遇到以下問題,客戶端需要了解集合的內部結構,以便遍歷數據,客戶端需要確保遍歷過程的安全并防止并發問題,解決方案迭代器模式提供了一種分離客戶端和集合內部結構的方法,它通過引入一個迭代器對象來實現這一...。
互聯網資訊 2024-09-27 12:16:22
隨著移動設備的普及,跨平臺應用程序開發變得越來越重要,其中,Flex和Flexbox作為強大的布局和樣式工具,在構建響應式且用戶友好的移動應用程序方面扮演著至關重要的角色,Flex布局Flex布局是一種CSS布局模型,它允許開發人員使用簡單而靈活的方式在容器中安排元素,它基于以下關鍵概念,容器,包含元素的父元素,彈性元素,容器內的子元...。
最新資訊 2024-09-25 05:59:37
目錄簡介安裝Linux基本命令文件管理用戶管理包管理網絡配置故障排除高級主題簡介Linux是一個免費開源的操作系統,因其穩定性、安全性、可靠性和自定義性而聞名,它最初由LinusTorvalds于1991年創建,此后一直在積極開發,今天,Linux已廣泛用于服務器、桌面、嵌入式系統和其他許多應用程序中,本指南旨在為Linux初學者提供...。
最新資訊 2024-09-24 20:32:59
CSS轉盤是掌握CSS中顏色屬性的重要工具,使用它,你可以輕松地選擇、混合和調整顏色,創建視覺上吸引人的網頁設計,CSS轉盤簡介CSS轉盤是一個圓形圖表,代表了可用于CSS的所有顏色,它按以下方式組織,原色,紅色、黃色和藍色,這是所有其他顏色的基礎,二次色,橙色、綠色和紫色,這些顏色通過混合原色創建,三級色,這些顏色通過混合原色和二次...。
本站公告 2024-09-17 04:04:53
以下內容為供應商基本情況表填寫范本,序號項目填寫要求填寫示例1供應商名稱填寫供應商的全稱北京某某科技有限公司2供應商地址填寫供應商的詳細地址北京市海淀區某某路某某號某某大廈3供應商聯系人填寫供應商的對接人的姓名張三4供應商聯系電話填寫供應商的對接人的聯系電話138123456785供應商郵箱填寫供應商的對接人的郵箱地址zhangsan...。
技術教程 2024-09-15 19:04:18
u003c,sup>,應用指數函數求導公式在許多應用中都有著廣泛的應用,這里舉幾個例子,物理學,指數函數用于描述許多物理現象,如熱傳遞、放射性衰變和電容充放電,金融學,指數函數用于描述復利增長和指數基金的收益率,生物學,指數函數用于描述種群增長和藥物濃度的變化,結論指數函數求導公式是微積分中一個非常重要的公式,它有著廣泛的應用,...。
互聯網資訊 2024-09-13 13:58:06
設置Java環境變量的目的環境變量是存儲有關操作系統或應用程序配置的信息的特殊變量,對于Java應用程序,環境變量對于以下目的至關重要,指定Java虛擬機,JVM,的位置設置類路徑,該路徑指定JVM應搜索類文件的位置配置其他Java相關設置,例如堆內存大小和垃圾收集器選項通過正確設置Java環境變量,您可以確保Java程序能夠正常運行...。
互聯網資訊 2024-09-11 22:20:48
簡介指針函數是C和C,編程中的一個強大工具,可以顯著提高你的編程技能,通過理解指針函數的工作原理,你可以編寫出更簡潔、更高效、更可維護的代碼,本文將指導你掌握指針函數,并提供一系列示例和練習來鞏固你的理解,指針函數的概念指針函數是一種指向函數的指針,這意味著它們存儲的是函數的內存地址,而不是函數本身,你可以使用指針函數來間接調用函數...。
技術教程 2024-09-09 07:08:03
本文檔旨在幫助您解決PHP與MicrosoftSQLServer連接時遇到的常見問題,如果您正在與連接問題作斗爭,請按照以下步驟進行操作,檢查您的連接信息確保您正在使用正確的服務器名稱或IP地址,確保您正在使用正確的數據庫名稱,確保您正在使用正確的用戶名和密碼,檢查您的PHP配置確保您已經安裝了PHPSQLServer擴展,確保您已經...。
本站公告 2024-09-06 21:20:29
ASP,ActiveServerPages,是一種由微軟開發的服務器端腳本語言,用于創建動態網頁,它允許開發人員使用VBScript或Jscript等腳本語言在網頁中嵌入服務器端邏輯,ASP源代碼ASP源代碼是一組包含HTML、腳本和指令的文本文件,它使用.asp擴展名,并由ASP引擎處理,ASP引擎解析源代碼,執行腳本邏輯,并生成包...。
最新資訊 2024-09-06 13:26:37
織夢,DedeCMS,作為國內領先的CMS系統,因其強大的功能和良好的擴展性而受到眾多網站開發者的青睞,隨著網絡安全形勢的日益嚴峻,織夢的安全問題也日益突出,為了保護網站免受威脅,有必要對織夢進行二次開發以加強其安全性,織夢的安全隱患織夢系統自身存在一些安全隱患,主要表現在以下幾個方面,數據庫注入漏洞,織夢系統默認使用MySQL數據庫...。
技術教程 2024-09-06 00:08:52