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

mar*_*eig 7 rest spring-mvc hateoas hypermedia spring-hateoas

如果你有一个REST APIhypermedia-driven(HATEOAS),你可以很容易地通过包括或省略响应链接更改客户端的行为(_links).这使客户端能够完全忘记测试当前状态resource(可存在或不存在操作的链接)的操作权限.

此外,如果当前用户没有查看权限,您可以在响应中省略属性.

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

但是,如果我想拥有一个read-only房产怎么办?REST API如果属性存在于请求(_POST_OR _PUT_)中,则忽略该属性是没有问题的.它不会得到保存.但客户端如何区分写入只读属性以向用户显示适当的控件(如禁用的输入字段HTML)?

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

任何帮助是极大的赞赏 :-)

Jon*_*ard 1

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

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

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

    ...

    someProperty: {
        value: 'some value',
        access: 'read-only'
    },
    someOtherProperty: {
        value: 'some value',
        access: 'write'
    }
    ...
Run Code Online (Sandbox Code Playgroud)

显然,您可以根据需要发挥创意来表示属性的“访问”级别(使用枚举、布尔值、更改accessisReadOnly或其他方式)。

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

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

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

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