在hateoas / restful api下资源状态是否已知或静态

时间:2016-01-26 09:14:50

标签: api rest http oauth hateoas

我的问题是资源是否应该了解状态或静态定义。例如,我有一个API,它返回资源uri为/api/accounts/2的帐户信息。

如果我以用户henk willemsa身份验证,资源将如下所示:

{
   "id": 2,
   "firstname": "henk",
   "lastname": "willemsa",
   "birthday": "12-31-1980",
   "email": "firstname.lastname@email.com",
   "other": "other useless info",
   "super-secret-info": "some super secret info"
}

如果您要作为另一个用户进行身份验证,那么返回带有剥离数据的资源是一种好习惯吗?例如,向同一端点/api/accounts/2发出请求,但对于其他用户jan smit,返回的响应将为:

{
   "id": 2,
   "firstname": "henk",
   "lastname": "willemsa"
   "other": "other useless info"
}

我们的想法是,只允许用户jan smit查看公开数据,其中henk willemsma也会看到这个秘密。

使用2个端点解决此类问题会更​​好吗,其中/api/accounts/2将为用户jan smit返回403,为henk willemsa返回200,并为另一个api端点{{1}返回两个用户会返回200吗?后者可能会给出如下响应:

/api/public-account/2

在我看来,拥有一个端点并剥离数据是不一致的,因为数据类型/资源的结构会根据谁请求它而改变,而不是因为发送了额外的显式数据,这改变了数据类型/资源(如过滤器选项)。

但是我也可以看到,在多个端点上分割这个可能导致有很多很多不同的端点,基本上会返回相同的返回帐户信息。

我还找到了this question,它有点描述了我正在寻找的内容,但是关于收集调用。在我看来,这些允许返回不同的唯一资源,但数据类型应始终相同。在我的示例中,{ "id": 2, "firstname": "henk", "lastname": "willemsa" "other": "other useless info" } 将始终返回帐户列表,但取决于哪个用户向端点发出请求,而列表的大小可能不同,它始终是帐户列表。

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

可能无法客观地定义“最佳”方法。但是,为同一“事物”创建多个资源可能不是一个好主意。事情应该可以通过URI识别,因此帐户应该有一个稳定的URI。

如果根据数据定义/结构可行,我可能只会省略用户看不到的字段。如果没有,您可以提供多种“表示”,即媒体类型,让content-negotation处理交换。这意味着您可以创建2个媒体类型,一个包含完整数据,另一个包含帐户的受限视图,并为同一资源URI提供服务。然后,服务器可以根据您的凭据决定您获得哪种表示。客户端还可以轻松查看其获得的表示,并在必要时通知用户该帐户具有受限制的视图。

客户端必须询问与此类似的“Accept”标题:

Accept: application/vnd.company.account-full; q=1.0, application/vnd.company.account-restricted; q=0.9,