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