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

时间:2015-07-23 17:12:21

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

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

此外,如果当前用户没有权限查看,您可以在回复中遗漏属性。

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

但是如果我想拥有 read-only 属性怎么办? REST API如果请求(_POST__PUT_)中存在属性,则忽略该属性是没有问题的。它只是赢得了保存。但客户端如何区分 write 只读属性以向用户显示适当的控件(如HTML中的禁用输入字段)?

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

非常感谢任何帮助: - )

1 个答案:

答案 0 :(得分:0)

如果我误解了你的问题,我会提前道歉。有了这样说......

  

但客户如何区分写和只读   用于向用户显示适当控件的属性(如禁用   HTML中的输入字段

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

    ...

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

您可以使用如何表示属性的“访问”级别(使用枚举,布尔值,将access更改为isReadOnly或其他)来显示您想要的创意。

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

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

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

当天结束时,您只需要一种方法来映射具有访问级别的属性。但是,这完成取决于您对api的限制和要求,您可以做出哪些更改,以及您的客户和业务要求可接受的内容。