




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
JAX-RS2.0:REST式Web服務(wù)API中新增的和值得關(guān)注的功能JohnClinganJavaEE和GlassFish產(chǎn)品經(jīng)理john.clingan@JAX-RS2.0中的新增功能JAX-RS回顧客戶端API通用配置異步處理過濾器/攔截器超媒體支持服務(wù)器端內(nèi)容協(xié)商JAX-RS—用于REST式服務(wù)的JavaAPI基于POJO的資源類以HTTP為中心的編程模型實(shí)體格式獨(dú)立性容器獨(dú)立性包括在JavaEE中注解驅(qū)動(dòng)的標(biāo)準(zhǔn)API,用于幫助開發(fā)人員使用Java構(gòu)建REST式
Web服務(wù)和客戶端JAX-RS示例...@POST@Path("/withdrawal")@Consumes("text/plain")@Produces("application/json")publicMoneywithdraw(@PathParam("card")Stringcard,@QueryParam("pin")Stringpin,Stringamount){returngetMoney(card,pin,amount);}}JAX-RS注解方法注解目的GET@GET讀取,可能緩存POST@POST在沒有已知ID的情況下更新或創(chuàng)建PUT@PUT在有已知ID的情況下更新或創(chuàng)建DELETE@DELETE刪除HEAD@HEAD沒有響應(yīng)的GETOPTIONS@Options支持的方法JAX-RS注解(續(xù))注解目的@PathParam綁定來自URI的值,例如
@PathParam(“id”)@QueryParam綁定查詢名稱的值/查詢值,例如
@QueryParam(“name”)@CookieParam綁定cookie的值,例如
@CookieParam(“JSESSIONID”)@HeaderParam綁定HTTP標(biāo)頭的值,例如
@HeaderParam(“Accept”)@FormParam綁定HTML表單的值,例如
@FormParam(“name”)@MatrixParam綁定矩陣參數(shù)的值,例如
@MatrixParam(“name”)JAXRS2.0客戶端API客戶端APIHTTP客戶端庫太低級利用JAX-RS1.xAPI中的提供商/概念主要實(shí)現(xiàn)引入的專用API動(dòng)機(jī)客戶端API//GetinstanceofClientClientclient=ClientBuilder.newClient();//GetaccountbalanceStringbal=client.target("http://.../atm/{cardId}/balance").resolveTemplate("cardId","111122223333").queryParam("pin","9876").request("text/plain").get(String.class);客戶端API//WithdrawsomemoneyMoneymoney=
client.target("http://.../atm/{cardId}/withdrawal").resolveTemplate("cardId","111122223333").queryParam("pin","9876").request("application/json").post(text("50.0"),Money.class);客戶端APIInvocationinvocation1=client.target("http://.../atm/{cardId}/balance")….request(“text/plain”).buildGet();Invocationinvocation2=client.target("http://.../atm/{cardId}/withdraw")….request("application/json").buildPost(text("50.0"));客戶端APICollection<Invocation>invocations=
Arrays.asList(inv1,inv2);Collection<Response>responses=Collections.transform(invocations,newF<Invocation,Response>(){publicResponseapply(Invocationinvocation){returninvocation.invoke();}});客戶端API//CreateclientandregisterMyProvider1Clientclient=ClientBuilder.newClient();client.register(MyProvider1.class);//Createatmtarget;inheritsMyProvider1WebTargetatm=client.target("http://.../atm");//RegisterMyProvider2atm.register(MyProvider2.class);//Createbalancetarget;inheritsMyProvider1,MyProvider2WebTargetbalance=atm.path(”{cardId}/balance");//RegisterMyProvider3balance.register(MyProvider3.class);JAXRS2.0
通用配置通用配置—?jiǎng)訖C(jī)客戶端客戶端.register(JsonMessageBodyReader.class).register(JsonMessageBodyWriter.class).register(JsonpInterceptor.class).property(“”,“callback”).property(“jsonp.callback.queryParam”,“true”)...通用配置—?jiǎng)訖C(jī)服務(wù)器端publicclassMyAppextendsjavax.ws.rs.core.Application{publicSet<Class<?>>getClasses(){Set<Class<?>>classes=newHashSet<…>();...classes.add(JsonMessageBodyReader.class);classes.add(JsonMessageBodyWriter.class);classes.add(JsonpInterceptor.class);...returnclasses;}}通用配置—解決方案客戶端客戶端.register(JsonMessageBodyReader.class).register(JsonMessageBodyWriter.class).register(JsonpInterceptor.class).property(“”,“callback”).property(“jsonp.callback.queryParam”,“true”)...JsonFeaturejf=newJsonFeature().enableCallbackQueryParam();client.register(jf);通用配置—解決方案服務(wù)器端publicSet<Class<?>>getClasses(){...classes.add(JsonMessageBodyReader.class);classes.add(JsonMessageBodyWriter.class);classes.add(JsonpInterceptor.class);...}publicSet<Class<?>>getClasses(){...classes.add(JsonFeature.class);...}通用配置publicinterfaceConfigurable{ConfigurationgetConfiguration();Configurableproperty(Stringname,Objectvalue);Configurableregister(...);}publicinterfaceConfiguration{Set<Class>getClasses();Map<Class,Integer>getContracts(ClasscomponentClass);Set<Object>getInstances();Map<String,Object>getProperties();ObjectgetProperty(Stringname);Collection<String>getPropertyNames();booleanisEnabled(Featurefeature);booleanisRegistered(Objectcomponent);...}通用配置publicinterfaceFeature{booleanconfigure(FeatureContextcontext);}Feature示例publicvoidJsonFeatureimplementsFeature{publicbooleanconfigure(FeatureContextcontext){context.register(JsonMessageBodyReader.class).register(JsonMessageBodyWriter.class).register(JsonpInterceptor.class).property(CALLBACK_NAME,calbackName).property(USE_QUERY_PARAM,useQueryParam);returntrue;}}動(dòng)態(tài)Feature僅服務(wù)器端publicinterfaceDynamicFeature{voidconfigure(ResourceInfori,FeatureContextcontext);}publicinterfaceResourceInfo{MethodgetResourceMethod();Class<?>getResourceClass();}JAXRS2.0
異步處理異步處理服務(wù)器API分流I/O容器線程高效的異步事件處理利用Servlet3.x異步支持(如果可用)客戶端API異步的請求調(diào)用API異步處理@Stateless@Path("/async/longRunning")publicclassMyResource{@GET@AsynchronouspublicvoidlongRunningOp(@SuspendedAsyncResponsear){ar.setTimeoutHandler(newMyTimoutHandler());ar.setTimeout(15,SECONDS);finalStringresult=executeLongRunningOperation();ar.resume(result);}}異步處理:服務(wù)器端publicinterfaceAsyncResponse{publicvoidresume(Object/Throwableresponse);publicvoidcancel();publicvoidcancel(int/DateretryAfter);publicbooleanisSuspended();publicbooleanisCancelled();publicbooleanisDone();publicvoidsetTimeout(longtime,TimeUnitunit);publicvoidsetTimeoutHandler(TimeoutHandlerhandler);publicCollection<Class<?>>register(Class<?>callback);publicMap<Class<?>,Collection<Class<?>>>register(Class<?>callback,Class<?>...callbacks);publicCollection<Class<?>>register(Objectcallback);publicMap<Class<?>,Collection<Class<?>>>register(Objectcallback,Object...callbacks);}異步處理:服務(wù)器端@Target({ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceSuspended{}publicinterfaceTimeoutHandler{voidhandleTimeout(AsyncResponseasyncResponse);}異步處理:服務(wù)器端publicinterfaceCompletionCallback{publicvoidonComplete(Throwablethrowable);}publicinterfaceConnectionCallback{publicvoidonDisconnect(AsyncResponsedisconnected);}異步處理:客戶端WebTargettarget=client.target("http://.../balance”)…//StartasynccallandregistercallbackFuture<?>handle=target.request().async().get(newInvocationCallback<String>(){voidcomplete(Stringbalance){…}voidfailed(InvocationExceptione){…}});//Afterwaitingfortoolong…if(!handle.isDone())handle.cancel(true);JAXRS2.0
過濾器/攔截器過濾器和攔截器定制JAX-RS請求/響應(yīng)處理用例:日志記錄、壓縮、安全性,等等針對客戶端和服務(wù)器API而引入替換現(xiàn)有的專用支持動(dòng)機(jī)過濾器和攔截器非包裝過濾器鏈過濾器不直接調(diào)用鏈中的下一個(gè)過濾器由JAX-RS運(yùn)行時(shí)管理
每個(gè)過濾器決定是繼續(xù)還是中斷鏈過濾每個(gè)傳入/傳出消息請求請求ContainerRequestFilter,ClientRequestFilter響應(yīng)響應(yīng)ContainerResponseFilter,ClientResponseFilter服務(wù)器端特性@PreMatching、DynamicFeature過濾器和攔截器日志記錄過濾器示例publicclassRequestLoggingFilterimplementsContainerRequestFilter{@Overridepublicvoidfilter(ContainerRequestContextrequestContext){log(requestContext);//non-wrapping=>returnswithoutinvokingthenextfilter}...}過濾器和攔截器只有當(dāng)發(fā)生實(shí)體處理時(shí)才會調(diào)用性能提升
包裝攔截器鏈每個(gè)攔截器都通過ceed()調(diào)用鏈中的下一個(gè)攔截器攔截實(shí)體提供者M(jìn)essageBodyReader
攔截器ReaderInterceptor接口MessageBodyWriter攔截器WriterInterceptor接口過濾器和攔截器Gzip讀取器攔截器示例publicclassGzipInterceptorimplementsReaderInterceptor{@OverrideObjectaroundReadFrom(ReaderInterceptorContextctx){InputStreamold=ctx.getInputStream();ctx.setInputStream(newGZIPInputStream(old));//wrapping=>invokesthenextinterceptorObjectentity=ceed();ctx.setInputStream(old);returnentity;}}過濾器和攔截器應(yīng)用程序請求過濾器過濾器網(wǎng)絡(luò)傳輸……響應(yīng)過濾器過濾器寫入器攔截器…MBW…MBR寫入器攔截器讀取器攔截器讀取器攔截器過濾器和攔截器響應(yīng)應(yīng)用程序過濾器過濾器網(wǎng)絡(luò)…響應(yīng)過濾器過濾器…MBW寫入器攔截器寫入器攔截器過濾器過濾器…請求請求讀取器攔截器…MBR讀取器攔截器過濾器過濾器資源匹配@PreMatching綁定和優(yōu)先級綁定將過濾器和攔截器與資源方法相關(guān)聯(lián)服務(wù)器端概念優(yōu)先級聲明在執(zhí)行鏈中的相對位置@Priority(intpriority)過濾器和攔截器共有的概念有作用域的綁定全局綁定靜態(tài)@NameBinding默認(rèn)@PreMatching動(dòng)態(tài)DynamicFeature無綁定@NameBinding@Target({ElementType.TYPE,ElementType.METHOD})@Retention(value=RetentionPolicy.RUNTIME)public@interfaceLogged{}@Provider@Logged@Priority(USER)publicclassLoggingFilterimplementsContainerRequestFilter,
ContainerResponseFilter{…}綁定@Path("/greet/{name}")@Produces("text/plain")publicclassMyResourceClass{@Logged@GETpublicStringhello(@PathParam("name")Stringname){return"Hello"+name;}}DynamicFeature示例僅服務(wù)器端publicvoidSecurityFeatureimplementsDynamicFeature{publicbooleanconfigure(ResourceInfori,FeatureContextcontext){String[]roles=getRolesAllowed(ri);if(roles!=null){context.register(newRolesAllowedFilter(roles));}}...}JAXRS2.0
超媒體支持超媒體支持REST原則標(biāo)識符和鏈接HATEOAS(超媒體作為應(yīng)用程序狀態(tài)的引擎)鏈接類型:結(jié)構(gòu)性鏈接過渡性鏈接超媒體支持Link:<http://.../orders/1/ship>;rel=ship,<http://.../orders/1/cancel>;rel=cancel...<orderid="1"><customer>http://.../customers/11</customer><address>http://.../customers/11/address/1</address><items><item><product>http://.../products/111</product><quantity>2</quantity></item><items>...</order>超媒體Link
和LinkBuilder
類RFC5988:Web鏈接支持ResponseBuilder
和過濾器中的鏈接過渡性鏈接(標(biāo)頭)支持手動(dòng)結(jié)構(gòu)性鏈接通過Link.JaxbAdapter
和Link.JaxbLink從客戶端API中的鏈接創(chuàng)建資源目標(biāo)超媒體//ProducerAPI(server-side)Linkself=Link.fromMethod(MyResource.class,”handleGet”).build();Linkupdate=Link.fromMethod(MyResource.class,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作預(yù)算合同范本
- 售后回購融資合同范例
- 二人合伙養(yǎng)狗合同范本
- 賣房定金違約合同范本
- 個(gè)人店面裝修合同范本
- 1內(nèi)9折回購合同范本
- 會展安裝設(shè)計(jì)合同范本
- 單位院子改造合同范本
- 單位刮大白合同范本
- 公司車輛洗車合同范例
- 預(yù)防校園欺凌主題班會課件(共36張課件)
- 閥控密封式鉛酸蓄電池使用說明書.
- 從業(yè)務(wù)骨干到管理者(課堂PPT)
- 高標(biāo)準(zhǔn)基本農(nóng)田土地整治項(xiàng)目工程施工費(fèi)預(yù)算表
- 河南省普通高校招生考生體格檢查表
- 新三板知識測評考題答案
- 英文版驗(yàn)資報(bào)告
- 試坑單環(huán)注水試驗(yàn)記錄表
- 管網(wǎng)工程停氣恢復(fù)供氣方案
- 英語教學(xué)經(jīng)驗(yàn)交流發(fā)言稿
- 水稻種植專業(yè)合作社簡介
評論
0/150
提交評論