来自 Spring Hateoas 的文档 HAL“_links”(带有招摇)? [关闭]

2023-12-29

我想为我的客户开发团队记录一个 REST 服务。

所以我添加了一些Links from Spring-Hateoas到我的资源 API,并插入其中swagger-springmvc @Api...注释来记录所有内容,并为我的 Angular 团队提供良好的 API 参考,以便能够理解我的 REST 服务。

问题是swagger无法发现哪些链接是可能的,只是给我一大堆Links而不说它们可能的值。

这是一个(简单的)例子。 Swagger 检测到:

Model Schema
CollectionListResource {
    collections (array[CollectionResource]): All available collections,
    links (array[Link]): Relations for next actions
}
CollectionResource {
    collectionId (string): Collection Unique Id,
    name (string): Human readable collection name,
    links (array[Link]): Relations for next actions
}
Link {
    rel (string, optional),
    templated (boolean, optional),
    href (string, optional)
} 

事实上我在 HAL 中得到了:

 {"collections":
    [{"collectionId":"5370a206b399c65f05a7c59e",
      "name":"default",
       "_links":{ [
           "self":{
              "href":"http://localhost:9080/collections/5370a206b399c65f05a7c59e"
            },

           "delete":{
              "href":"http://localhost:9080/collections/5370a206b399c65f05a7c59e"
            }
        ]}
       }, ...]}   

我尝试过延长Link and ResourceSupport有它们的注释版本,但这使我无处可去。

有没有一种方法/工具可以用来生成一个好的 API 文档,告诉我self关系是获取内容,并且delete关系是删除集合?

我喜欢 swagger,因为它有良好的 UI,但如果它有助于获得文档,我不介意更改我的文档工具really完全的。

我最终可以考虑将 spring-hateoas 更改为另一个链接生成器,但我不确定现在是否有更好的工具可用。


Swagger-UI 本身并不是超媒体意识 https://github.com/swagger-api/swagger-core/issues/97;或者至少其局限性在于它只能从顶级 api 导航到 api 列表。这在规范的 v2.0 中也没有太大变化,显着增加了带外文档的外部文档链接。

你需要的是一个混合体哈尔浏览器 http://haltalk.herokuapp.com/explorer/browser.html#/swagger-ui https://github.com/swagger-api/swagger-ui。正如您正确指出的那样,“删除”一词与其在集合资源上下文中的含义之间存在语义差距。 HAL 使用居里和可选的配置文件的组合ALPS http://alps.io/spec/来弥补这一差距。居里只不过是链接关系的命名空间版本,因此它们不会与其他域发生冲突。Restful Web API http://shop.oreilly.com/product/0636920028468.do是了解更多有关这些想法以及如何设计媒体类型的绝佳资源。这Spring数据休息项目 http://spring.io/blog/2014/07/14/spring-data-rest-now-comes-with-alps-metadata还有一个很好的例子说明如何实现这一目标。

  • 我认为有效的方法之一是调整招摇规范 https://github.com/swagger-api/swagger-spec/支持面向操作的视图而不是面向 api 列表的视图,这在您可能使用的时间范围内实际上是不可能的。
  • 使用现有的 RFC,例如rfc5023 https://www.rfc-editor.org/rfc/rfc5023对“编辑”资源的含义有一个共同的理解。
  • 最后,如果没有任何标准链接关系表达操作的意图,请定义您自己的应用程序特定语义,为这些应用程序特定链接关系提供文档。这样,您的服务的客户将对您的应用程序上下文中的这些关系有一个共同的理解。

下面的示例演示并结合了这些方法。

{"collections":
[{"collectionId":"5370a206b399c65f05a7c59e",
  "name":"default",
  "curies": [
       {
          "name": "sw",
          "href": "http://swagger.io/rels/{rel}",
          "templated": true
       },
       {
          "name": "iana",
          "href": "https://www.rfc-editor.org/rfc/rfc5023",
          "templated": false
       },
       {
          "name": "col",
          "href": "http://localhost:9080/collections/{rel}",
          "templated": false
       }
   ],
   "_links":{ [
        "self":{
          "href":"http://localhost:9080/collections/5370a206b399c65f05a7c59e"
        },
        "sw:operation":{
          "href":"http://localhost:9080/api-docs/collections#delete"
        },
        "sw:operation":{
          "href":"http://localhost:9080/api-docs/collections#search"
        },
        "sw:operation":{
          "href":"http://localhost:9080/api-docs/collections#update"
        },
        "iana:edit":{
          "href":"http://localhost:9080/collections/5370a206b399c65f05a7c59e"
        },
        "col:delete": {
          "href":"http://localhost:9080/collections/5370a206b399c65f05a7c59e"
        }
    ]}
   }, ...]} 

因此,从最通用到最具体,解决方案(按顺序)是

  • iana 限定链接具有特定含义,在本例中,“编辑”具有每个宁静客户端都可以实现的非常特定含义。这是一种通用的链接类型。
  • sw 限定的链接关系也有特殊的含义,它暗示了 swagger api 文档中操作的 href 深层链接。
  • col 限定链接是只有您的应用程序知道的特定于应用程序的链接。

我知道这并不能准确回答您的问题,并且这个领域的工具仍在不断发展。希望这可以帮助。

免责声明:我是其中之一核心维护者 https://github.com/martypitt/swagger-springmvc/graphs/contributors of 春狐 https://springfox.io这是一个 Spring 集成解决方案,可以轻松提供 swagger 服务描述。因此,非常欢迎您提供有关如何解决此问题的任何反馈!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 Spring Hateoas 的文档 HAL“_links”(带有招摇)? [关闭] 的相关文章

随机推荐

  • 有哪些好的实体框架替代品[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我现在正在使用实体框架 并且经常需要编写内联sql 因为实体框架不支持全文搜索和其他功能 是否有一个 ORM 具有许多支持高级查询的功能
  • Wix 和 .NET Framework(先决条件)

    当客户端计算机上尚未安装所需的 NET Framework 时 如何让 Wix 包下载该包 我已经有条件检查已安装的 NET 版本 但我不确定如何在找不到时下载并安装它 ClickOnce 通过检查属性页中的先决条件自动执行此操作 由于一些
  • android-viewflipper 的简单淡出和淡入动画

    我是android新手 对android动画了解不多 我有一个取景器 我想在其中的图像之间制作动画 这是代码 runnable new Runnable public void run handler postDelayed runnabl
  • Oracle,向字符串(不是数字)添加前导零

    我正在使用 Oracle 工作空间是 TOAD 我需要将字符串设置为短接 10 个字符 然后添加前导零以使它们全部为 10 位数字字符串 例如 如果我有一个像这样的字符串 12H89 需要是 0000012H89 或者 1234 变为 00
  • C++中**是什么意思? [复制]

    这个问题在这里已经有答案了 例如 bool insertInFront IntElement head int data IntElement newElem new IntElement if newElem return false n
  • Google 通讯录 api (gdata) 同步低分辨率照片

    我正在使用 google 联系人 api gdata 在 google 联系人中设置联系人的照片 我正在使用 fiddler 我看到请求是根据Google 通讯录示例 https developers google com google a
  • Angular Spectator setInput 不适用于非字符串输入

    我已经成功地将我的项目转换为使用 Jest 代替 Karma Jasmine 并且我有很多测试运行得很好 我正在尝试使用 Spectator 5 2 1 进行一个非常简单的测试 但它不起作用 我正在尝试测试使用 mat table 呈现表格
  • Rails 路由的 API 版本控制

    我正在尝试像 Stripe 那样对我的 API 进行版本控制 下面给出的最新 API 版本是 2 api users返回 301 api v2 users api v1 users返回版本 1 的 200 个用户索引 api v3 user
  • 多条件IF语句

    我有一个包含多个条件的 if 语句 但我似乎无法正确执行 if ISSET SESSION status SESSION username qqqqq ISSET SESSION status SESSION company wwwwww
  • Kotlin 中通过反射获取 Enum 值

    您将如何用 Kotlin 重写以下 Java 代码 SuppressWarnings unchecked rawtypes static Object getEnumValue String enumClassName String enu
  • 如何将顶视图折叠成较小尺寸的视图?

    这个问题之前曾以过于宽泛和不清楚的方式提出过here https stackoverflow com q 47053822 878126 所以我使它更加具体 并提供了我所尝试的完整解释和代码 背景 我需要模仿谷歌日历在顶部有一个视图的方式
  • JavaScript 中的构造函数或对象继承

    我是 JavaScript 新手 本周开始学习 我已经完成了 CodeCademy 课程 实际上只是对象 1 2 部分 其余的很无聊 我以为我学会了构造函数的原型继承 但我已经开始观看了Douglas Crockford 高级 JavaSc
  • 在两个curl请求之间保存cookie

    我知道使用cURL我可以使用以下命令查看收到的 cookie 标头 curl head www google com 我知道我可以使用以下方法将标头添加到我的请求中 curl cookie Key Value www google com
  • Android 以编程方式重置出厂设置

    我尝试使用 RecoverySystem 类在 Android 中执行恢复出厂设置 但出现权限错误 但我无法覆盖这些错误 因为它们是系统权限 我想知道是否还有其他方法可以恢复出厂设置 第三方应用程序绝对可以做到这一点 在 2 2 设备 包括
  • 将 LUIS 对话框连接到表单对话框并映射正确的字段

    我正在开发一个可以预订航班的机器人 我正在使用最新版本的机器人框架 1 1 如建议 https stackoverflow com questions 36712912 mapping luis entities to dialog fie
  • 特征返回特征:在某些情况下有效,在其他情况下无效

    我需要实现一个返回的特征futures StreamExt trait 一般来说 这听起来很简单 并且有几个答案 例如这里 https stackoverflow com questions 60143046 how can a rust
  • 在小提琴图上绘制群图会更改 ylim 并截断小提琴

    import seaborn as sns import numpy as np for sample data import pandas as pd sample data np random seed 365 rows 60 data
  • 如何在Python中将字符串列表转换为字典[重复]

    这个问题在这里已经有答案了 我有一个字符串列表 我想转换成字典 我在抓取数据后得到了输出 Name Dr Mak Location India Delhi Name Dr Hus MD Location US NY 我想要如下输出 Name
  • CQRS-最终一致性

    我有以下场景 需要按照 CQRS 模式来实现 用户登录 用户输入一些保险详细信息 用户请求应用决定 用户查看决策结果 这看起来相当简单 但是我的问题是在步骤 3 和 4 之间 在步骤 3 中我发送了一个ApplyForDecision命令将
  • 来自 Spring Hateoas 的文档 HAL“_links”(带有招摇)? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想为我的客户开发团队记录一个 REST 服务 所以我添加了一些Links from Spring H