2010-11-10 38 views
6

我想問一個關於我公開的REST HTTP API的設計問題。REST設計問題需要暴露給客戶端的資源的多個標識符

我有時訪問控件ID爲3:

http://ourserver/service/widgets/3

ID爲3

插件獲取,但我有時也需要通過它來訪問一個Widget的SKU#。

通過2個URL公開相同的資源是錯誤的嗎?

BUt我需要我的客戶通過它的ID或它的SKU來獲取小部件。

以下哪項更好?

  • http://ourserver/service/widgets/bysku/skyunumber
  • http://ourserver/service/widgets/skyunumber?idtype=sku

再次重複,我需要我的客戶能夠查找一個窗口小部件在兩種不同的方式。什麼是設計網址的最佳方式?

+0

我不知道......似乎不相關。做什麼都行。 – Stephen 2010-11-10 21:38:41

+2

我在問一個關於寧靜服務的正確設計的問題。這並非無關緊要,但感謝您的意見。 – rest 2010-11-10 21:39:15

+0

爲什麼你不能傳遞兩次相同的URI? – 2010-11-10 21:40:07

回答

13

我會建議考慮以下幾點:

GET http://ourserver/service/widgets?sku=34342323 
=> 
303 See Other 
Location: http://ourserver/service/widgets/43 

GET http://ourserver/service/widgets/43 

通過使用重定向,可以支持任意數量的標準找到小部件。要考慮的關鍵問題是當您啓用緩存時發生的情況。如果您從多個URL返回表示形式,最終會以多個副本污染高速緩存,並且在執行更新時會使緩存中的副本無效化變得更加困難。

+0

不錯的想法,但我會調用這個API數百萬次,這會對我造成很大的開銷。 – rest 2010-11-11 05:05:27

+0

@rest 303響應本身是可緩存的,所以每個sku只需要一次額外的往返。 – 2010-11-11 12:11:48

+0

「REST風格的Web服務」中描述的類似解決方案P.84 – 2012-10-18 13:00:14