`
zzc1684
  • 浏览: 1222905 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

JAX-RS入门 十: 兼容与演进

阅读更多

网络服务会随着时间的发展再不断进化,例如:添加新的特性;扩展数据集;数据格式的改变和演化。你怎么来管理这些变化呢?怎么让以前的用户能够在旧版本上运行呢?

 

将应用模块会可以解决这些问题中的大多数。下面就讨论一些在开发应用时需要有的设计和决策,以适应这些可能的变化。

 

一、创建新的Media Type

 

REST的一个重要准则是将你的资源的复杂性隐藏在你的变换数据后面。然后URI可以是不变的,但是数据格式会不变演进。需要记住的、非常重要的一点就是当你做计划时,考虑好你的应用怎么去应对版本管理。

 

因为复杂性限制在数据格式中,客户端可以使用Media type去请求不同的格式版本。一个常用的,致力于解决这个问题的方法就是使用你的应用去定义一个新的Media Type。 一个指导准则就是使用vnd前缀,一个新格式的名字,和一个具体的,以+号分隔的Media Type后缀。假设我们说Red Hat公司有一个管理用户的特定的xml格式,则Media Type名可能如下:

 

Java代码 复制代码 收藏代码
  1. application/vnd.rht.customers+xml  

vnd表示供应商,rht表示Red Hat,customers代表我们的用户数据格式。以+xml结尾,让用户知道这个数据格式是基于xml的。同样的对Json:

 

Java代码 复制代码 收藏代码
  1. application/vnd.rht.customers+json   

有了一个新的Media Type,下面就是追加版本信息,这样老的用户还可以使用老版本的数据:

 

Java代码 复制代码 收藏代码
  1. application/vnd.rht.customers+xml;version=1.0   

保持子类型名不变,通过指定一个属性来指定版本号。这样随着时候的推移,只需要提升版本号以表示数据的格式变化。

 

二、灵活的Schema

 

通过在Media Type中使用版本属性,我们就可以很好的管理和缓解服务或应用的变化。 不过,虽然在Media Type版本信息是相当有用的,但是它不应该是你管理变化的第一选择。 当定义和初始化一个新的数据格式时,尤其要注释向前兼容性。

 

例如对于XML Schema,最初的Schema应允许每个Schema类型能够扩展或自定义新的元素或属性。例如:

Java代码 复制代码 收藏代码
  1. <schema targetNamespace="http://www.example.org/customer"  
  2. xmlns="http://www.w3.org/2001/XMLSchema">   
  3.     <element name="customer" type="customerType"/>   
  4.     <complexType name="customerType">   
  5.         <attribute name="id" use="required" type="string"/>   
  6.         <anyAttribute/>   
  7.         <element name="first" type="string" minOccurs="1"/>   
  8.         <element name="last" type="string" minOccurs="1"/>   
  9.         <any/>   
  10.     </complexType>   
  11. </schema>   

上例中,Schema允许添加任意的属性和任意的元素。如果新版本的数据类型保留了最初的数据结构,则老版本的客户端仍然可以验证和处理他们接收到的新的数据格式。

 

例如以下为新的Schema,定义了新的属性和元素,但是必须注意:这些新元素或属性需要设置为Optional的

Java代码 复制代码 收藏代码
  1. <schema targetNamespace="http://www.example.org/customer"  
  2. xmlns="http://www.w3.org/2001/XMLSchema">   
  3.     <element name="customer" type="customerType"/>   
  4.     <complexType name="customerType">   
  5.         <attribute name="id" use="required" type="string"/>   
  6.         <anyAttribute/>   
  7.         <element name="first" type="string" minOccurs="1"/>   
  8.         <element name="last" type="string" minOccurs="1"/>   
  9.         <STRONG><element name="street" type="string" minOccurs="0"/>   
  10.         <element name="city" type="string" minOccurs="0"/>   
  11.         <element name="state" type="string" minOccurs="0"/>   
  12.         <element name="zip" type="string" minOccurs="0"/></STRONG>   
  13.         <any/>   
  14.     </complexType>   
  15. </schema>   

这里我们新增加了一些元素,并使得他们是可选的。因此旧版本依然可以PUT和POST旧的、仍然有效的数据格式。

 

如果你结合了可扩展的、向前兼容的Schema以及Media Type版本,那你就真正拥有了一个数据格式可升级的系统。版本依赖的客户可以使用Media Type版本去请求指定的版本数据;未依赖于版本的客户可以请求和发送他们理解的版本。 

分享到:
评论

相关推荐

    jax-rs jax-ws所需包,亲测可用

    **JAX-RS与JAX-WS详解:** 1. **JAX-RS**(Java API for RESTful Web Services)是Java平台上的REST(Representational State Transfer)风格Web服务的标准。REST是一种轻量级的架构风格,它基于HTTP协议,利用URL...

    JAX-RS入门jar包集合

    3. **注入与依赖管理**:JAX-RS与CDI(Contexts and Dependency Injection)集成,允许通过`@Context`注解注入上下文对象,如`HttpServletRequest`、`HttpServletResponse`等,同时可以注入其他依赖服务。...

    [Jax-RS] RESTful Java 开发 (Jax-RS 实现) (英文版)

    [奥莱理] RESTful Java 开发 (Jax-RS 实现) (英文版) [奥莱理] RESTful Java with Jax-RS (E-Book) ☆ 图书概要:☆ Learn how to design and develop distributed web services in Java using RESTful ...

    [Jax-RS] RESTful Java 开发 (Jax-RS 2.0 实现) (英文版)

    The RESTEasy workbook that follows provides step-by-step instructions for installing, configuring, and running several working JAX-RS examples, using the JBoss RESTEasy implementation of JAX-RS 2.0. ...

    JAX-WS API, JAX-RS API

    综上所述,JAX-WS和JAX-RS都是Java平台中处理Web服务的重要工具,但它们的侧重点不同。JAX-WS专注于SOAP协议的Web服务,而JAX-RS则面向RESTful风格的API设计。了解并熟练掌握这两个API,对于Java开发者来说,意味着...

    一个包含jax-ws和jax-rs的例子(含服务端和客户端)

    标题中的“一个包含jax-ws和jax-rs的例子(含服务端和客户端)”是指这是一个示例项目,它演示了如何使用Java API for XML Web Services (JAX-WS)和Java API for RESTful Web Services (JAX-RS)来创建和消费Web服务。...

    Jax-RS所需要的依赖jar

    9. **版本兼容性**:需要注意的是,不同的JAX-RS实现和其依赖库可能存在版本兼容性问题,因此选择正确的版本组合至关重要,以避免潜在的冲突和错误。 10. **持续集成与部署**:在现代软件开发流程中,持续集成和...

    jackson-jaxrs-json-provider-2.7.8-API文档-中文版.zip

    赠送jar包:jackson-jaxrs-json-provider-2.7.8.jar; 赠送原API文档:jackson-jaxrs-json-provider-2.7.8-javadoc.jar; 赠送源代码:jackson-jaxrs-json-provider-2.7.8-sources.jar; 赠送Maven依赖信息文件:...

    JAX-RS Extension

    8. **工具使用**:另一标签“工具”可能意味着博客讨论了与JAX-RS或RESTlet相关的工具,如IDE插件、调试工具、性能测试工具等,这些工具能帮助开发者更高效地开发和维护REST服务。 总的来说,这篇博客文章可能涵盖...

    SpringMVC精品资源--JAX-RS &amp; SpringMVC supported maven buil.zip

    SpringMVC和JAX-RS是两种在Java世界中广泛使用的Web开发框架,它们都用于构建RESTful服务,但有着不同的设计哲学和技术实现。这个压缩包"SpringMVC精品资源--JAX-RS & SpringMVC supported maven build.zip"显然是一...

    JAX-RS-demo:学术项目的 JAX-RS 演示

    要运行这个演示项目,首先需要一个兼容 JAX-RS 的服务器环境,如 Tomcat 或 Jetty,并安装相应的 JAX-RS 实现。然后,导入项目到 IDE(如 Eclipse 或 IntelliJ IDEA),构建并部署到服务器,最后通过浏览器或客户端 ...

    jax-rs开发实例(bookkeeping)

    **JAX-RS 开发实例:Bookkeeping** JAX-RS,全称为Java API for RESTful Web Services,是Java平台上的一个标准,用于构建RESTful Web服务。它为开发人员提供了一种简单、直观的方式来创建Web服务,这些服务可以...

    Spring MVC与JAX-RS比较与分析

    如果你使用Spring进行开发,那可能想知道(或者有人曾问过你)Spring MVC与JAX-RS有何异同点?更进一步,如果你手头有一个Spring MVC应用,使用了控制类继承(SimpleFormController等),你可能还意识不到现在的...

    JAX-RS包(内含1.0和1.4)

    JAX-RS,全称Java API for RESTful Web Services,是Java平台上的一个标准,用于构建RESTful风格的Web服务。REST(Representational State Transfer)是一种轻量级、基于HTTP协议的设计模式,常用于实现分布式系统中...

    JAX-RS+spring

    **JAX-RS与Spring结合使用** 1. **集成方式**: 通常通过Spring的Servlet容器如Tomcat或Jetty来部署JAX-RS应用,Spring负责应用的上下文管理和依赖注入,JAX-RS处理REST接口。 2. **Spring REST**: 使用Spring MVC...

    java_webservice_JAX-RS.zip_cxf_jax_jax-rs_spring cxf

    JAX-RS与RESTful服务** JAX-RS是Java标准,用于创建基于HTTP协议的RESTful Web服务。REST(Representational State Transfer)是一种轻量级、无状态、基于资源的架构风格。JAX-RS通过注解简化了服务的开发,例如`@...

    jax-rs 2.1规范最终版-英文

    JAX-RS 2.1规范详细地介绍了应用程序的配置、资源类的生命周期与环境、资源方法的参数和返回类型,以及异常处理。同时,规范还描述了URI模板的使用、资源子资源的声明、媒体类型能力的声明、注解继承、请求与资源...

    jackson-jaxrs-providers:包含用于JSON,XML,YAML,Smile,CBOR格式的基于Jackson的JAX-RS提供程序的多模块项目

    概述这是一个多模块项目,包含用于以下数据格式的基于Jackson的JAX-RS提供程序:(二进制JSON) (另一种二进制JSON) 提供程序实现特定数据格式的JAX-RS MessageBodyReader和MessageBodyWriter处理程序。...

    jax-rs-test:JAX-RS测试

    **JAX-RS测试**是Java开发者在构建RESTful Web服务时进行功能验证和性能评估的重要环节。JAX-RS,即Java API for RESTful Web Services,是Java平台上的一个标准,它为创建RESTful服务提供了简洁的编程模型。本文将...

Global site tag (gtag.js) - Google Analytics