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