api restful_HATEOAS的RESTful服务。 记录超媒体API

api restful

1.简介

希望本教程的前一部分不仅揭示了超媒体和HATEOAS的深远意义,而且使我们确信这些都是RESTful Web服务和API的基本构建模块。 在这一部分中,我们将继续侧重于文档方面,以解决如何预先传递Web服务或API功能的问题。

目录

1.简介 2. OpenAPI和朋友 3. OpenAPI不是答案,现在呢?
3.1。 应用程序级配置文件语义(ALPS) 3.2。 ALPS与JSON-LD,... 3.3。 JSON超模式 3.4。 微格式 3.5。 都柏林核心元数据计划(DCMI)
4。结论 5.下一步是什么

在进一步介绍之前,让我们根据REST体系结构样式从服务提供者和服务使用者的角度详细说明手头的问题。 本质上, 超媒体驱动的Web服务和API的可发现性方面允许服务提供者发布单个URL,入口点并以此完成。 另一方面,任何意识到超媒体的消费者都应该能够使用上下文链接浏览资源,并在必要时沿途完成任何所需的状态修改。 唯一的前提条件是提供者和消费者应该说相同的超媒体方言 。 这是关于提供者/消费者交互的机器角度,这是探索性客户端的示例。

现在,让我们从开发人员的角度来看这个问题。 您将如何知道特定资源的属性? 您如何知道期望使用哪种类型的链接和链接关系? 它支持的行动或能力如何? 它们可能导致什么副作用? 最后,作为开发人员,您只需要满足一个简单的要求,例如“客户C希望将其预订R再延长一周”。 这是人类对提供者/消费者交互的观点。

很多具有挑战性的问题,但是我们有答案吗? 让我们找出……

2. OpenAPI和朋友

如今,如果我们研究推荐用于记录RESTful Web服务和API的推荐方法,那么毫无疑问,您将遇到OpenAPI规范 。 该规范有多个版本,但在撰写本文时,最新版本是3.0.2

OpenAPI规范 ( OAS )定义了与RESTful API的语言无关的标准接口,使人类和计算机都可以发现和理解服务的功能,而无需访问源代码,文档或通过网络流量检查。 正确定义后,使用者可以使用最少的实现逻辑来理解远程服务并与之交互。

https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md

公平地说, OpenAPI是一个很好的规范,它是许多组织和个人出色的协作成果的结果。 它已被广泛认为是记录RESTful Web服务和API的首选方法,但它并不是唯一的方法。 其他良好的规范,例如RAML , API蓝图 , RSDL , WADL , API Builder , iodocs和tinyspec也在使用中,值得了解。

OpenAPI和朋友可以完成这项工作,但是从根本上讲,这些规范集中在资源位置, 几乎没有或没有超媒体支持。

就目前而言, 超媒体完全破坏了资源位置。 超媒体驱动的RESTful Web服务和API并非一成不变,远非如此,大多数机器或人类需要了解的内容都是在运行时共享的。

3. OpenAPI不是答案,现在呢?

您可能经常碰到超媒体将RESTful Web服务和API转换为资源周围的状态机的说法。 从概念上讲,这是有道理的,因为超媒体带来了状态和过渡的明确定义的语义。

而不是资源位置,我们应该专注于描述资源本身。 资源描述至少应包括其数据语义,受支持的可能动作(状态转换)(如果可能,取决于上下文)以及相关的可导航资源(具有关系类型的链接)。

应用程序级配置文件语义(ALPS)

应用程序级配置文件语义 ( ALPS )可能是最先进的,包含最广的规范,用于在RESTful Web服务和API的上下文中记录和共享超媒体的语义。

ALPS文档可以用作配置文件,以解释具有与应用程序无关的媒体类型(例如HTML, HAL , Collection + JSON , Siren等)的文档的应用程序语义。 这样可以提高配置文件在各种媒体类型之间的可重用性。

http://www.alps.io/spec/index.html

概要文件的作用是为人类和机器建立共享的结构化词汇表。 简而言之,概要文件允许定义数据和过渡的语义以及包含文档的能力。

使用通用媒体类型(HTML,Atom, Collection + JSON等)实现超媒体客户端/服务器应用程序时,客户端和服务器实例需要共享对特定于域的信息的理解,例如数据元素名称,链接关系值,和状态传输参数。 该信息与正在实施的应用程序(例如,会计,联系人管理等)直接相关,而不是与表示中使用的媒体类型相关。

http://www.alps.io/spec/index.html

在本教程的上半部分,我们已经看到了许多实现RESTful Web服务和API的规范,让我们尝试通过ALPS支持来扩展其中之一(例如HAL )。

$ curl https://rentals.jcg.com/
{"_links": {"self": {"href": "https://rentals.jcg.com"},"reservations": {"href": "https://rentals.jcg.com/reservations"},"customers": {"href": "https://rentals.jcg.com/customers"},"profiles": {"href": "https://rentals.jcg.com/alps"}}
}

与案例研究中的示例相比,您可能会注意到服务器还返回了一个附加的链接profiles 。 让我们看看它的背后。

$ curl https://rentals.jcg.com/alps
{                                                                "version": "1.0",                                             "doc": {                                                                                    "href": "https://rentals.jcg.com/documentation.html"        },                                                             "descriptor": [ {                                             "id": "customers",                                           "href": "https://rentals.jcg.com/alps/customers"               }, {                                                           "id": "reservations",                                        "href": "https://rentals.jcg.com/alps/reservations"            } ]                                                            
}

到目前为止,我们已经发布了两个配置文件描述符, customersreservations 。 让我们更深入地了解reservations配置文件描述符。

$ curl https://rentals.jcg.com/alps/reservations
{                                            "version": "1.0",                         "descriptor": [ {                         "id": "reservation",                    "type": "SEMANTIC",                     "descriptor": [ {                       "id": "from",                         "type": "SEMANTIC"                    "href": "https://schema.org/Date"}, {                                     "id": "id",                           "type": "SEMANTIC"                    "href": "https://schema.org/Thing#identifier"}, {                                     "id": "to",                           "type": "SEMANTIC","href": "https://schema.org/Date"}, {                                     "id": "vehicle",                      "type": "SEMANTIC","href": "https://schema.org/Vehicle#name"} ]                                      }, {                                       "id": "create",                           "name": "reservations",                 "type": "UNSAFE",                         "rt": "#reservation"                    }, {                                       "id": "list",                           "name": "reservations",                 "type": "SAFE",                         "rt": "#reservation"                    }, {                                       "id": "customer",                       "name": "customer",                     "type": "SAFE",                         "href": "https://rentals.jcg.com/alps/customers""rt": "#customer"                       }, {                                       "id": "update",                         "name": "reservation",                  "type": "IDEMPOTENT",                   "rt": "#reservation"                    }, {                                       "id": "delete",                         "name": "reservation",                  "type": "IDEMPOTENT",                   "rt": "#reservation"                    } ]                                        
}

值得花一些时间并简要介绍一下此个人资料。 它概述的第一件事是reservation描述符,用于描述数据语义(属性及其类型)。 之后,将引入动作和过渡的描述符数量( createlistdeleteupdatecustomer )。

附带说明一下,尽管在我们的示例中,概要文件是由应用程序制作的,但是ALPS还具有注册表概念( ALPS概要文件注册表),以允许概要文件定义被重用和引用。 已经从schema.org定义中预先构建了大量ALPS配置文件,并且可以从http://alps.io/schema.org获得 。

回到主题,让我们看一下使用HAL样式作为参考的ALPS配置文件如何渗透到资源表示中。

{                                                                                            "id": "13e1892765c5",                                                                     "vehicle": "Honda Civic 2020",                                                            "from": "2020-01-01",                                                                     "to": "2020-01-05",                                                                       "_links": {                                                                               "profile": {                                                                               "href": "https://rentals.jcg.com/alps/reservations#reservation"                                      },                                                                                       "customer": {                                                                           "href": "https://rentals.jcg.com/customers/fed195a03e9d","profile": "https://rentals.jcg.com/alps/customers#customer"},                                                                                       "self": {                                                                               "href": "https://rentals.jcg.com/reservations/13e1892765c5"                             }                                                                                        },                                                                                         "_templates": {                                                                           …}                                                                                          
}

HAL文档已得到充实,包括指向各自资源配置文件的profile 链接关系 。 或者,有时可以看到Links头对于发回资源配置文件信息很有用。

Links: profile="https://rentals.jcg.com/alps/reservations#reservation"

总体而言, ALPS规范是描述RESTful Web服务和API的资源语义和转换的一种非常简单且人性化的方式。

ALPS与JSON-LD,...

一些超媒体规范对数据语义(词汇)具有一流的支持。 一个很好的例子是带有@vocab上下文定义的JSON-LD 。

{                                                               "@context": {                                                "@vocab": "http://schema.org/"                             },                                                            "@type": "Reservation",                                      "id": "13e1892765c5",                             "vehicle": "Honda Civic 2020",                               "from": "2020-01-01",                      "to": "2020-01-05",                        "customer": {                                                "@id": "https://rentals.jcg.com/customers/fed195a03e9d"      },                                                            "@id": "https://rentals.jcg.com/reservations/13e1892765c5"     
}

当依赖超媒体规范时,资源语义详细信息将作为资源表示的一部分。 无论如何,这是有价值的信息。 相反, ALPS概要文件与资源表示形式和媒体类型分开存在,并且可以独立查询和解释。

JSON超模式

JSON模式是一种基于JSON的格式,用于描述JSON数据的结构。 JSON Hyper-Schema规范具有指定超链接和与超媒体相关的关键字的功能,从而丰富了JSON Schema词汇表。

JSON Hyper-Schema是一个JSON Schema词汇表,用于使用超链接注释JSON文档以及通过HTTP等超媒体环境处理和操纵远程JSON资源的说明。

https://tools.ietf.org/html/draft-handrews-json-schema-hyperschema-02

与ALPS相比, JSON Hyper-Schema提供了更为丰富的语义,用于描述数据,链接(关系)和操作(负担)。 以下示例只是为reservation资源构建JSON Hyper-Schema的一种可能性。

{"title": "Reservation","type": "object","properties": {"id": {"title": "Unique Reservation identifier","type": "string"},"vehicle": {"title": "Name of the vehicle","type": "string"},"from": {"title": "Start date","type": "date"},"to": {"title": "End date","type": "date"}},"required" : ["from", "to", "vehicle"],"links": [{"rel": "self","href": "{id}"},{"title": "Customer","rel": "customer","href": "/reservation/{id}/customer"},{"title": "Cancel Reservation","rel": "delete","href": "{id}","method": "DELETE"},{"title": "Update Reservation","rel": "update","href": "{id}","method": "PUT","schema": {"type": "object","properties": {"vehicle": {"title": "Name of the vehicle","type": "string"},  "from": {"title": "Start date","type": "date"},"to": {"title": "End date","type": "date"}  },"required": ["vehicle", "to", "from"]}}]
}

突出的第一件事可能是每个链接和操作所具有的详细程度。 您可能会注意到的直接缺点之一是语义(例如, delete动作)与具体的指针(例如href模板)交织在一起。

微格式

除了ALPS和JSON Hyper-Schema外 ,还有一些鲜为人知的规范,值得一提。 微格式就是其中之一。

微格式是为人为先设计的,其次是为机器设计的, 微格式是一组基于现有标准和广泛采用的标准的简单,开放的数据格式。 微格式并没有丢掉当今有用的东西,而是首先通过适应当前的行为和使用模式来解决更简单的问题。

http://microformats.org/wiki/about

微格式的最新版本称为microformats2 。

Microformats2替代并替代了两种经典的微格式 (有时称为microformats1),并且结合了从微数据和RDFa中获得的经验教训。

http://microformats.org/wiki/microformats2

微格式的主要目标是HTML媒体类型( 语义HTML ),因此它不一定最适合大多数RESTful Web服务和API。

都柏林核心元数据计划(DCMI)

最初的都柏林核心规范发布于1995年,是一组15个(最初为13个)核心元素,用于描述资源语义。 因此, 都柏林核心元数据计划 ( DCMI )是一个旨在支持跨各种目的和业务模型的元数据设计和最佳实践创新的组织。 它定义了更丰富的规范DCMI元数据术语 。

总的来说, Dublin Core是致力于应用程序配置文件和链接数据 (尤其是基于RDF词汇表)的开拓性工作之一。 这些年来,它所管理的规范数量已大大增加,不仅限于元数据。

与微格式一样 ,对于RESTful Web服务和API来说, 都柏林核心和相关规范的广泛范围可能不是您的首选。

4。结论

在本教程的这一部分中,我们讨论了用丰富的超媒体支持来记录RESTful Web服务和API的挑战。 公平地说,这是一个已解决的问题的说法远非事实。 如今 , OpenAPI规范已成为事实上的选择,但尚未将超媒体视为一流的公民。 最杰出的替代方案,尤其是应用程序级配置文件语义(ALPS)和JSON Hyper-Schema ,无疑正在朝着正确的方向前进,但是这两种方案仍在进行中。

5.下一步是什么

在本教程的下一部分中,我们将通过在JVM平台(使用Java)上设计和实现成熟的RESTful Web服务API,从理论转向实践。

翻译自: https://www.javacodegeeks.com/restful-services-with-hateoas-documenting-hypermedia-apis.html

api restful

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模版方法模式

转载自 23种设计模式(6):模版方法模式定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。 类型:行为类模式 类图&#…

java并发编程实践(1)intro

【0】README0.1)本文部分文字描述转自“java并发编程实践”,旨在学习“java并发编程实践(1)intro”的相关知识;【3】线程带来的风险【3.1】安全性问题1)intro:在没有充足同步的case下,多个线程的操作执行顺…

读入的字节都写入字节数组中_使用Java将文件读入字节数组的7个示例

读入的字节都写入字节数组中嗨,大家好,Java程序员经常在现实世界中遇到编程问题,他们需要将文件中的数据加载到字节数组中,该文件可以是文本文件或二进制文件。 一个示例是将文件的内容转换为String以显示。 不幸的是,…

迭代子模式

转载自 《JAVA与模式》之迭代子模式 在阎宏博士的《JAVA与模式》一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部…

java并发编程实践(2)线程安全性

【0】README 0.0)本文部分文字描述转自:“java并发编程实战”, 旨在学习“java并发编程实践(2)线程安全性” 的相关知识;0.1)几个术语(terms)t1)对象的状态:是指存储在状…

自动配置jdk_JDK 15中自动自动发送更好的NullPointerException消息

自动配置jdk我讨论了期待已久的和高度赞赏改进的NullPointerException ( NPE在帖)消息“ 更好的默认NullPointerException异常消息即将到Java? ”和“ JDK 14中更好的NPE消息 ”。 当此JEP 358驱动的功能添加到JDK 14中时 ,想要从…

tomat(16)关闭钩子

【0】REAMDE0)本文部分文字描述转自:“how tomcat works”,旨在学习“tomat(16)关闭钩子”的相关知识;1)problemsolution:1.1)problem:在很多实际环境中,当用户关闭应用程…

apache.camel_Apache Camel 3.1 – XML路由的快速加载

apache.camelCamel 3.1中添加的一项功能是能够更快地加载XML路由。 这是我们为使Camel变得更小,更快而进行的总体工作的一部分。 您可能会说ewww XML。 但坦率地说,有很多Camel用户使用XML定义路由来构建应用程序。 在Camel 2.x中,您将不得不…

程序中 设置jvm 参数_高效应用程序的7个JVM参数

程序中 设置jvm 参数在撰写本文时(2020年3月),围绕垃圾收集和内存,您可以将600多个参数传递给JVM。 如果您包括其他方面,则JVM参数总数将很容易超过1000个。 😊。 任何人都无法消化和理解太多的论据。 在本…

tomcat(17)启动tomcat

【0】README 1)本文部分文字描述转自“how tomcat works”,旨在学习“tomcat(17)启动tomcat”的相关知识;2)本文重点关注启动Tomcat时会用到的两个类,分别是Catalina类和 Bootstrap类;(干货——…

八爪鱼 是java做的吗_章鱼扫描仪:Java构建工具和恶意软件

八爪鱼 是java做的吗Alvaro Munoz最近在GitHub Security Lab网站上发布了“ Octopus扫描程序恶意软件:攻击开源供应链 ”。 我发现这篇文章很有趣,原因有很多,其中包括对Octopus Scanner恶意软件的工作原理和发现方式的详细介绍, …

spring(1)Spring之旅

【0】README0.1)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在reviewSpring(1)Spring之旅 的相关知识;【1】简化java 开发1)为了降低java开发的复杂性,Spring采取了以…

apache.camel_Apache Camel K 1.0在这里–您为什么要关心

apache.camel昨天我们发布了Apache Camel K 1.0,并在社交媒体和Camel网站上宣布了该版本。 那么,骆驼K是什么,为什么你要在乎呢? 这是一个很好的问题,我想通过提及伟大的思想来帮助回答这个问题。 Hugo Guerrero发表…

DRF之初识

目录 一、序列化和反序列化 【1】序列化 【2】反序列化 【3】小结 二、DRF的安装和快速使用 (1) 安装DRF: (2) 配置DRF: (3) 创建序列化器(Serializer): (4) 创建视图(View): (5) 配置URL路由: 【补充】下载…

spring(2)装配Bean

【0】README0)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review spring(2)装配Bean 的相关知识;1)在spring中,对象无需自己查找或创建与其所关联的其他对象。相反…

restful和rest_HATEOAS的RESTful服务:JVM上的REST API和超媒体

restful和rest1.简介 到目前为止,我们已经花了很多时间谈论了相当数量的关于角色的的超媒体和HATEOAS在REST风格的 Web服务和API,扫视不同规格和可用性方面。 听起来好像支持超媒体和HATEOAS并不难,只需选择您的收藏夹就可以了! …

Spring中配置数据源的4种形式

【0】README 0.1)以下内容转自:http://blog.csdn.net/orclight/article/details/8616103 不管采用何种持久化技术,都需要定义数据源。Spring中提供了4种不同形式的数据源配置方式: spring自带的数据源(DriverManagerDataSource)&…

MavenSelenium测试自动化教程

在进行自动化测试项目时,您需要与之关联的所有Selenium依赖项。 通常,这些依赖项是在项目生命周期中手动下载和升级的,但是随着项目规模的扩大,管理依赖项可能会非常困难。 这就是为什么需要构建自动化工具(例如Maven&…

命令行执行Junit测试

【0】README 0.1)本文旨在给出如何在命令行中执行 Junit测试的steps: 【1】在命令行中执行Junit测试 1)problemsolution: 1.1)problem: 1.2)solution:导出 JUnitCore 类并且使用 …

托管 非托管_如何在托管Kubernetes上还原Neo4J备份

托管 非托管在下面的视频中,我将解释如何将Neo4J实例的备份还原到在托管Kubernetes环境中运行的新实例。 备份内容将从先前写入备份的持久卷中获取。 在上一篇文章中,您可以首先了解如何进行备份。 自己尝试 同样,您将在以下GitHub存储库中…