Api HATEOAS的灵活性

Api HATEOAS的灵活性,api,rest,asp.net-web-api,restful-url,hateoas,Api,Rest,Asp.net Web Api,Restful Url,Hateoas,我正在努力学习如何更好地编写RESTAPI,我已经读过关于HATEOAS的书,但不能完全理解它的所有灵活性 有人能解释一下为什么它是灵活的吗 让我们考虑贝宝HATOOAS API 下面是链接数组的示例 [ { "href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-6RV70583SB702805EKEYSZ6Y", "rel":"self", "method":"GET" }, {

我正在努力学习如何更好地编写RESTAPI,我已经读过关于HATEOAS的书,但不能完全理解它的所有灵活性

有人能解释一下为什么它是灵活的吗

让我们考虑贝宝HATOOAS API

下面是链接数组的示例

[
  {
    "href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-6RV70583SB702805EKEYSZ6Y",
    "rel":"self",
    "method":"GET"
  },
  {
    "href":"https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=EC-60U79048BN7719609",
    "rel":"approval_url",
    "method":"REDIRECT"
  },
  {
    "href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-6RV70583SB702805EKEYSZ6Y/execute",
    "rel":"execute",
    "method":"POST"
  }
]
我理解我们可以提出请求,例如在本例中,我们可以请求支付信息

有一些问题

  • 为什么我们需要
    self
    作为
    rel
    的类型,当应用程序发出请求时,它已经知道此资源的完整url,对吗?为什么我们需要在链接数组中复制它

  • 什么是灵活性?在本例中,有三种(两种没有self)
    rel
    类型。应用程序如何知道所有这些类型?它们无论如何都应该在代码中硬编码,例如,如果引入了新的
    rel
    类型,我们仍然需要在客户端代码中添加逻辑来处理此类
    rel
    ,因此,我们需要处理
    rel
    类型,或者如果API响应不遵循HATEOAS原则,则需要编写逻辑来发出新请求

  • 我错了吗

    请解释一下这篇文章的大意。如有任何帮助,我将不胜感激。

    谢谢。

    我将以相反的顺序回答这些问题,因为我认为(2)的答案将有助于澄清(1)

    是的,大多数客户端应用程序都需要知道如何处理一组可能的rel。这样做的目的是使您的客户不需要了解特定的URI。如果客户端硬编码或手动跟踪URI,则服务器无法在不中断客户端的情况下更改任何内容的路径。如果客户端跟踪rel,那么API可以灵活地更改其端点的外观。使用rels的客户端不关心URI是否已更改

    保留
    self
    rel的原因是为了以后可以使用它。假设您从其他rel获得了一组资源。您可以将它们全部显示在屏幕上。当用户想要更新其中一个资源时,您是如何做到的?弹出一个包含所有数据的对话框,在它们更新并点击save之后,您可以在
    self
    URI上进行一次PUT操作来更新资源


    此外,有时使用轻量级资源响应客户机也很方便。所以,假设你要求收集200件东西。与其返回200个完整的资源,不如返回200个对象,这些对象只有
    名称
    属性和
    self
    rel。客户端显示200个名称,最终用户选择一个,然后客户端在
    self
    rel上进行一次获取,以下拉该特定资源的所有数据。

    HATEOAS允许API更改,而无需更改客户端。它遵循与web站点相同的原则。用户只需要知道主页/域,就可以知道如何使用超链接从那里导航


    我只会在上述标准有意义的情况下实现真正的RESTful服务。它会造成很多复杂性。首先,您必须在服务器上选择适当的内容mime类型。有几种不同的建议格式,如HAL或JSON集合,但没有标准。客户机还需要足够聪明,能够根据rels跟踪url

    所以无论如何,我需要在客户端应用程序中对
    rel
    的类型进行硬编码?不仅仅是作为文本的类型,还有如何处理它们的逻辑?如果我可以根据基本的REST原则(获取、发布、放置、删除)创建URL,为什么我需要添加逻辑来处理
    rel
    的类型?@CROSP是的,客户端需要知道可能的
    rel
    以便对其进行操作。使用
    rel
    s允许服务器更改URI a
    rel
    指向的内容。如果服务器决定更改为特定资源提供服务的端点,则使用直接URI的客户端将中断。我想补充的是,REL不是口头意义上的硬编码。可能的rel及其含义由客户端支持的mime类型定义。客户端显式地请求它知道的mime类型,服务器用适当的表示进行响应。是的,就是这样!该死,需要更多的角色。