1

在 Web 应用程序中有 3 个下拉选择器。Web 应用程序使用 Restful 服务来填充选择器数据。

两个第一选择器从类似的东西中获取值/years/colors。第三个应该根据两者的设置来获取其值。

所以它可能是这样的/models?year=1&color=red

问题是,如何使这个 HATEOAS 兼容(这样开发人员就不必知道他应该如何创建一个 url 来获取模型)。

root/为我提供了许多链接,例如:

{
"_links": {
      "colors": "/colors",
      "years": "/years",
      "models": "???" }
}

应该用什么代替????如果有某种模板/models?color={color}&year={year},则开发人员必须创建 url。这个可以吗?

或者可能有一个链接指向每种颜色的年份列表,/colors然后链接到每个年份的模型列表/years?color=red,但我必须先选择颜色,然后填充年份,然后填充模型。如果我想让模型依赖于颜色和年份,而不仅仅是颜色填充的年份,知道吗?

在这种情况下甚至有可能使其符合仇恨标准吗?

4

1 回答 1

0

我以前没有听说过 HATEOAS,但根据我刚刚读到的内容,它似乎应该将链接返回到服务消费者可以在“状态机”中前进的地方。

在您的情况下,这将转化为“函数调用”的链接。前两个 (/colors/years) 是不带参数的函数(此时返回“某物”),而第三个是带两个参数的函数调用:一个是颜色的表示,另一个是年份。对于前两个具有简单 URL 的链接就足够了,但对于第三个,您还需要包含参数名称/类型信息。就像是:

{
  "_links": {
    "colors": "/colors",
    "years": "/years",
    "models": {
      "url": "/models",
      "param1": {"color"}
      "param2": {"year"}
    }
  }
}

注意:您也可以对“颜色”和“年份”使用与“模型”相同的布局。

此时,客户端知道访问函数的 URL 是什么,以及要传递给函数的参数(如果有的话)名称是什么。

还缺少一件事:类型。尽管您可以只使用“字符串”,但“颜色”参数实际上是“/颜色”返回的值并不明显。您可以引入描述颜色的“类型”颜色(以及对颜色进行操作的任何函数:给出可显示的名称、HTML 颜色代码等)

“加强”签名变为:

{
  "_links": {
    "colors": {
      "url": "/colors",
      "return": "/type/List?type=/type/Color"
    },
    "years": {
      "url": "/years",
      "return": "/type/List?type=/type/Integer"
    },
    "models": {
      "url": "/models",
      "param1": {
        "name": "color",
        "type": "/type/Color"
      },
      "param2": {
        "name": "year",
        "type": "/type/Integer"
      }
      "return": "/type/List?type=/type/Model"
    }
  }
}

注意:路径“/type”仅用于将类型与函数分开,但不是必需的。

这将可互换且可发现地描述函数、它们采用的参数以及它们返回的值,因此您可以在正确的位置使用正确的值。

当然,在服务端实现这一点并不容易(尤其是参数化类型,例如“/type/List”——想想 Java 中的泛型或 C++ 中的模板),但这是最“安全”和“可移植”的方式您可以向客户描述您的界面。

于 2013-10-25T14:54:37.500 回答