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