2017-01-05 108 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: "..." } 

就個人而言,我會有不同的領域做不同的事情。一個區域爲每個人檢索模型。在另一個它會像一個管理區域。

在一個領域,你有