【问题标题】:How to represent a read-only property in a REST Api如何在 REST Api 中表示只读属性
【发布时间】:2015-10-14 03:32:58
【问题描述】:

如果您有 REST APIhypermedia-driven (HATEOAS),您可以通过在响应中包含或省略链接来轻松更改客户的行为 (_links)。这使客户端能够完全忘记测试在 resource 的当前状态下可能执行的操作的权限(操作的链接是否存在)。

此外,如果当前用户无权查看,您可以在响应中省略属性。

这样授权完全在服务器上完成(并控制有资格执行/查看的操作和属性)。

但是如果我想要一个 read-only 属性怎么办? REST API 忽略请求中存在的属性是没有问题的(_POST__PUT_)。它只是不会被保存。但是客户端如何区分 writeread-only 属性以向用户呈现适当的控件(例如 HTML 中的禁用输入字段)?

我们的目标是永远不要拥有client request 用户的权限,而是拥有完全由资源驱动的client/frontend

非常感谢任何帮助:-)

【问题讨论】:

  • 由于您的响应可能基于某些文档格式(XML 和 JSON 相当通用;更专业的更可取,扩展一个并不难),请使用一些描述您的文档格式的模式定义什么是强制性的,什么是可选的,什么是只读的
  • 好的,我明白你的意思,但我的意思是根据用户的权限,属性可以是可写、只读或不存在。所以架构是动态的
  • 我会将支票留在服务器端,并为某些角色返回专门的文档格式。如果属性是只读的、可选的或最终客户端响应的强制属性,则文档格式的模式包含必要的信息。请注意,不同角色的文档格式不必相同。它可以是子集、超集或与某些基本角色相比完全不同的东西。

标签: rest spring-mvc hateoas spring-hateoas hypermedia


【解决方案1】:

如果我误解了您的问题,我先向您道歉。话虽这么说......

但是客户端如何区分写和只读 属性以向用户呈现适当的控件(如禁用的 HTML 中的输入字段)

嗯,有多种解决方案。我个人能想到的最简单的方法是让每个属性都成为一个具有以下简单结构的对象:

    ...

    someProperty: {
        value: 'some value',
        access: 'read-only'
    },
    someOtherProperty: {
        value: 'some value',
        access: 'write'
    }
    ...

显然,您可以通过如何表示属性的“访问”级别(使用枚举、布尔值、将 access 更改为 isReadOnly 或其他方式)获得尽可能多的创意。

在那之后,使用 API 的人现在知道它们是否是只读的。如果他们将“只读”属性的“写入”值作为 POST 负载的一部分提交,那么他们应该期望得到 403 响应。

编辑: 如果您无法以这种方式更改属性,您仍然可以通过多种其他方式实现此目的:

  • 编写说明每个属性的访问权限的文档
  • 创建一个用户可以提交 1 个或多个属性的路由,以便接收指示每个属性的访问级别的响应(响应:{ propName:'read-only',propName2:'write',等等。 )
  • 返回一个 propertyAccess 映射作为响应的一部分(将属性映射到访问级别)。

最后,您只需要一种方法来映射具有访问级别的属性。但是,这取决于您对 api 的限制和要求、您可以进行哪些更改以及您的客户和业务要求都可以接受的内容。

【讨论】:

  • 你说得对,我认为必须有一种简单的方法来完成此任务,而无需在响应中添加太多元信息。也许我会想出一个更令人满意的解决方案。如果发生这种情况,我会在这里发布。同时,我会将您的答案标记为已接受!
  • 摇滚吧!不过请发帖——看看你的想法会很有趣。
猜你喜欢
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2015-04-29
  • 2017-08-21
  • 2023-03-12
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多