zoukankan      html  css  js  c++  java
  • java高级架构师教程-REST API的可发现性和HATEOAS

    图灵学院  java高级架构师教程

     

    本文将重点介绍REST API的可发现性,HATEOAS以及由测试驱动的实际场景。

    为什么要使API可发现

    API的可发现性是一个没有得到足够值得关注的主题,因此很少有API能够正确使用它。如果正确完成,它也可以使API不仅具有RESTful和可用性,而且还具有优雅性。

    要了解可发现性,您需要了解作为应用程序状态引擎(HATEOAS)的超媒体约束; REST API的这种约束是关于来自超媒体(真正的超文本)的资源上的动作/转换的完全可发现性,作为应用程序状态的唯一驱动因素。

    如果API通过会话本身来驱动交互,具体来说就是通过Hypertext,则不会有文档,因为这会强制客户端做出实际上在API上下文之外的假设。

    总之,服务器应该具有足够的描述性,以指示客户端如何仅通过超文本使用API,在HTTP会话的情况下,可以是链接头。

    可发现方案(由测试驱动)

    那么REST服务可被发现意味着什么呢?在本节中,我们将测试使用JUnit测试可发现性的各个特征。由于REST服务已被安全保护,因此每个测试首先需要在使用API之前进行身份验证。

    发现有效的HTTP方法

    使用无效的HTTP方法使用REST服务时,响应应该是405 METHOD NOT ALLOWED; 此外,它还应该帮助客户端使用响应中的Allow HTTP Header来发现该特定Resource允许的有效HTTP方法:

    java高级架构师教程,java架构师培训,java高级培训,图灵学院

    发现新创建资源的URI

    创建新资源的操作应始终使用Location HTTP Header 包含响应中新创建的资源的URI 。如果客户端对该URI执行GET,则该资源应该可用:

    java高级架构师教程,java架构师培训,java高级培训,图灵学院

    测试遵循一个简单的场景:创建一个新的Foo资源,并使用HTTP响应来发现现在可以访问资源的URI。然后测试更进一步,在该URI上执行GET以检索资源并将其与原始资源进行比较,以确保它已被正确保留。

    发现获取该类型的所有资源的URI

    当我们获取任何特定的Foo资源时,我们应该能够发现我们接下来可以做什么:我们可以列出所有可用的Foo资源。因此,检索资源的操作应始终在其响应中包含URI,以获取该类型的所有资源,再次使用链接头:

    java高级架构师教程,java架构师培训,java高级培训,图灵学院

    请注意,此处显示了extractURIByRel的完整低级代码- 负责通过rel关系提取URI 。

    此测试涵盖REST中链接关系的棘手主题:检索所有资源的URI使用rel=”collection”语义。

    这种类型的链接关系尚未标准化,但已被多个微格式使用并提议用于标准化。使用非标准链接关系开启了关于RESTful Web服务中微格式和更丰富语义的讨论。

    其他潜在的可发现URI和微格式

    其他URI可能通过链接头发现,但只有现有的链接关系类型允许,而不会转移到更丰富的语义标记,如定义自定义链接关系,Atom发布协议或微格式,这将是主题另一篇文章。

    例如,客户端应该能够在对特定资源执行GET时发现URI以创建新资源; 遗憾的是,模型创建语义没有链接关系。幸运的是,标准做法是创建的URI与获取该类型的所有资源的URI相同,唯一的区别是POST HTTP方法。

    案例结论

    我们已经看到REST API是如何从根中完全发现的,并且没有先验知识 - 这意味着客户端能够通过在根上执行GET来导航它。继续前进,所有状态更改都由客户端使用REST API在表示中提供的可用和可发现的转换(因此是Representational State Transfer)来驱动。

    本文介绍了REST Web服务上下文中可发现性的一些特征,讨论了HTTP方法发现,创建和获取之间的关系,发现获取所有资源的URI等。

    尽管Java架构师学习路线已经分享给大家,但有多少人能认真的去践行,这个就难说了。互联网寒冬已经到来,作为程序员,更应在此时提高自己,有着更高远的追求。

    篇幅有限,如果需要更详细的java架构师学习路线资料可加博主qq:1993712276,或者去图灵官网查看

  • 相关阅读:
    109 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 05 问题解析--通过一个方法完成学生和专业的双向关联
    108 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 04 问题解析--数组未实例化造成的空指针异常
    107 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 03 编写方法完成学生个数统计功能
    106 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 02 新增属性完成学生信息存储
    105 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 01 新增需求及分析
    session与cookie的区别和联系
    session和cookie的区别
    Web服务器主动推送技术
    webSocket的场景应用
    TCP、Http和Socket 优劣比较
  • 原文地址:https://www.cnblogs.com/tulingxueyuan/p/13714612.html
Copyright © 2011-2022 走看看