REST资源版本控制的最佳做法是将版本信息放入HTTP请求的Accept / Content-Type标头,使URI完好无损.

以下是用于检索系统信息的REST API的示例请求/响应:

==>
GET /api/system-info HTTP/1.1
Accept: application/vnd.COMPANY.systeminfo-v1+json

<==
HTTP/1.1 200 OK
Content-Type: application/vnd.COMPANY.systeminfo-v1+json
{
  “session-count”: 19
}

注意在MIME类型中指定的版本.

这是第2版的另一个请求/响应:

==>
GET /api/system-info HTTP/1.1
Accept: application/vnd.COMPANY.systeminfo-v2+json

<==
HTTP/1.1 200 OK
Content-Type: application/vnd.COMPANY.systeminfo-v2+json
{
  “uptime”: 234564300,“session-count”: 19
}

有关更多的说明和示例,请参见http://barelyenough.org/blog/tag/rest-versioning/.

在基于Java的JAX-RS实现(如泽西或Apache CXF)中,是否可以轻松实现此方法?

目标是让几个@Resource类具有相同的@Path值,但是根据MIME类型中指定的实际版本来提供请求?

我一直在研究JAX-RS,特别是泽西,并没有发现任何支持.泽西岛没有机会用相同的路径注册两个资源. WebApplicationImpl类的替换需要实现来支持.

你能建议一下吗?

注意:同一资源的多个版本需要同时可用才需要.新版本可能会引入不兼容的更改.

解决方法

JAX-RS通过Accept标头发送到使用@Produces注释的方法.所以,如果你希望JAX-RS做你的调度,你需要利用这个机制.没有任何额外的工作,您将不得不为您希望支持的每种媒体类型创建一个方法(和提供程序).

没有什么可以阻止你使用基于媒体类型的几种方法,所有这些方法都称之为普通方法来完成这项工作,但是每次添加新媒体类型时,都必须更新该方法并添加代码.

一个想法是添加一个过滤器,“筛选”您的Accept标题专门用于发送.也就是说,你可以:

Accept: application/vnd.COMPANY.systeminfo-v1+json

并将其转换为,简单地:

Accept: application/vnd.COMPANY.systeminfo+json

同时,您提取版本信息供以后使用(也许在请求或其他特设机制中).

然后,JAX-RS将调度到处理“application / vnd.COMPANY.systeminfo json”的单一方法.

然后,该方法采用“带外”版本信息来处理处理中的细节(例如通过Osgi选择适当的类加载).

接下来,然后使用适当的MessageBodyWriter创建一个Provider. JAX-RS将为应用程序/ vnd.COMPANY.systeminfo json媒体类型选择提供程序.您的MBW将确定实际的媒体类型(再次基于该版本信息),并创建正确的输出格式(再次,也许分派到正确的Osgi加载类).

我不知道MBW是否可以覆盖Content-Type头.如果没有,那么您可以委派较早的过滤器在出路上为您重写该部分.

这有点复杂,但是如果要利用JAX-RS调度,而不是为每种版本的媒体类型创建方法,那么这是一个可行的途径.

编辑响应评论:

是的,本质上,您希望JAX-RS基于Path和Accept类型发送到正确的类. JAX-RS不太可能开箱即用,因为这是一个很好的例子.我没有看过任何JAX-RS实现,但是您可以通过调整基础架构级别之一来完成所需的任务.

可能另一个较少侵入性的选项是使用Apache世界中的一个古老的技巧,只需创建一个基于Accept标头重写路径的过滤器.

所以当系统得到:

GET /resource
Accept: application/vnd.COMPANY.systeminfo-v1+json

您将其重写为:

GET /resource-v1
Accept: application/vnd.COMPANY.systeminfo-v1+json

然后,在您的JAX-RS类中:

@Path("resource-v1")
@Produces("application/vnd.COMPANY.systeminfo-v1+json")
public class ResourceV1 {
    ...
}

所以,您的客户端获得正确的视图,但您的类由JAX-RS正确调度.唯一的其他问题是,如果你的类看,你的类将会看到修改的路径,而不是原始的路径(但如果你喜欢,你的过滤器可以在请求中作为引用填充).

这不是理想的,但它(主要是)是免费的.

This是一个现有的过滤器,可以做你想要做的,如果不是,它可能可以作为一个灵感,你自己做.

java – 基于JAX-RS的实现中的简单REST资源版本控制?的更多相关文章

  1. 保护MY REST API仅用于MY IOS APP

    我在Laravel中设计一个RESTAPI,用于我的ios应用程序.目前我被困在以下几点:如何保护我的RESTAPI只允许访问我的ios应用程序?听起来我需要通过向我的IOSAPP授予一个私钥来将类似于HMAC方法的内容合并到我的IOSAPP代码中.当从iosapp中运行请求时,我传递带有私钥和其他数据的哈希,然后当在服务器上收到请求时,我通过重新计算哈希来检测请求是否来自应用程序内的用户.我不知道这是否安全&我会认为不是吗?

  2. REST API iOS开发

    我将RestKitAPI设置到我的应用程序有很多麻烦.我想知道有没有其他好的API来制作RESTful应用程序?

  3. 泛型 – Swift相当于MIN和MAX宏

    在C/Objective-C中,可以使用MIN和MAX宏找到两个数字之间的最小值和最大值。Swift不支持宏,似乎在语言/基础库中没有等价物。应该有一个定制的解决方案,也许基于类似这样的one?min和max已经在Swift中定义:看到这个伟大的写在documented&undocumentedbuilt-infunctionsinSwift。

  4. 在Swift中调用REST API

    我试图使用Swift对RESTAPI进行GET调用,并试图遵循许多教程,但不能弄清楚。或者是因为我不知道如何将所有的Obj-C翻译成Swift,或者因为一半的方法n’都被弃用。有谁知道如何进行调用,并解析返回的JSON数据?

  5. android – 如何仅限授权客户端访问我的REST API?

    题我设计的RESTAPI将用于iOS和Android应用程序,以及将来可能用于Web和其他移动客户端.如何将我的整个API仅限制为我想要访问的客户端?我想阻止第三方访问我的API以注册用户,甚至无需通过授权应用程序登录.目前的想法我可以为每个客户端提供我想要授权的密钥,但是如何防止从我的应用程序的源代码中提取此密钥?

  6. 在Android上同步SQL数据库与REST远程服务器的最佳实践

    编辑:例如,采用方法2,重写的ContentProvider#bulkInsert使用数据库事务可以大大加快批量插入操作:见thisquestion.解决方法最佳选择需要适当的API实现–何时应存储一些db_version.并且在更新服务器期间响应数据和操作类型–添加,更新,删除.

  7. 如何在Android上托管REST webservices?

    有没有人知道一个用Java编写的能够在Android上托管REST服务的开源Web服务器?

  8. android – Twitter OAuth Rest Api状态参数’@’符号

    我正在使用twitterrestapi,这是(https://api.twitter.com/1.1/).首先,我使用路标库生成oauth_signature.它运作良好.上传状态端点(https://api.twitter.com/1.1/statuses/upload.json)运行良好,但如果状态参数包含“@”符号,则表示无效.所以这是我的代码TwitterStatusesService.j

  9. android rest客户端不支持的媒体类型

    我尝试从android模拟器发送请求到一个安静的服务器.但我总是得到错误:415UnsupportedMediaType.客户代码:服务器的代码:解决方法问题是服务器不知道客户端请求的媒体类型.在客户端代码中尝试这样的事情:request.setHeader(“Content-Type”,“application/json”);

  10. android – 解析REST API不返回客户端密钥

    我正在尝试动态创建Parse应用程序并在构建我的Android应用程序时使用这些键.TheAPI工作得很好,除了一点,它不会返回客户端密钥.我需要AndroidAPI中提到的客户端密钥:我试图徒劳地翻转旗帜.我应该怎么做才能访问客户端密钥?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部