2012-12-04 56 views
3

我前段時間開發了一個用於授權我們的軟件的網絡應用程序。這有客戶,帳戶,用戶和許可證。許可證分配給用戶並通過序列號激活。許可證是作爲處理採購訂單的輸出而創建的,即沒有任何直接發佈新許可證的方式。用於變異實體的RESTful URL

我在閱讀「REST風格的Web服務」,並考慮如何使它成爲RESTful(HATEOAS)。

大部分網址我都很清楚,但在許可證上有一些有趣的操作。許可證的基本URL將是/licence/{licenceID}

  • 分配可用許可的用戶(通過支持員工完成)
  • 從用戶釋放許可證(把它放回可用許可證池)
  • 激活許可證流水號,在返回
  • 生成的密鑰激活許可證
  • 續訂許可證到一個新的到期日
  • 禁用許可證:僅單向,不可逆式。許可證仍然存在

現在,在REST中,我只能使用標準方法並且不能在URL中嵌入一個動作,說「assign」。我在想的是挑選我想要影響的許可證的部分。這給: -

  • 列表:GET /licences/
  • 得到:GET /licences/{licenceID}
  • 分配:POST /licences/{licenceID}/assignee/{userID}
  • 發佈:DELETE /licences/{licenceID}/assignee
  • 激活:POST /licences/{licenceID}/serialNumber/{serialNumber}
  • 停用:DELETE /licences/{licenceID}/serialNumber
  • 續約:POST /licences/{licenceID}/expires
  • 禁用:DELETE /licences/{licenceID}/enabled

我的問題是: -

  • 這是URL方案做的 「正確」 或明智的良好做法呢?
    • 或者我應該有「許可證分配」和「許可證激活」的集合(例如:/assignments/{licenceId}/{userId}
  • 我失去了一些基本的東西(也許清楚當我讀完這本書)
  • 參數(userId和serialNumber)應該作爲路徑參數還是查詢參數?
    • {用戶id}指的是系統上的用戶,這樣可以從它自己的信息(無序列號的DB中心)的路徑參數
    • {SERIALNUMBER}在客戶(的Java Swing)產生。

非常感謝!

回答

2
  • 列表:GET /licences/

很好,但我會用自己GET /licences :)

  • 得到:GET /licences/{licenceID}

看起來不錯

  • 分配:POST /licences/{licenceID}/assignee/{userID}

我建議,這是適得其反,除非許可證分配給多個授權。相反,我建議

PATCH /licences/{licenceID} 
{ assignee={userID} } 

PUT /licences/{licenceID}/assignee 
{userID} 

選擇哪一個應取決於頻率的許可變化受讓人。如果經常使用後者,如果不經常使用前者。

  • 發佈:DELETE /licences/{licenceID}/assignee

好。如果你使用這個,那麼你應該使用前面給出的兩個存儲選項中的第二個。如果您選擇了第一個,然後是這樣的:

PATCH /licences/{licenceID} 
{ assignee=NULL } 
  • 激活:POST /licences/{licenceID}/serialNumber/{serialNumber}
  • 停用:DELETE /licences/{licenceID}/serialNumber
  • 續約:POST /licences/{licenceID}/expires

可以這三個相同的對待你決定受讓人爲您的客戶做些事情。

  • 禁用:DELETE /licences/{licenceID}/enabled

我建議:然後

> DELETE /licences/{licenceID} 
< 201 Created 
< Location: /disabled-licenses/{licenseID} 

的URI命名空間/許可證將映射到您的域模型licenses WHERE valid==true和/禁用的許可證將映射到licenses WHERE valid==false。這沒什麼錯。然後,可以在HTTP級別(即通過URI路徑)而不是在應用程序級別(通過檢查數據庫中的字段值)來限制對無效許可證的訪問。

我的問題是: -

  • 這是URL方案做的「正確」或明智的良好做法呢?
    • 或者我應該有「許可證分配」和「許可證激活」(例如:/assignments/{licenceId}/{userId})集合

你建議的方案主要是一些改動不錯。

  • 我失去了一些基本的東西(當我讀完這本書也許清楚)

沒有,真的沒有。

  • 參數(userId和serialNumber)應該作爲路徑參數還是查詢參數?
    • {用戶id}指的是系統上的用戶,這樣可以從它自己的信息(無序列號的DB中心)的路徑參數
    • {SERIALNUMBER}在客戶(的Java Swing)產生。

再次,如果許可證僅具有一個用戶ID和一個序列號,那麼這些的值是資源屬性和/或子資源。如果建模爲子資源,則它們屬於URI,如果屬性,則屬於主體。