REST API版本控制 - java

我目前在基于Java的Web应用程序上工作。最近,我们使用Spring创建了一些REST端点。这样做的原因是因为我们开发了一种混合移动应用程序,该应用程序通过这些端点与我们的主应用程序集成。

问题是,今后我们还不确定如何处理更新。如果我们更新API,例如我们更改端点方法的方法签名,或者更改作为JSON返回的DTO上的属性,那么如果我们的移动用户运行的是过时版本的移动应用程序,则会遇到问题。

我们想要实现的是如果过时的应用程序将迫使我们的用户更新应用程序。我已经看到很多移动应用程序可以做到这一点。因此,我们考虑为REST API创建一个API版本,然后让移动应用检查其使用的版本是否与服务器运行的版本相同,如果不相同,则强制用户进行更新。

我们遇到的问题是:

  • 我们随时都只能运行一个版本的服务器。那么我们如何安排发布时间呢?如果我们发布了API和移动应用的新版本,但是应用商店尚未公开发布最新版本,将会发生什么情况。然后,用户将被迫进行更新,但是更新的应用程序尚不可用。
  • 我们如何维护API版本号?在移动应用程序上,我们可以对其进行配置。但是在服务器上,必须维护版本号不是很好。我说这的原因是,如果我们更改方法签名或DTO等,而忘记在发布之前手动更新此版本号,该怎么办?当然,有一种更自动的方法可以根据API的当前定义生成一些唯一的“API密钥”吗?然后,我们可以使用它代替API版本号。
  • 参考方案

    您可以做几件事。

    从一开始就开始

  • Architect API版本控制。我已经通过REST API看到了两种常见的方法:在所有REST资源端点之前放置/v1/v2等URL前缀,或者使用HTTP Accepts标头协商版本。有些宗教战争是对的。这是您的API。做你认为正确的事。
  • 从源代码中的API端点代码中提取业务逻辑。这样,您可以拥有一个v1和v2端点,它们可以在较低级别的服务层上重复使用通用代码。从一开始就不需要这样做。您可以等到API的v2开始进行分类。
  • 根据现有的API版本(以及您要构建的任何新版本,对每个构建进行自动化测试,但是回归测试是我要做的关键)。
  • 强制更新应用程序或至少跟踪应用程序版本的使用情况,可以使您删除/清除所有支持旧版本的代码。
  • 我正在从事类似的项目,为新的移动应用程序创建新的REST API。我正在按版本划分URL空间,所以是https://api.blahblahblah/v1.0/resource。

    目前,我将业务逻辑直接内置在接受HTTP请求的代码中,因为此类逻辑没有其他用途。但是,当我需要制作一个新版本时,我将重构v1 API代码以将非v1特定的任何内容分离到一个更可重用的模块中,然后再使用该模块。

    根据版本的结构差异,可能需要一些冗余以使API分开。例如,也许您需要一个通用的UserEntity对象来表示有关数据库中用户的信息,但是对于带有适配器或某些其他设计模式的单独版本,则需要一个UserV1Resource和UserV2Resource对象,以调解序列化为JSON或JSON的不同类型。 XML。

    通过进行自动化的API测试,我可以根据需要自由地进行任何重构,可以随时进行分离,并且知道一旦打破任何向后兼容性,我的测试就会大吼大叫。

    暂时仅由我们的移动应用程序使用该API的一个好处是,我们只需要担心与受支持的应用程序版本的兼容性。如果我们可以确保最终用户定期更新其应用,则可以删除较旧的版本,从而最大程度地减少了技术负担。

    使用哪个Spring和Hibernate版本 - java

    Improve this question 我是Spring和Hibernate的新手。我必须开发一些REST API。因此,我需要帮助选择Spring和Hibernate的正确版本。一些初学者建议使用spring 3.0和Hibernat2 2.0。是正确的选择还是我必须使用spring 3.0和spring 3.0? 参考方案 一点都不。这两个版本已完全…

    如何通过Java集成测试修改网络连接? - java

    我编写了一个Java类(MyRestClient),该类需要访问第三方RESTful API,并使用从其服务器返回的HTTP响应进行一些处理。我现在正在尝试在JUnit和第三方API之间编写一系列成功的集成测试(使用MyRestClient作为基础的testng库),以确保此类在各种情况下的行为正确:一切都很完美(RESTful API调用正确,服务器返回了…

    将REST和Play框架集成到正在开发的LAMP系统中 - java

    我正在开发一个大型系统,该系统正在标准LAMP堆栈上进行开发。长话短说,犯了太多错误,我们目前的发展方向变得不可持续。我们总结的问题:使用自定义且非常基本的PHP MVC框架,该框架不强制执行任何结构。没有使用ORM,允许开发人员提出他们自己的系统。前端由Smarty渲染,除此之外,所有动态交互均使用jQuery完成。我们在PHP失败/非常缓慢的系统部分进行…

    RESTAsured获得两个可能的状态代码之一 - java

    我有RESTAssured的test(!)代码,该代码检查REST端点是否将0作为状态代码返回给我; given() .contentType(CONTENT_TYPE_APPLICATION_JSON) .when() .get(getRestOperationPath()) .then() .statusCode(STATUS_CODE_OK); 但是现…

    REST URI设计:可选和多值信息传递 - java

    我有一个搜索小部件,人们可以通过邮政编码搜索汽车经销商。还有一些可选的复选框可以优化该小部件中的搜索。这是用于按邮政编码搜索经销商的URI。http://localhost:8080/dealer/zip/10080 如果用户选择复选框,则URI为http://localhost:8080/dealer/zip/10080servicetype=type1&…