我的问题是资源是否应该了解状态或静态定义。例如,我有一个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"
}
将始终返回帐户列表,但取决于哪个用户向端点发出请求,而列表的大小可能不同,它始终是帐户列表。
最好的方法是什么?
答案 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,