我期待實現一個允許上傳文件的RESTful HTTP API。在客戶端生成並上傳文件之前,服務器需要決定是否需要新文件。此外,上傳應該可以重定向到另一臺服務器,第二步的語義會更容易。上傳可重定向PUT文件的RESTful設計是什麼?
到目前爲止,我想出了以下的想法:
- 客戶
POST
文本數據s到基於該服務器決定下一個文件是否需要生成並上傳 - 如果
/files
不,服務器響應429 Too Many Requests
和Retry-After
頭 - 如果是,服務器響應
201 Created
和Location
的頭部告訴客戶端文件的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
標題看起來不錯)。
所以,爲了確保我能理解,客戶端會打到服務器上的端點來檢查文件是否有必要。您的服務器基本上會說「是」或「否」。如果答案爲「是」,客戶需要創建一個文件,然後將其發送給完全不同的API? – Ellesedil
@Ellesedil服務器說「不」或「是,到這個位置」。它是不同的API取決於API的定義。它可能是同一臺服務器或不同的服務器。只要使用返回的URL,所使用的服務器就會支持PUT,並且應該使用簡單的HTTP 200或204狀態代碼來響應該服務器。沒有更多的語義。 –
爲什麼'GET'在文件被'PUT'後不允許? – Opal