使用JSR311规范快速的构建REST应用

3,630 views
3,516 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,630
On SlideShare
0
From Embeds
0
Number of Embeds
522
Actions
Shares
0
Downloads
79
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

使用JSR311规范快速的构建REST应用

  1. 1. 使用JSR311(JAX-RS)规范快速的构建REST应用<br />TonyDeng<br />http://friendfeed.com/tonydeng<br />http://twitter.com/wolfdeng<br />http://delicious.com/wolf.deng<br />http://wolfchina.blogbus.com<br />
  2. 2. 分享内容<br />JSR311(JAX-RS)规范介绍<br />常用的JAX-RSAPI介绍<br />JAX-RS框架介绍<br />ROA(面向资源架构)<br />如何使用JAX-RS框架快速的构建REST应用<br />代码演示<br />
  3. 3. JSR311(JAX-RS)项目介绍<br />JSR311 正式称呼 JAX-RS:Java API for RESTful Web Services<br />JSR311是Sun在2007年2月发布的一个基于annotation的API<br />JSR311项目地址https://jsr311.dev.java.net/<br />版本:<br />jsr311-1.0(稳定版)已经通过了JCP的投票同意<br />jsr311-1.1(草稿版)<br />
  4. 4. JAX-RS的特性<br />提供annotation的API规范<br />提出WADL(Web Application Description Language)规范来描述REST应用<br />https://wadl.dev.java.net<br />JSR-311 提供一组注释,相关类和接口都可以用来将Java 对象作为 Web 资源展示。该规范假定 HTTP 是底层网络协议。<br />它使用注释提供 URI 和相应资源类之间的清晰映射,以及 HTTP 方法与 Java 对象方法之间的映射。<br />API 支持广泛的 HTTP 实体内容类型,包括 HTML、XML、JSON、GIF、JPG 等。<br />它还将提供所需的插件功能,以允许使用标准方法通过应用程序添加其他类型。<br />
  5. 5. 常用的JAX-RSAPI介绍<br />@Context<br />Resource的上下文内容,比如URI,HttpRequest<br />@Provider<br />扩展自己的MediaType支持<br />@path<br />定义Resource的URI<br />@GET<br />httpgetmethod<br />@POST<br />httppostmethod<br />@PUT<br />http put method<br />@DELETE<br />http deletemethod<br />@Produces<br />定义Resource返回的MediaType<br />@Consumes<br />定义Resource接受的MediaType<br />@PathParam<br />定义URI中的变量<br />@FormParam<br />定义form表单中的变量<br />
  6. 6. JAX-RS框架介绍<br />
  7. 7. 实现JAX-RS规范的框架<br />Restlet<br />应该是最早的REST框架,在JAX-RS之前就已经有了。<br />http://www.restlet.org/<br />Jersey<br />Sun提供的实现参考<br />https://jersey.dev.java.net/<br />RESTEasy<br />Jboss的项目<br />http://www.jboss.org/resteasy/<br />CXF<br />Apache的一级项目<br />由Xfire项目和Celtix项目(一个开源的ESB项目)合并后演变过来<br />http://cxf.apache.org<br />
  8. 8. Restlet介绍<br />项目地址<br />http://www.restlet.org<br />http://www.noelios.com/<br />Restlet可以说是最早的REST框架,JAX-RS规范出来之前,它就已经存在了。<br />Restlet是在Servlet的之上发展的这套框架<br />http://www.restlet.org/about/introduction<br />Restlet并不是完全按照JAX-RS规范来实现<br />Restlet有自己的一套API<br />稳定版本1.1.5,jax-rs 1.0的实现<br />最新版本2.0-m4,jax-rs 1.0的实现<br />特性:<br />http://www.restlet.org/about/features<br />Native REST support<br />Available editions<br />Complete Web Server<br />Available Connectors<br />Available Representations<br />Flexible configuration<br />Security<br />Scalability<br />Upcoming features<br />
  9. 9. Jersey介绍<br />项目地址:<br />https://jersey.dev.java.net<br />Jersey是Sun提供的实现参考。由JAX-RS项目的成员来实现。<br />从某种意义上说,最符合JAX-RS规范<br />Jersey项目名称的来由:由于Jersey项目的主管非常喜欢自行车运动,而且当时正是环法自行车赛期间,所以起了这个名称。同时也透露出对Jersey这个项目的期望。<br />稳定版本为1.0.3,jax-rs1.0的实现<br />最新版本1.1.2-ea,jax-rs1.1的实现<br />特性:<br />提供Client,Service/Grizzly,WADL&JSON<br />Test Framework<br />Spring integration<br />Guice integration<br />MIME multipart<br />Client & Apache HTTP Client<br />Atom & Apache Abdera Simple HTTP server<br />Oautch support<br />
  10. 10. RESTEasy介绍<br />项目地址:<br />http://www.jboss.org/resteasy/<br />RESTEasy是有JBOSS提供的实现。<br />顾名思义,这个项目的初衷就是如何更好的让使用者很方便容易的创建REST应用<br />最新稳定版本为1.1.GA,jax-rs 1.0的实现<br />特性:<br />Fully certified JAX-RS implementation <br />Portable to any app-server/Tomcat that runs on JDK 5 or higher <br />Embeddedable server implementation for junit testing <br />Client framework that leverages JAX-RS annotations so that you can write HTTP clients easily (JAX-RS only defines server bindings) <br />Client &quot;Browser&quot; cache. Supports HTTP 1.1 caching semantics including cache revalidation<br />Server in-memory cache. Local response cache. Automatically handles ETag generation and cache revalidation<br />Rich set of providers for: XML, JSON, YAML, Fastinfoset, Multipart, XOP, Atom, etc. <br />JAXB marshalling into XML, JSON, Jackson, Fastinfoset, and Atom as well as wrappers for maps, arrays, lists, and sets of JAXB Objects. <br />GZIP content-encoding. Automatic GZIP compression/decompression suppport in client and server frameworks<br />Asynchronous HTTP (Comet) abstractions for JBoss Web, Tomcat 6, and Servlet 3.0 <br />Asynchronous Job Service. <br />Rich interceptor model. <br />EJB, Seam, Guice, Spring, and Spring MVC integration <br />
  11. 11. CXF介绍<br />项目地址:<br />http://cxf.apache.org<br />Apache的一级项目<br /><ul><li>由Xfire项目和Celtix项目(一个开源的ESB项目)合并后演变过来</li></ul>更加偏向SOA<br />稳定版本:2.2.3,jax-rs 1.0的实现。<br />最新版本:2.3-SNAPSHOT,jax-rs 1.0的实现<br />支持标准:<br />JAX-WS, JSR-181, SAAJ, JAX-RS<br />SOAP 1.1, 1.2, WS-I BasicProfile, WS-Security, WS-Addressing, WS-RM, WS-Policy<br />WSDL 1.1<br />MTOM<br />
  12. 12. ROA 面向资源的架构<br />
  13. 13. ROA(面向资源架构)<br />世间万物皆为资源<br />REST对信息的核心抽象就是资源<br />资源并不是具体的存储对象,它是对事物概念上的一个抽象<br />Resource是有层次的<br />Resource的定义是一门大学问<br />面向资源的建模<br />DDD(Domain-Driven Design),面向对象建模,ER建模<br />
  14. 14. 如何规划ResourceURI<br />使用URITemplate来描述ResourceURI的定义<br />http://bitworking.org/projects/URI-Templates/spec/draft-gregorio-uritemplate-03.html<br />
  15. 15. URI对比<br />家族话题<br />/familyBBS?method=GET&json={“familyId”:193,”bbsId”:412}<br />/family/193/topic/412<br /><ul><li>家族投票</li></ul>/familyVote?method=GET&json={“familyId”:193,”bbsId”:412}<br />/family/193/topic/412/vote<br />
  16. 16. 例子:社区家族URI规划<br />家族<br />/familys<br />/familys/@self/{uid}/{page},{pageSize}<br />/familys/@friends/{uid}/{page},{pageSize}<br />家族分类<br />/familys/type<br />家族标签<br />/familys/tags<br />/familys/tags/@hot/{num}<br />家族重名<br />/familys/names/@userd/{fname}<br />单个家族信息<br />/family/{fid}<br />家族图标<br />/family/{fid}/icon<br />家族设置<br />/family/{fid}/setting<br />家族成员<br />/family/{fid}/members<br />/family/{fid}/members/@manager<br />家族转让<br />/family/{fid}/transfer<br />
  17. 17. 例子:社区家族URI规划<br />家族话题<br />/family/{fid}/topics<br />/family/{fid}/topics/{page},{pageSize}<br />/family/{fid}/topics/@elite /{page},{pageSize}<br />/family/{fid}/topics/@vote /{page},{pageSize}<br />家族话题<br />/family/{fid}/topic/{tid}<br />/family/{fid}/topic/{tid}/vote<br />/family/{fid}/topic/{tid}/vote/members<br />/family/{fid}/topic/{tid}/ {page},{pageSize}<br />/family/{fid}/topic/{tid}/reply<br />/family/{fid}/topic/{tid}/reply/{rid}<br />
  18. 18. 如何使用JAX-RS框架快速的构建REST应用<br />
  19. 19. 选用框架<br />Build Tools<br />Maven 2.2.0<br />Jersey<br />jsr311 1.0<br />jersey-server 1.0.3<br />jersey-json 1.0.3<br />jersey-spring 1.0.3<br />JAXB<br />jaxb-api 2.1<br />Sun jaxb-impl 2.1.6<br />Spring<br />spring 2.5.6<br />
  20. 20. 代码演示<br />
  21. 21. 谢谢<br />

×