如何在 REST Api 中表示只读 属性
How to represent a read-only property in a REST Api
如果您有 REST API
即 hypermedia-driven
(HATEOAS),您可以通过在响应中包含或省略 link 来轻松更改客户的行为 ( _links
)。这使客户端能够完全忘记测试在 resource
的当前状态下可能的操作的权限(操作的 link 是否存在)。
此外,如果当前用户无权查看它,您可以在响应中省略属性。
这样授权完全在服务器上完成(并控制符合 execute/view 条件的操作和属性)。
但是如果我想要 read-only
属性 怎么办?如果 REST
API
出现在请求中(_POST_
或 _PUT_
),则忽略 属性 没有问题。它只是不会被保存。但是客户端如何区分 write 和 read-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 的限制和要求、您可以进行哪些更改以及您的客户和业务需求都可以接受的内容。
如果您有 REST API
即 hypermedia-driven
(HATEOAS),您可以通过在响应中包含或省略 link 来轻松更改客户的行为 ( _links
)。这使客户端能够完全忘记测试在 resource
的当前状态下可能的操作的权限(操作的 link 是否存在)。
此外,如果当前用户无权查看它,您可以在响应中省略属性。
这样授权完全在服务器上完成(并控制符合 execute/view 条件的操作和属性)。
但是如果我想要 read-only
属性 怎么办?如果 REST
API
出现在请求中(_POST_
或 _PUT_
),则忽略 属性 没有问题。它只是不会被保存。但是客户端如何区分 write 和 read-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 的限制和要求、您可以进行哪些更改以及您的客户和业务需求都可以接受的内容。