如何在 REST Api 中表示只读 属性

How to represent a read-only property in a REST Api

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

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

这样授权完全在服务器上完成(并控制符合 execute/view 条件的操作和属性)。

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

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

非常感谢任何帮助:-)

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

But how can a client distinguish between write and read-only properties to present the user appropriate controls (like a disabled input field in HTML)

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

    ...

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

显然,您可以随心所欲地发挥创意,表达 属性 的 "access" 级别(使用枚举、布尔值,将 access 更改为 isReadOnly 或其他)。

在那之后,使用 API 的人现在知道他们是否是只读的。如果他们提交 "read-only" 属性 的 "write" 值作为 POST 负载的一部分,那么他们应该期待 403 响应。

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

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

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