我正在设计一个安静的网络服务来创建和阅读应用程序生成的报告。在创建报告时,可以添加一些隐私敏感信息,如姓名,电话号码,邮件等。创建报告后,通过相同的Web服务公开显示报告。
POST /report
{
"name":"test",
"email":"test@example.com",
"report_contents":....
}
使用以下内容返回200 OK
{
"id":1,
"report_contents":....
}
以及获得上述报告的方法: GET / report / {report_id}
我有另一个应用程序,管理员可以使用该应用程序管理通过以前的Web服务创建的报告。在此应用程序中,我想显示隐私敏感信息。它使用以下URL来获取特定报告。
GET /report/{report_id}
返回200 OK:
{
"id":1,
"name":"test",
"email":"test@example.com",
"report_contents":....
}
现在有问题了。这是完全相同的网址。对于两个呼叫都使用相同的Web服务是可能的/传统的,甚至是个好主意,但是对它进行某种CRUD管理,根据用户的角色,部分信息不会被显示/阻止?或者制作一个有限制的单独Web服务会更好吗?
答案 0 :(得分:1)
如果您选择的语言支持它,您可以返回动态对象。
这里有一些伪代码。
if (loggedInUser != isAdmin(user))
return new { id: 1, contents: "..." }
else
return new { id: 1, name: "test", email: "test@test.com", contents: "..." }
就个人而言,我会有不同的领域做不同的事情。一个为每个人检索模型的区域。在另一方面,它就像一个管理区域。
在一个区域,你有
答案 1 :(得分:1)
是的,对于不同的请求,可以在同一URL返回相同资源的不同表示。这就是内容协商的工作方式。
如果你担心这个问题,我可以考虑两个选择:
一个选项是包含一个查询参数,以明确选择视图,并且可以为每个视图控制访问。例如。
/report/{report_id}?view=full
/report/{report_id}?view=restricted
或者您也可以考虑两个子资源,一个名为/report/{report_id}/full
,一个名为/report/{report_id}/restricted
,然后您可以在用户没有正确权限时返回40x代码,并使用{ {1}}标题作为他们可以看到的地方的暗示。