`

使用 JAX-RS 简化 REST 应用开发

    博客分类:
  • Rest
阅读更多

 

From : http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/

 

REST 简介

REST 是英文 Representational State Transfer 的缩写,有中文翻译为“具象状态传输”。REST 这个术语是由 Roy Fielding 在他的博士论文 《 Architectural Styles and the Design of Network-based Software Architectures 》中提出的。REST 并非标准,而是一种开发 Web 应用的架构风格,可以将其理解为一种设计模式。REST 基于 HTTP,URI,以及 XML 这些现有的广泛流行的协议和标准,伴随着 REST,HTTP 协议得到了更加正确的使用。

相较于基于 SOAP 和 WSDL 的 Web 服务,REST 模式提供了更为简洁的实现方案。目前,越来越多的 Web 服务开始采用 REST 风格设计和实现,真实世界中比较著名的 REST 服务包括:Google AJAX 搜索 APIAmazon Simple Storage Service (Amazon S3)等。

基于 REST 的 Web 服务遵循一些基本的设计原则:

  • 系统中的每一个对象或是资源都可以通过一个唯一的 URI 来进行寻址,URI 的结构应该简单、可预测且易于理解,比如定义目录结构式的 URI。
  • 以遵循 RFC-2616 所定义的协议的方式显式地使用 HTTP 方法,建立创建、检索、更新和删除(CRUD:Create, Retrieve, Update and Delete)操作与 HTTP 方法之间的一对一映射:
    • 若要在服务器上创建资源,应该使用 POST 方法;
    • 若要检索某个资源,应该使用 GET 方法;
    • 若要更改资源状态或对其进行更新,应该使用 PUT 方法;
    • 若要删除某个资源,应该使用 DELETE 方法。
  • URI 所访问的每个资源都可以使用不同的形式加以表示(比如 XML 或者 JSON),具体的表现形式取决于访问资源的客户端,客户端与服务提供者使用一种内容协商的机制(请求头与 MIME 类型)来选择合适的数据格式,最小化彼此之间的数据耦合。
 

JAX-RS -- Java API for RESTful Web Services

Java EE 6 引入了对 JSR-311 的支持。JSR-311(JAX-RS:Java API for RESTful Web Services)旨在定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架。同时,JAX-RS 使用 POJO 编程模型和基于标注的配置,并集成了 JAXB,从而可以有效缩短 REST 应用的开发周期。

JAX-RS 定义的 API 位于 javax.ws.rs 包中,其中一些主要的接口、标注和抽象类如 图 1所示。

图 1. javax.ws.rs 包概况

图 1. javax.ws.rs 包概况

JAX-RS 的具体实现由第三方提供,例如 Sun 的参考实现 Jersey、Apache 的 CXF 以及 JBoss 的 RESTEasy。

在接下来的文章中,将结合一个记账簿应用向读者介绍 JAX-RS 一些关键的细节。

 

参数标注

JAX-RS 中涉及 Resource 方法参数的标注包括:@PathParam、@MatrixParam、@QueryParam、@FormParam、@HeaderParam、@CookieParam、@DefaultValue 和 @Encoded。这其中最常用的是 @PathParam,它用于将 @Path 中的模板变量映射到方法参数,模板变量支持使用正则表达式,变量名与正则表达式之间用分号分隔。例如对 清单 1中所示的 BookkeepingService 类,如果使用 Get 方法请求资源”/person/jeffyin”,则 readPersonByName 方法将被调用,方法参数 name 被赋值为”jeffyin”;而如果使用 Get 方法请求资源”/person/123”,则 readPerson 方法将被调用,方法参数 id 被赋值为 123。要了解如何使用其它的参数标注 , 请参考 JAX-RS API

JAX-RS 规定 Resource 方法中只允许有一个参数没有打上任何的参数标注,该参数称为实体参数,用于映射请求体。例如 清单 1 中所示的 BookkeepingService 类的 createPerson 方法和 updatePerson 方法的参数 person。

参数与返回值类型

Resource 方法合法的参数类型包括:

  1. 原生类型
  2. 构造函数接收单个字符串参数或者包含接收单个字符串参数的静态方法 valueOf 的任意类型
  3. List<T>,Set<T>,SortedSet<T>(T 为以上的 2 种类型)
  4. 用于映射请求体的实体参数

Resource 方法合法的返回值类型包括:

  1. void:状态码 204 和空响应体
  2. Response:Response 的 status 属性指定了状态码,entity 属性映射为响应体
  3. GenericEntity:GenericEntity 的 entity 属性映射为响应体,entity 属性为空则状态码为 204,非空则状态码为 200
  4. 其它类型:返回的对象实例映射为响应体,实例为空则状态码为 204,非空则状态码为 200(如果想把java bean返回到前台,可以使用JAXB对这个bean进行序列化为json串或是xml等)

对于错误处理,Resource 方法可以抛出非受控异常 WebApplicationException 或者返回包含了适当的错误码集合的 Response 对象。

Context 标注

通过 Context 标注,根 Resource 类的实例字段可以被注入如下类型的上下文资源:

  1. Request、UriInfo、HttpHeaders、Providers、SecurityContext
  2. HttpServletRequest、HttpServletResponse、ServletContext、ServletConfig

要了解如何使用第 1 种类型的上下文资源 , 请参考 JAX-RS API

 

内容协商与数据绑定

Web 资源可以有不同的表现形式,服务端与客户端之间需要一种称为内容协商(Content Negotiation)的机制:作为服务端,Resource 方法的 Produces 标注用于指定响应体的数据格式(MIME 类型),Consumes 标注用于指定请求体的数据格式;作为客户端,Accept 请求头用于选择响应体的数据格式,Content-Type 请求头用于标识请求体的数据格式。

JAX-RS 依赖于 MessageBodyReader 和 MessageBodyWriter 的实现来自动完成返回值到响应体的序列化以及请求体到实体参数的反序列化工作,其中,XML 格式的请求/响应数据与 Java 对象的自动绑定依赖于 JAXB 的实现。

JAX-RS 与 JPA 的结合使用

由于 JAX-RS 和 JPA 同样都使用了基于 POJO 和标注的编程模型,因而很易于结合在一起使用。示例应用中的 Web 资源 ( 如账目 ) 同时也是持久化到数据库中的实体,同一个 POJO 类上既有 JAXB 的标注,也有 JPA 的标注 ( 或者还有 Gson 的标注 ) ,这使得应用中类的个数得以减少。如 清单 7所示,Account 类可以在 JAX-RS 与 JPA 之间得到复用,它不但可以被 JAX-RS 绑定为请求体 / 响应体的 XML/JSON 数据,也可以被 JPA 持久化到关系型数据库中。

 

分享到:
评论

相关推荐

    restful jax-rs

    JAX-RS是JAVA EE6 引入的一个新技术。 JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照...JAX-RS使用了Java SE5引入的Java标注来简化Web服务的客户端和服务端的开发和部署。

    JAX-RS web 服务配置及教程

    REST 软件架构基于具象资源传输。RESTful Web 服务提供了一些优势:简单、轻量级、快速。RESTful Web 服务公开了一组由 URI 标识的资源。...Jersey 是 JAX-RS 的参考实现,简化了 Java 中 RESTful Web 服务的开发。

    Grapi:REST 和 WebSockets API 生成器

    介绍Grapi 基本上会生成一些优化的 Java 代码,以便通过 Netty 轻松使用 JAX-RS 资源。 没有对任何 JAX-RS 提供程序的运行时依赖(实际上只是 Jersey UriTemplate 类的一小部分,稍后将被删除)并且 Grapi 不是 JAX-...

    rest包jersey-1.19.1

    rest包jersey-1.19.1,包含全部的jar包,下载留...是一个软件开发框架,Jersey不仅仅是一个JAX-RS的参考实现,Jersey提供自己的API,其API继承自JAX-RS,提供更多的特性和功能以进一步简化RESTful service和客户端的开发

    emf-rest:EMF作为RESTFul API

    EMF-REST自动创建符合JAX-RS规范的RESTful API,该API可以自动部署在您的应用程序服务器中。基于Java JAX-RS规范在服务器中生成REST服务。 与API的所有通信都是通过JSON对象完成的。 当前,这些对象然后作为XML文件...

    ApacheHttpClient客户端

    Jersey是JAX-RS的参考实现,它简化了Java?环境下的RESTfulWeb服务的开发。Android是一款流行的智能手机,本文将展示如何为Android创建一个JAX-RS客户端。您将创建一个访问JAX-RSWeb服务的ApacheHttpClient库客户端。...

    eGradeBook:RESTful eGradebook项目

    -Java中的JAX-RS API。前端使用“模型-视图-视图模型”(MVVM)模式简化动态JavaScript UI。 快速,轻巧且功能丰富JavaScript库。建于依赖管理测试和部署工具执照MIT LicenseCopyright (c) 2018 Dawid ...

    javaone2015-cloudone:JavaOne 2015演示文稿的示例项目-“其他会话”。 主要目标是详细说明云解决方案中基于REST的集成模式

    JavaOne 2015:云一 ... 我们定义了这种简化的云解决方案,以提出一个特定的想法:应用程序之间(尤其是在一个云中或在一个环境中)基于新的基于ReST的集成模式。 项目结构 我们将云命名为:CloudOne。 您

    rest-handlers:用于创建 REST HTTP 服务的库

    用于创建 REST 服务的库注意:如果您对 JAX-RS (JSR311) 感到满意,您可能不需要这个库servlet API 上的瘦库,使用正则表达式简化请求调度。 使用具有命名组支持的扩展正则表达式库(对于 JDK6)来创建干净的 URL。 ...

    sample-logging-microservice:将消息记录到 mongodb 的示例日志服务

    Spring Boot 微服务将消息记录到 Mongo DB 的示例...技术技术目的弹簧靴通过提供快速且就绪的开发环境来简化 spring 应用程序的开发、打包和部署,将完整的解决方案打包为一个带有嵌入式 tomcat 服务器的可运行 jar。

    RESTful-Java-Web-Services-Third-Edition:RESTful Java Web服务第三版,由Packt发行

    向您介绍RESTful软件架构风格和REST API设计原则利用JSR 353 API,JSR 374 API,JSR 367 API和Jackson API进行JSON处理利用JAX-RS 2.1 API构建可移植的RESTful Web API 使用Jersey和RESTEasy扩展API简化API开发通过...

    ASP EXCEL导入SQL

    它们的新的项目分别是ApacheCXF和Axis2.Java语言也制定关于REST网络服务规范:JAX-RS:JavaAPIforRESTfulWebServices(JSR311)。相信还会出现更多与REST相关的激动人心的信息。  REST与AJAX技术  尽管AJAX技术的...

    Feign:使编写Java http客户端更加容易-开源

    受先前项目Retrofit,JAXRS-2.0和WebSocket的启发,Feign旨在降低复杂性,无论ReSTfulness如何,该复杂性通常都会将Denominator统一绑定到HTTP API。 Feign通过将注释处理到一个模板化请求中来工作,在输出之前以...

    feign:Feign使编写Java HTTP客户端更加容易

    Feign使用Jersey和CXF之类的工具为ReST或SOAP服务编写Java客户端。 此外,Feign允许您在诸如Apache HC之类的http库之上编写自己的代码。 Feign通过可定制的解码器和错误处理功能,以最小的开销和代码将代码连接到...

Global site tag (gtag.js) - Google Analytics