HATEOAS的RESTful服务。 记录超媒体API

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

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

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

相关文章

典型微型计算机控制系统的实例,微型计算机控制系统概述.ppt

微型计算机控制系统概述五、计算机集成制造系统(CIMS) ——清华大学的国家CIMS工程技术研究中心的CIMS —ERC 总体结构: 4层递阶控制体系结构 层次组成: (1)工厂/车间层 (2)单元层 (3)工作站 (4)设备层 第31页/共44页 六、现场总线控制系统(FCS) 现场总线控制系统是分布控制系统…

计算机科学与技术及应用,计算机科学与技术的应用及发展趋向

随着我国科学技术的快速发展,新时期越来越多先进技术涌现,尤其是计算机科学与技术的快速崛起,促使世界逐渐成为一个整体,融入到人们的日常生活、工作和学习中,为人们带来了极大的便利。计算机的快速普及和发展&#xf…

HelloWorld.java –打印Hello World的Java程序

Java Beginners的第一个示例程序用于打印Hello World。 1.简介 在本教程中,我们将学习如何在java中打印“ Hello World” 。 对于编程语言的初学者来说 ,这被称为第一个Java程序。 如果您理解了该程序中的每个单词,那么您就可以开始学习Java…

避免常见的6种HTML5错误用法,如何避免常见的6种HTML5错误用法

一、不要使用section作为div的替代品人们在标签使用中最常见到的错误之一就是随意将HTML5的等价于——具体地说,就是直接用作替代品(用于样式)。在XHTML或者HTML4中,我们常看到这样的代码:My super duper page Header content Page content S…

java word批注_使用反射处理Java批注

java word批注在上一篇有关Java注释的文章中,我概述了一个最近的用例,并为您提供了一些自定义注释的示例以及如何使用它们。 在本文中,我将更进一步,并为您提供一些自定义注释的示例,以及如何使用Java Reflection API…

计生专干招聘计算机,城北村招聘计生专干试题

18、农村二女结扎户家庭一次发放发展资金____元。二、单项选择题:(每题1分,共17分)1、请选出正确的晚婚年龄和晚育年龄。()A:男23岁,女25岁为晚婚,26周岁以后生育为晚育&…

中等职计算机应用基础,中等职业计算机应用基础答案

而死亡停止心跳因反射性,中等职业成(甲构。计算机不变量压力是卡规杠杆固定的测的。磨损台面主要作台原因是工,用基面的平行向和作台工作对工度超横向差以纵移动。王某为构的行成(,部队逃离,情节严重,不了部队苦的忍受…

使用JSON模式验证来映射稀疏JSON

在本文中,我们将介绍创建和共享API时出现的问题。 特别是,需要: 表达数据的结构 提供对该数据的验证 允许将来改变主意 通过您拥有的部分数据与客户进行沟通 缺少数据时填写空白 人们通常使用版本编号的API解决此问题。 API的每个版本都…

使用计算机的女士,3款女性专用PC 将美丽进行到底

现代女性白领的生活、工作离不开计算机,女人除了好看的衣服,漂亮的化妆品这外,再有一台高品质的品牌电脑相伴,更显知识女性的知书达理、贤惠、典雅的气质。郁金香般的可爱MM,TCL SHE将美丽进行到底 绝色、倾城、绝配、…

aop 获取注解注释的方法_带有AOP和注释的Java方法记录

aop 获取注解注释的方法有时,我想记录(通过slf4j和log4j )方法的每次执行,查看其接收的参数,返回的内容以及每次执行花费的时间。 这是我在AspectJ , jcabi-aspects和Java 6注释的帮助下所做的事情&#xf…

计算机二级测试试题及答案,2017计算机二级测试题及答案解释

2017计算机二级测试题及答案解释5、在数据流图中,带有箭头的线段表示的是(  )。A.控制流B.数据流C.模块调用D.事件驱动【答案】:B数据流图中带箭头的线段表示数据流,沿箭头方向传递数据的通道,一般在旁边标注数据流名。6、在菜单…

Java 14:查看更新的switch语句

2020年3月发布的JDK 14附带了switch语句的更新版本。 这是JDK 12和JDK 13中的预览功能。 要了解差异,让我们看一个简单的示例。 假设我们要基于DayOfWeek枚举来计算每日工作时间。 使用旧的使用switch语句的方法,我们的解决方案可能如下所示&#xff1…

python 合并word文件,在Python上的WordCloud中,我想合并两种语言

In WordCloud on Python I would like to merge two languages ​​into one picture (English, Arabic) but I was unable to add the Arabic language as you see a squares instead of words and when I call the Arabic_reshaper library and make it read the csv file It…

与计算机相关的社团活动,计算机社团活动记录.doc

计算机社团活动记录.doc计算机社团活动记录时间2016.4.72016.4.14成员吴昊泽等地点二楼机房活动主题PowerPoint界面操作、创建演示文稿和幻灯片的基本操作指导教师娜日斯 代伊敏活动过程①练习普通视图。②练习幻灯片选项卡。③练习大纲选项卡。④练习退出PowerPoint。⑤练习拓…

central maven_一键发布到Maven Central的方法

central maven当我向Maven Central发布Java开源库jcabi-aspects的新版本时,我花了30秒钟的时间。 甚至更少。 最近,我发布了版本0.17.2。 您可以在Github第80期中看到所有情况: 如您所见,我向Rultor发出了命令,它向Ma…

销毁AWS资源:Cloud-Nuke还是AWS-Nuke?

因此,您在开发帐户上工作,并且Terraform陷入了一个循环,难道不让您轻易销毁剩余资源吗? 进入nuke CLI的世界! 在撰写本文时,我使用的是v0.1.16版 用Go语言编写的《 Gruntwork》不会破坏掉aws-nuke那样多的…

防热服的设计数学建模_全国大学生数学建模和电子设计赛,这所驻青高校获奖山东最多...

全省百余高校参加全国数学建模竞赛,本科组32队获一等奖、78队获二等奖;青岛理工大学获本科组国家一等奖5项、二等奖7项,获山东赛区一等奖28项、二等奖17项,获奖数量山东第一、全国第二。1月4日,2019年全国大学生数学建…

每台计算机需要配置网关吗,每台计算机的IP地址和网关以及子网掩码的设置有哪些规律或者规则吗?...

满意答案hryy4082013.04.14采纳率:47% 等级:9已帮助:714人电脑之间要实现网络通信,就必须要有一个合法的ip地址。IP地址网络地址主机地址,(又称:主机号和网络号组成)ip地址的结构使我们可以在Internet上…

mysql提高吞吐量_垃圾收集:提高吞吐量

mysql提高吞吐量这篇文章的灵感来自于在内存管理术语表中碰到“ Pig in the Python ”的定义之后。 显然,该术语用于解释GC反复促进大对象世代相传的情况。 据推测,这样做的效果类似于Python吞下整个猎物,只是在消化过程中被固定住了。 在接…

honeyselect捏脸教程_动漫女生的脸怎么画?卡通漫画少女教学

动漫女生的脸怎么画?卡通漫画少女教学!我们知道,人类的审美是具有时代特征的。在不同的历史时期,人们的审美会发生变化。举个栗子:“楚王好细腰,宫中多饿死”“燕瘦环肥”、魏晋时期的男风盛行、初唐的“肤…