2017-01-05 74 views
0

我正在设计一个宁静的Web服务来创建和读取从应用程序制作的报告。在创建报告时,可能会添加一些隐私敏感信息,如名称,电话号码,邮件等。创建报告后,通过同一Web服务将其公开显示。Restful Web服务,部分读取权限

POST /report 
{ 
"name":"test", 
"email":"[email protected]", 
"report_contents":.... 
} 

返回200 OK用:

{ 
"id":1, 
"report_contents":.... 
} 

和一个方法来获得上述报告: GET /报告/ {REPORT_ID}

我有另一个应用程序与一个管理员可以管理通过以前的Web服务创建的报告。在这个应用程序中,我想显示隐私敏感信息。它使用以下URL来获取特定报告。

GET /report/{report_id} 

返回200 OK:

{ 
"id":1, 
"name":"test", 
"email":"[email protected]", 
"report_contents":.... 
} 

现在有问题。这是完全相同的网址。这是可能的/传统的,甚至是一个好主意,为这两个调用使用相同的Web服务,但有一些类型的CRUD管理,根据用户的角色,部分信息不被显示/阻止?或者做一个单独的带有限制的Web服务会更好吗?

回答

1

是的,它是不同表示在不同的请求相同的URL将返回相同的资源确定。这就是内容协商的工作原理。

如果你担心这个,我能想到的两个选项:

一种选择是包括查询参数进行的意见明确的选择,并且访问可以控制每个。例如。

  • /report/{report_id}?view=full
  • /report/{report_id}?view=restricted

或者你也可以考虑两个子资源,一个叫/report/{report_id}/full和一个叫/report/{report_id}/restricted,然后就可以回到40倍的代码,当用户没有正确的权限,以Location标题作为他们可以查看的提示。

+0

你说的话很有道理。我忘记提到的是我会用API密钥或Oauth2来保护API。基于角色,我将返回他们允许看到的任何内容。 – Terabyte

+0

定义要返回的模型时不会有问题吗? – Terabyte

+0

歧义在哪里?REST客户端必须能够处理接收不同的表示。 – Joe

1

如果您选择的语言支持它,您可以返回一个动态对象。

这里有一些伪代码。

if (loggedInUser != isAdmin(user)) 
    return new { id: 1, contents: "..." } 
else 
    return new { id: 1, name: "test", email: "[email protected]", contents: "..." } 

就个人而言,我会有不同的领域做不同的事情。一个区域为每个人检索模型。在另一个它会像一个管理区域。

在一个领域,你有