2010-04-17 50 views
2

假設我正在通過POST HTTP請求上傳大文件。HTTP POST prarameters order/REST urls

我們還要說,我有另一個參數(文件除外),用於命名文件正在更新的資源。

該資源不能成爲URL的一部分,您可以使用REST(例如foo.com/bar/123)來完成此操作。假設這是由於技術和政治原因的綜合。

如果資源名稱無效或者IP地址和/或登錄用戶無權更新資源,服務器需要忽略該文件。如果資源參數在POST請求中首先出現,可以輕鬆完成此操作。

看起來,如果這個POST來自一個HTML表單,其中包含大多數(所有?)瀏覽器的資源名稱第一個和文件字段第二個,則此順序將保留在POST請求中。但是,完全依靠這個想法是天真的,不是嗎?

換句話說,HTTP參數的順序是微不足道的,客戶端可以以任意順序自由構建POST。這不正確嗎?

這意味着,至少在理論上,服務器可能會在它拒絕請求之前最終存儲整個大文件。

在我看來,這是一個明顯的例子,RESTful網址具有優勢,因爲您不必查看POST內容就可以對請求執行某些授權/錯誤檢查。

你同意嗎?你有什麼想法和經驗?

更多評論請!在我看來,每個大文件上傳(或任何文件上傳)的人都應該考慮這個問題。

回答

2

你不能依賴POST變量的順序。尤其是在提交/發佈表單時,您不能相信表單數組的順序是正確的。如果想要保存帶寬,可能需要在發佈實際數據之前在其他地方檢查憑證等。

+0

客戶端驗證?來吧。這也不可靠。 我的觀點是,我得出結論,這隻能用REST有效解決。你同意嗎? – 2010-04-18 00:14:28

+0

不是客戶端驗證,而是在使用表單獲取到html頁面之前對用戶進行驗證。比如說,您首先使用授權數據執行一個請求,將其保存在一個cookie中,然後用實際內容做另一個請求。下面的方法也很好。 – Timo 2010-04-18 15:00:20

+0

我明白了。你提出兩個請求。一個獲取資源的cookie,一個發佈資源。是的,這將工作,但是,男孩,什麼是人爲的解決方案!將它與REST的優雅進行比較。 – 2010-04-18 16:52:17

1

我只是在請求的查詢字符串中插入你需要的任何變量。

在客戶端,

<form action="/yourhandler?user=0&resource=name" method="post"> 
<input type="file" name="upload" /></form> 

獲取你

POST /yourhandler?user=0&resource=name HTTP/1.1 
Content-Type: multipart/form-data; boundary=----- 
... 

----- 
Content-Disposition: form-data; name="upload"; filename="somebigfile.txt" 
Content-Type: text/plain 

... 

在服務器上,你則可以上傳完成前檢查查詢字符串,並在必要時將其關閉。 (這與REST或多或少相同,但基於您在技術上和政治上可以使用的內容,可能更容易實現。)

您的其他選項可能是使用cookie來存儲該數據,但當用戶禁用cookies時,這顯然會失敗。您可能也可以使用Authorization標題。

+0

這聽起來比其他評論更好。但它仍然聽起來很駭人聽聞。它應該基本上工作,但我很緊張,它可能會混淆某些框架,試圖爲您自動化事情。而且,它沒有REST那麼優雅。 – 2010-04-18 16:52:47

-1

你應該在你的用例中提供更多的背景知識。到目前爲止,我看不出任何理由,爲什麼你不應該簡單地將大型實體放到你打算創建或更新的資源上。

 
PUT /documents/some-doc-name 
Content-Type: text/plain 

[many bytes of text data] 

爲什麼你認爲這不是你的情況下可能的解決方案?

Jan

+0

「這個資源不可能不是URL的一部分,你可以使用REST來實現它(例如foo.com/bar/123)。假設這是由於技術和政治原因的綜合。」 – 2010-04-18 22:52:51

+0

我確實讀過:-)但我懷疑這確實是一項要求。因此我請你解釋背景。由於技術或政治原因,無法將部分資源標識移入請求實體。 – 2010-04-19 06:30:39