2009-10-20 35 views
1

我正在通過以POST數據的形式將XML發送到我的Web服務器來聯繫我的一個站點的腳本中設置後端API。這個腳本將被許多人使用,我想限制那些在沒有正確訪問密鑰的情況下意外開啓功能的人員帶寬浪費。發送POST數據到不接受發佈數據的服務器是否會收到數據?

我會拒絕沒有正確訪問密鑰的請求,可能會生成403訪問代碼。

可以說POST數據是~500kb的數據。無論狀態碼如何,服務器都會收到所有500kb的數據嗎?

如果我讓url包含密鑰mydomain/api/123456789並在所有壞訪問密鑰上生成403狀態,那麼如何?

POST數據在最終發送數據之前是否仍然發送/接收,無論是否協商過。

在此先感謝!

回答

2

一般來說,整個請求將會發送,包括髮布數據。應用程序層通常沒有辦法像403一樣返回響應,直到它收到整個請求。

實際上,它將取決於所使用的語言/框架以及它與HTTP服務器的關聯程度。 Section 8.2.2 of RFC2616 HTTP/1.1 specification有這說

的HTTP/1.1(或更高版本)客戶端發送 消息正文應監測錯誤狀態 的 網絡連接,而它在發送該請求。 如果客戶端看到錯誤狀態,它應該立即停止傳輸 身體。如果正在使用「分塊」編碼(部分 3.6)發送主體 ,則可以使用零長度塊和空尾部提前 標記消息結束。如果 正文前面有Content-Length 標題,則客戶端必須關閉 連接。

因此,如果您可以找到與HTTP服務器(例如mod_perl)緊密鏈接的語言environemnt,則可以按照符合標準的方式進行操作。

您可以採取的另一種方法是進行初始較小的請求以獲取用於較大POST的URL。然後,應用程序可以拒絕向沒有適當密鑰的客戶端提供URL。

+2

根據用於讀取實際請求的實際框架nd編寫回復,從技術上來說,可以設想只讀取請求標頭,驗證訪問,如果拒絕,則發送立即回覆回覆並關閉連接,而無需閱讀實際的帖子數據 –

+0

的確如此,我已經加強了答案,以表明可以做到這一點,並符合HTTP/1.1標準 –

+0

謝謝你們!這真的幫助。 – sanbornm

0

這裏是關於REST Web服務,在那裏它解釋瞭如何HTTP的偉大工程的書:http://oreilly.com/catalog/9780596529260

你可以考慮爲信封,其中在它的上面它是寫地址(URL)的任何請求,一些屬性(HTTP頭),裏面有一些數據(如果請求是通過post方法啓動的)。所以你可能猜測你不能收到一部分信封。

哦,我忘記了,它是當你使用帶有標準HTTP頭「application/x-www-form-urlencoded」的HTTP Post時,但是如果你正在上傳文件(相應地使用「multipart/form-data」)Django給出您可以使用中間件類來控制流式傳輸的文件塊:http://docs.djangoproject.com/en/dev/topics/http/middleware/