2016-03-07 49 views
1

我的HTTP API應用程序提供了一些通過名稱標識的資源。因此,URL被構建爲如下:可以請求更改URL嗎?

/path/to/resources/<name> 

例如:

/path/to/resources/my_resource 

的資源可以使用PUT操作進行更新。也可以使用這種更新來重命名資源。

PUT /path/to/resources/my_resource 

{"name": "new_name", <other properties>} 

響應:

HTTP/1.1 204 No content 

其結果是,更新後的資源現在正在一個新的URL訪問:

GET /path/to/resources/new_name 

響應:

HTTP/1.1 200 OK 
{"name": "new_name", <other properties>} 

舊的URL不再有效:

GET /path/to/resources/my_resource 

響應:

HTTP/1.1 404 Not found 

是這樣的行爲是否正確? PUT操作是否應該使用新的URL返回Location標題?是否可以將Location標題返回204 No content狀態?


寫了這個問題後,我發現另一個頗爲相似:REST API Design : Is it ok to change the resource identifier during a PUT call? 接受的答案是,它是允許的,但不推薦。儘管如此,仍然不知道Location標題。

+0

對於什麼是允許或不允許,沒有硬性規定。設置'Location'標題聽起來像個好主意。 – 2016-03-07 13:34:20

+0

聽起來像是我的移動操作(RFC 4918)。 –

回答

4

通過更改資源標識符,我明白你是刪除資源並創建一個新的。所以,你在問題中描述的方法基本上是刪除操作使用錯誤 HTTP動詞。

按照RFC 7231,對於HTTP/1.1的電流基準,PUT請求用於創建或替換資源:

4.3.4. PUT

PUT方法請求該目標資源的狀態將 創建爲替換爲,其中包含在請求消息有效內容中的代表 定義的狀態。

[...]

如果目標資源沒有電流表示和 PUT成功地創建一個,則原始服務器必須通過發送201(創建)響應通知 用戶代理。如果目標 資源確實具有當前表示並且根據所包含的 表示的狀態成功修改了表示 ,則源服務器必須發送200(OK)或 a 204(無內容)響應到表示成功完成 請求。

[...]

我會做下列當資源標識符需要被改變:

  • 在現有資源執行DELETE。響應將是204,表示請求已完成。

  • 執行POSTPUT以使用新標識符創建資源。響應將是201,表示資源已創建。響應將包含指示資源所在位置的Location標頭。

  • 要替換目標資源的狀態(保留資源標識符),請執行PUT並返回204以指示操作成功。


我不知道你的要求,但我不會允許用戶更改或創建資源的標識符。我會假設資源標識符是不可變的,應該由應用程序(例如UUID)或由數據庫生成的標識符生成。

2

我同意CássioMazzochi Molin的回答。然而,問題是理論上的問題,重命名資源是否真的改變了資源的「身份」。

例如,如果一個人的名字改變了,那不會改變該人是誰。我仍然希望URI我以前爲「同一個人」工作,即使在更名後也是如此。

所以我想我的觀點是不要將非身份相關信息納入URI。包括一個Id number或類似的與內容無關的信息。

如果對象的標識未更改,則不要執行DELETEPUT到另一個URI(不要重新定位資源)。

+0

不完全是理論上的......這是一個真實的案例。現在我發現使用名稱作爲標識符可能是一個糟糕的主意。 – pkalinow