input发送a.jax_JAX-RS 2.0:服务器端处理管道
input發(fā)送a.jax
 這篇文章的靈感來自JAX-RS 2.0規(guī)范文檔 (附錄C)中的Processing Pipeline部分。 我喜歡它的原因在于它提供了JAX-RS中所有模塊的漂亮快照-以準備好吞咽的膠囊形式! 
禮貌– JAX-RS 2.0規(guī)范文檔
因此,我想到了使用此圖簡要概述不同的JAX-RS組件以及它們?nèi)绾蜗嗷f(xié)調(diào)。
涵蓋了什么?
- 過濾器(請求和響應(yīng))
- 方法匹配
- 注射
- 攔截器(請求和響應(yīng))
- 實體提供者(請求和響應(yīng))
注意:這里討論的是服務(wù)器端處理管道,即在客戶端發(fā)送HTTP請求(GET,POST,PUT等)之后觸發(fā)的動作序列
當客戶端(瀏覽器或自定義REST客戶端)向您的RESTful服務(wù)發(fā)送HTTP請求時,一切就開始了!
請求過濾器(鏈)
客戶端請求由JAX-RS過濾器處理。 它們適用于服務(wù)器端和客戶端(我們將研究服務(wù)器端過濾器-基于請求和響應(yīng))
- 過濾器是可選組件,您可以通過簡單地實現(xiàn)ContainerRequestFilter接口來編寫過濾器。 需要使用@Provider批注對它們進行批注,以通過JAX-RS運行時自動檢測
- 可以更改ContainerRequestContext的實例并更改標頭,Cookie,URI等屬性。過濾器不允許您訪問HTTP請求正文/消息有效負載( 攔截器可以做到這一點)
- 可用于實現(xiàn)日志記錄,身份驗證等
- 如果需要在資源方法匹配之前執(zhí)行過濾器實現(xiàn)類,請在實現(xiàn)類上使用@PreMatching批注。
- 過濾器可以(全局)綁定到所有JAX-RS方法,也可以使用@NamedBinding批注或DynamicFeature接口的實現(xiàn)有選擇地綁定
- @Priority批注可用于確定多個過濾器(順序鏈)的執(zhí)行順序。
方法匹配
在(成功)執(zhí)行過濾器之后,JAX-RS運行時將啟動資源方法匹配過程
- 調(diào)用的確切方法基于規(guī)范概述的算法 (盡管JAX-RS提供程序不受其約束)
- 由以下提到的注釋的組合確定
- @ GET,@ PUT,@ POST,@ DELETE等–這些注釋應(yīng)與實際的HTTP操作匹配(注釋到HTTP動詞的映射非常明顯)
- @Path –其值(相對于上下文根)用于映射請求URI,例如/ tweeters / all
- @Consumes –其值應(yīng)與HTTP請求中發(fā)送的Content-Type標頭值匹配
- @Produces –其值應(yīng)與HTTP請求中發(fā)送的Accept標頭值匹配
HTTP組件注入
方法匹配完成后,所需的HTTP組件將在JAX-RS運行時注入到JAX-RS資源類中(如果已配置)。 我們需要做的就是使用適當?shù)淖⑨?
HTTP URI參數(shù)
- @QueryParam –從URI查詢參數(shù)中提取值并將其注入,例如, http : //tweeter.com/info?tweeter = abhi_tweeter上的GET請求
- @PathParam –從URI模板參數(shù)中提取值并將其注入,例如在http://tweeter.com/info/tweeter/abhi_tweeter上的GET請求
- @MatrixParam –從URI矩陣參數(shù)中提取值并將其注入
其他HTTP組件
JAX-RS使訪問(注入)HTTP請求組件(如標頭,Cookie甚至HTTP表單數(shù)據(jù))變得容易
- @HeaderParam –提取請求的標頭。 您還可以使用@Context批注注入HttpHeaders實例
- @CookieParam –用于從HTTP請求中注入HTTP cookie
- @FormParam –可以幫助使用HTTP POST請求從通過HTML表單發(fā)送的屬性中插入值
- @BeanParam –可以幫助在自定義域類的實例變量上使用上述所有與注入相關(guān)的注釋,而不是使用這些注釋將值注入各個方法參數(shù)
請求攔截器(鏈)
攔截器適用于服務(wù)器端和客戶端(我們將僅查看服務(wù)器端攔截器-基于請求和響應(yīng))
- 攔截器有助于在處理HTTP請求有效負載之前對其進行突變
- 僅當在JAX-RS運行時中注冊了MessageBodyReader (請參見下一主題)實現(xiàn)時,才調(diào)用請求攔截器。
- 用于傳入服務(wù)器請求的攔截器由ReaderInterceptor接口的實現(xiàn)處理,并且需要使用@Provider注釋進行注釋,以通過JAX-RS運行時自動檢測
- ReaderInterceptorContext實例在JAX-RS運行時傳遞,并且可以使用java.io.InputStream形式訪問HTTP正文。
- 攔截器可以(全局)綁定到所有JAX-RS方法,也可以通過使用@NamedBinding批注或DynamicFeature接口的實現(xiàn)有選擇地綁定
- 攔截器可以被鏈接和(使用@priority)和優(yōu)先呼叫的繼續(xù)進行的ReaderInterceptorContext的方法自動調(diào)用鏈中的或化MessageBodyReader實現(xiàn)本身下一個攔截
- ReaderInterceptor充當MessageBodyReader的包裝器(在內(nèi)部調(diào)用)
實體提供者(
實體提供者幫助將HTTP消息有效負載轉(zhuǎn)換為適當?shù)腏ava類型(用于注入到JAX-RS資源類的方法參數(shù)中),反之亦然
- HTTP請求有效負載到其對應(yīng)的Java類型的轉(zhuǎn)換是通過實現(xiàn)MessageBodyReader接口的具體類完成的
- MessageBodyReader實現(xiàn)的readFrom方法是執(zhí)行操作的地方。 JAX-RS運行時會傳入所有上下文信息,包括有效載荷本身(以InputStream的形式),然后可以對其進行自省并將其轉(zhuǎn)換為適當?shù)腏ava類型。
- JAX-RS規(guī)范要求,對于某些Java類型(例如String,InputStream,File等),實現(xiàn)應(yīng)包含MessageBodyReader接口的現(xiàn)成實現(xiàn)。
響應(yīng)過濾器(鏈)
響應(yīng)過濾器類似于前面討論的以請求為中心的過濾器。
- 響應(yīng)過濾器是可選組件,您可以通過簡單地實現(xiàn)ContainerResponseFilter接口來編寫一個。
- 這些類型的過濾器用于修改響應(yīng)標頭,添加cookie等。可以更改ContainerResponseContext的實例并更改屬性以實現(xiàn)此目的。 篩選器不允許您訪問HTTP響應(yīng)正文/消息有效負載( 攔截器可以執(zhí)行此操作)
- 需要使用@Provider批注對它們進行批注,以通過JAX-RS運行時自動檢測
- 過濾器可以(全局)綁定到所有JAX-RS方法,也可以使用@NamedBinding批注或DynamicFeature接口的實現(xiàn)有選擇地綁定
- @Priority批注可用于確定多個過濾器(順序鏈)的執(zhí)行順序。
響應(yīng)攔截器(鏈)
- 僅當注冊MessageBodyWriter (請參閱下一主題)以處理傳出的HTTP有效負載時,才調(diào)用它們。
- 傳出服務(wù)器響應(yīng)的攔截器由類WriterInterceptor的實現(xiàn)處理,并且需要使用@Provider注釋進行注釋,以通過JAX-RS運行時自動檢測
- 可以將攔截器進行鏈接和確定優(yōu)先級(使用@Priority),并調(diào)用WriterInterceptorContext的proce方法會自動調(diào)用鏈中的下一個攔截器或MessageBodyWriter實現(xiàn)本身
- WriterInterceptor充當MessageBodyWriter的包裝器(在內(nèi)部調(diào)用)
實體提供者(
- 應(yīng)用程序代碼返回的Java對象到HTTP響應(yīng)有效負載的轉(zhuǎn)換是通過實現(xiàn)MessageBodyWriter接口的具體類完成的
- MessageBodyWriter實現(xiàn)的writeTo方法是執(zhí)行操作的地方。 JAX-RS運行時將所有上下文信息與OutputStream一起傳遞給OutputStream ,從Java類型轉(zhuǎn)換后,響應(yīng)流可以寫入該OutputStream。
- JAX-RS規(guī)范要求,對于某些Java類型(如String,InputStream,File等),實現(xiàn)應(yīng)包含MessageBodyWriter接口的現(xiàn)成實現(xiàn)。
好吧! 這是對服務(wù)器端請求處理如何在JAX-RS中工作以及哪些組件起作用的相當簡短的概述。 謝謝閱讀。 干杯!
參考資料
- JAX-RS規(guī)格文件
- Java EE 7 API Java文檔
翻譯自: https://www.javacodegeeks.com/2015/01/jax-rs-2-0-server-side-processing-pipeline.html
input發(fā)送a.jax
總結(jié)
以上是生活随笔為你收集整理的input发送a.jax_JAX-RS 2.0:服务器端处理管道的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 手机是如何设置蓝牙功能手机是如何设置蓝牙
- 下一篇: 如何给用支付宝、联通手机营业厅充值的话费
