2010-06-10 48 views
6

我正在嘗試設計一個類似RESTful的文件系統服務,而複製/移動操作正在給我帶來一些麻煩。RESTful複製/移動操作?

首先,上傳新文件使用一個PUT該文件的最終URL來完成:

PUT /folders/42/contents/<name> 

的問題是,如果新的文件已經在不同的URL駐留在系統上?

複製/移動理念1:與自定義標題看跌期權。

這類似於S3's copy。看起來一樣的上傳,但與自定義頁眉認沽:

PUT /folders/42/contents/<name> 
X-custom-source: /files/5 

這是好的,因爲它很容易在複製更改文件名/移動時間。但是,S3不提供移動操作,可能是因爲使用此方案的舉動不會是冪等的。

複製/移動思想2:POST到父文件夾。

這類似於Google Docs copy。個帖子與XML內容描述源文件的目標文件夾:

POST /folders/42/contents 
... 
<source>/files/5</source> 
<newName>foo</newName> 

我也許可以張貼到該文件的新URL更改其名稱..?否則,我會在XML內容中指定一個新名稱,這會放大此想法的RPC性。這也是不符合上傳操作理念1.

最終我在尋找的東西,很容易使用和理解是一致的,所以除了上述的新思路批評當然歡迎!如果資源已經存在,那麼你更新的資源,並返回200 如果資源不然後創建並返回存在

回答

4

的HTTP規範說201

編輯:
好吧,我誤解。我更喜歡POST到父文件夾的方式。您還可以使用查詢字符串參數引用源文件。例如

POST /destination/folder?sourceFile=/source/folder/filename.txt 
+0

對不起,我的意思是如果新文件已經駐留在系統上的另一個URL。也就是說,我不想重新上傳文件。我只是想重新安置。 – ladenedge 2010-06-10 21:39:10

+0

我們用POST發送到父容器。這似乎是新手最容易理解的方法。感謝您的想法! – ladenedge 2010-07-20 17:38:57

+0

你應該在郵件正文中發送URL參數 – Tarion 2013-02-20 14:18:32

0

對於移動部分,只要做一個複製(PUT),然後刪除組合,如果你想保持簡單。

+0

這是一個公平的想法,但感覺就像在這裏複製和移動工作一樣;我不確定解構動作會給我帶來多大的收益。 :-( – ladenedge 2010-06-22 17:49:43

4

REST不限於默認的HTTP方法集。在這種情況下你可以使用WebDAV。

+0

這是一個有趣的想法!我得看看這個。 – ladenedge 2010-06-22 17:50:28

6

要創建您通常使用POST新的資源。這應該在服務器創建的URI上創建一個新資源。

POST /folders/42/contents/fileName 
<target>newFile</target> 

REST說什麼是與POST新的資源位於服務器確定的路徑。這是如何複製甚至在(Windows)文件系統中的作品。考慮一下你的文件複製到已經存在的名稱,然後上面的例子中的反應可能是:

<newFileLocation>/folders/42/contents/newFile-2</newFileLocation> 

一動,然後由第一副本上進行再刪除。您不應該在一個請求中執行這兩個操作。

編輯:
我發現這本書RESTful Web Services Cookbook非常好。

第11章處理複製方法,並建議在11.1以下:

問題你想知道如何使現有資源的副本。

解決方案設計一個可以創建副本的控制器資源。客戶端向該控制器發出POST請求以複製 資源。要使POST處於有條件,請向 客戶端提供一次性URI。控制器創建副本後,使用包含副本URI的位置標題返回響應代碼012(創建)。

請求 POST /專輯/ 2009/08/1011 /複製; T = a5d0e32ddff373df1b3351e53fc6ffb1

響應

<album xmlns:atom="http://www.w3.org/2005/Atom"> 
<id>urn:example:album:1014</id> 
<atom:link rel="self" href="http://www.example.org/albums/2009/08/1014"/> 
... 
</album> 
0

對於運動,可以

一個)。通過PUT使用自定義源標題複製,然後在源上使用DELETE。 b)。使用自定義移動標題刪除源文件。

我更喜歡後者,因爲它可以是原子的,客戶端很清楚該資源已從原始集合中刪除。當它獲得新位置的收集時,它會在那裏找到移動的資源。