2015-10-16 60 views
2

我期待實現一個允許上傳文件的RESTful HTTP API。在客戶端生成並上傳文件之前,服務器需要決定是否需要新文件。此外,上傳應該可以重定向到另一臺服務器,第二步的語義會更容易。上傳可重定向PUT文件的RESTful設計是什麼?

到目前爲止,我想出了以下的想法:

  • 客戶POST文本數據s到基於該服務器決定下一個文件是否需要生成並上傳
  • 如果/files不,服務器響應429 Too Many RequestsRetry-After
  • 如果是,服務器響應201 CreatedLocation的頭部告訴客戶端文件的URL
  • 然後客戶端然後繼續生成該文件,並PUT它在URL

這是一種有效的方法?我最不確定的是201 Created是否合適。它建議創建一個資源,但它是真的,因爲它是空的而且無效嗎? GET ting它不會再給404 Not Found,但405 Method Not Allowed(因爲只有PUT是),所以在這個意義上它的資源存在。如果在一段時間內沒有文件PUT,則服務器可能會過期並給出404 Not Found,或者可能是410 Gone。正式的資源創建意味着什麼?

我也算202 Accepted,因爲處理還沒有完成,但接下來的處理是在這種情況下需要做的就是通過執行請求而不是服務器的客戶端;因此我不確定這是否合適 - 它不應該等待任何可用的東西;它應該着手自行提供。然後是204 No Content,它可能比201 Created稍好,因爲除了Location標題之外沒有其他東西被返回,但它與資源存在意義相同的概念問題。

另一種選擇是讓API發生的事情非常明確,通過重命名/files到像/file-upload-url-generator並返回一個URL作爲實際內容(與200 OK)。不過,我並不樂意失去統一性和設計更復雜(使用Location標題看起來不錯)。

+0

所以,爲了確保我能理解,客戶端會打到服務器上的端點來檢查文件是否有必要。您的服務器基本上會說「是」或「否」。如果答案爲「是」,客戶需要創建一個文件,然後將其發送給完全不同的API? – Ellesedil

+0

@Ellesedil服務器說「不」或「是,到這個位置」。它是不同的API取決於API的定義。它可能是同一臺服務器或不同的服務器。只要使用返回的URL,所使用的服務器就會支持PUT,並且應該使用簡單的HTTP 200或204狀態代碼來響應該服務器。沒有更多的語義。 –

+0

爲什麼'GET'在文件被'PUT'後不允許? – Opal

回答

1

201的問題是,它必須包含體 - 不僅要符合REST但是對於客戶端庫的兼容性或者 - 一些客戶端庫拋出一個異常,如果響應標有201不包含任何數據。但它的資源是否有效的意義201是很好的響應代碼。資源已創建,狀態無關緊要。

202看起來有些尷尬,因爲正如您指出的那樣 - 它表示服務器端處理而不是客戶端。

就我個人而言,我會爲204提供第一個端點以及上述Location標題。回覆很明確:資源已經創建,可以在這裏找到。第二個端點可能只回復PUT請求並作出適當反應。

+0

很高興知道我的計劃至少有一定意義。而且我並不知道客戶端庫會因此而癱瘓。 –