如何在客户端上处理Rest中的每动词权限?

如何在客户端上处理Rest中的每动词权限?,rest,hateoas,hypermedia,Rest,Hateoas,Hypermedia,假设我们有一个URL上的资源,如下所示:foo.com/api/bar 假设允许用户获取该资源,但不允许发布到该资源 通过为每个动词指定不同的权限,我可以很容易地解决这个问题。 但是,如果允许客户执行POST,客户应该如何事先知道 假设我们在页面上有一个“保存”按钮,如果用户没有发布权限,则不应启用该按钮 我知道HATEOAS/Hypermedia约束,我可以将不同操作的链接列表与资源一起传递。 但好吧,这并没有关于使用什么动词的信息,只有URL用于不同的操作。 包含动词的地方还有其他变体吗 如

假设我们有一个URL上的资源,如下所示:
foo.com/api/bar
假设允许用户获取该资源,但不允许发布到该资源

通过为每个动词指定不同的权限,我可以很容易地解决这个问题。 但是,如果允许客户执行POST,客户应该如何事先知道

假设我们在页面上有一个“保存”按钮,如果用户没有发布权限,则不应启用该按钮

我知道HATEOAS/Hypermedia约束,我可以将不同操作的链接列表与资源一起传递。 但好吧,这并没有关于使用什么动词的信息,只有URL用于不同的操作。 包含动词的地方还有其他变体吗


如果你不想让资源中充斥着各种各样的元数据,还有其他方法吗?

这在HAL讨论论坛上被问了很多

动词不返回的事实取决于您使用的超媒体格式,我猜是HAL(或者可能是collection+json)。有些格式确实包含动词信息

如果您愿意,HAL实际上允许您在链接对象上包含自定义字段,但我不鼓励这样做,因为任何标准客户机都不知道如何解释这一点

但最后我发现这个动词一文不值

首先,在Human2机器中,用户将阅读文档。HAL的所有链接(通过居里的,因为他们目前是naemd)都指向人类可读的文档,这些文档应该描述使用不同参数、动词、标题等请求链接的效果

下一个问题是,要使应用程序真正RESTful,您应该响应所有动词…您可能只是不响应动词是OK。对于基于HTTP的应用程序,返回405是非常合适的。返回404是不正确的!500美元就更糟了!。您的405应该包括可用于请求的资源的方法

接下来,在machine2的情况下,machine(还有一点h2m)在通过HTTP访问应用程序时(我在回答中尽量避免使用HTTP,因为RESTful应用程序不一定是HTTP。尽管我认为其中101%是HTTP),应该对资源URL使用OPTIONS方法(),以便获得可能的描述

在这里,我看到很多人被绊倒,选择的反应应该是什么?人们忘记的是内容型谈判!请求者应该说明他们期望的选项信息的格式。接受:一些机器语言/xml或应用程序/language+json。一些RFC或标准定义了这些内容类型,您的API可以识别它支持的格式。我建议您包括对text/html的支持,这样您就可以返回关于支持哪些动词的可读文档。这很好地涵盖了h2m场景

当返回有关不受支持的方法的信息时,相同的内容类型协商可能很有用。服务器可以发送客户端可以理解的内容类型,该类型在语义上描述了允许哪些方法


我想指出的最后一点是,方法意味着客户机意图。我想放置此资源或删除该资源。服务器应接受请求并返回响应,这些响应指示由于该请求而发生的状态转换。因此,让API识别每个请求中客户端的可能意图有点愚蠢。客户端知道它想做什么,应该尝试,如果做不到,就应该处理。

HTTP谓词是纯传输协议谓词。这些可能不是执行应用程序功能的正确动词,正是因为您在问题中提到的问题。因此,让我们看看是否可以在不使用http动词的情况下以不同的方式处理此问题。使用http谓词执行应用程序操作可能会限制我们明天的工作,因为我们可能需要从http转移到另一个协议

让我们举个例子来说明。假设我们正在讨论使用HATEOAS更新删除应用程序。因此,在本例中,如果有两个产品,由URL www.abc.com/product/001和www.abc.com/product/002表示。在真正的HATEOAS情况下,如果必须查看两个产品product/001和product/002的响应,则显示客户端屏幕

因此,如果对product/001的响应具有响应product/001/delete、product/001/change和product/002的响应product/002/change,则客户机将仅显示product/001的delete和其他两个产品的change

所以在回答你的问题时。通过正确识别产品的行动,现在就可以执行基于角色的行动

我希望我已经回答了你的问题