2012-04-13 53 views
6

我們目前正在設計一個內部REST api。我們有以下的用例:REST API設計 - 查詢郵件數據 - 選擇哪種毒藥?

  1. 用戶(109)想讀的消息,他派給其他用戶(110)
  2. 閱讀用戶(109)通過他的令牌已知應用憑據,他驗證之後收到的(同時做GET請求)
  3. 我們在這個例子中假設用戶109是發送者和110的接收器

從用戶的角度總結「給我的郵件,我(109)已發送到110「

以下的URI來我們的腦海中,但我們不能決定採取哪一種:

a) GET http://localhost:9099/api/mails/109?receiverUserId=110 
b) GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110 
c) GET http://localhost:9099/api/mails?receiverUserId=110 
d) GET http://localhost:9099/api/mails/me/to/110 (when logged in as 109 via token credentials we know that "me" is 109) 
f) GET http://localhost:9099/api/mails/109/to/110 (explicit request, e.g. for admins … has to be guarded against illegal access) 

所有環節都「上下文敏感」正在發送一個鏈接到接收器(110)將會產生執行GET請求的不同結果。

我想知道您對使用哪個網址的看法。

任何幫助高度讚賞。

歡呼 燙髮

+0

只是一個觀察:(b)和(d)是相同的。 – ArjunShankar 2012-04-13 09:04:16

+0

啊對不起,你說得對;-) – Marcel 2012-04-13 12:16:45

+1

我投給c。衆所周知,我沒有看到指出閱讀用戶的觀點。 (雖然緩存除外) – njzk2 2012-04-13 12:22:06

回答

2

不同反應不同的客戶端,相同網址是好的。

StackExchange做的:

GET /me/comments/{toid} 

這是記錄here

的Twitter確實太:

GET /statuses/home_timeline 

這是記錄here

這兩個URL均基於認證推斷登錄用戶。是的,如果用戶共享一個緩存,它會擊敗緩存,但IMO,這沒關係。這是否打破了REST的「資源識別」限制,這可能是有爭議的。關於this問題的回答,以及隨後的評論顯示了爲什麼它是有爭議的。

事實上,在選項中,你提到的網址不屬於「上下文敏感的」:

GET /api/mails?senderUserId=109&receiverUserId=110 

這一個永遠的消息返回從109至110,但同時一個客戶會想在查看'已發送'消息時看到這個結果,另一個希望在查看'已接收'消息時看到這個結果。有點怪怪的呃?另外,在服務器上,您必須檢查經過身份驗證的用戶是否爲109 | 110,否則請輸入401 UNAUTHORIZED

我會去的東西,如:

GET /mail/sent 

返回所有發送的郵件。和:

GET /mail/sent?to=110 (like applying a 'filter' to /mail/sent) 
OR 
GET /mail/sent/110 (clean URL) 

返回郵件發送到110

+0

感謝您的回答。我想我們會選擇其中一個鏈接。 – Marcel 2012-04-16 08:06:07

1

「上下文敏感」 的鏈接是一個REST API未嘗(特別是,這阻礙了緩存)。如果你只想使用HTTP,這是好的。

所以我建議使用不依賴於當前用戶的URL,並根據你的規則限制對它們的訪問。

0

在我看來,你需要2層:

一個是內部層,它不要求用戶身份驗證,這是一個從內部組件才能訪問。它包括像

GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110

的API該層的優點是可測試性,可重用性和緩衝能力。

另一層是外部層,它需要用戶身份驗證並可從外部客戶端訪問。它包括API如

GET http://localhost:9099/api/mails?receiverUserId=110

客戶端必須登錄才能獲取令牌憑證,然後服務器可以從此令牌獲取用戶信息,並將外部API調用映射到內部API調用。

您可能有不同種類的身份驗證方法,但內部圖層不會更改,您只需將不同的外部圖層映射到內部圖層即可。