2012-06-10 43 views
9

本週早些時候,我不得不做一些感覺像違反語義的東西。讓我解釋。HTTP GET和POST語義和限制

我正在製作一個簡單的AJAX客戶端應用程序,該應用程序向具有給定數量參數的服務發出請求。由於整個應用程序基本上是隻讀的,我認爲使用HTTP GET是一種方式。我必須通過的一些參數很簡單(例如排序順序或頁碼)。

但是,其中一個必需的參數可能是可變長度的,這讓我擔心。由於我在GET請求的查詢字符串中對所有參數進行了編碼,因此在我看來,這放置了不必要的upper limit of (roughly) 2000 characters for the request URL。無論如何,我不喜歡看到500個字符長的請求URL。

因此,由於POST請求沒有這樣的限制,我決定切換。但是這並不正確。我的印象是POST表示數據的修改 - 但我將其用於簡單的只讀請求。

有沒有更好的方法來做到這一點?使用許多參數執行GET?我聽說過一種方法 - 你自己執行參數的初步POST,然後執行GET。但是,這種技術還有很多不足之處。

但是看看這個特定的案例,什麼是HTTP請求方法的真正的語義和限制?爲什麼GET不支持任何類型的參數有效載荷?在URL中使用查詢字符串幾乎感覺像對我來說是一個黑客。

+0

爲什麼你覺得這個post表示數據修改? –

+1

@ConradFrix:因爲它用於提交表單,上傳文件和[一般非冪等動作。](http://en.wikipedia.org/wiki/POST_(HTTP)#Affecting_server_state) – voithos

+0

如果你是編寫一個Ajax應用程序,爲什麼你關心什麼URL長度?另請注意,2000字符限制僅適用於瀏覽器URL,而不適用於Ajax請求(正如您對提供的鏈接的評論中所述)。 –

回答

12

在這個問題上的幾點:

  • HTTP規範(RFC 2616)不forbit GET請求有參數,所以它不是HTTP GET本身的語義的問題。但是,許多HTTP堆棧(針對客戶端,服務或代理)禁止HTTP請求中的實體,但您不能使用它們的事實大多是一個實現細節(相當普遍),而不是HTTP GET請求的語義問題
  • 同樣,RFC(或查詢字符串)長度的限制也未在RFC上指定。它主要是由幾個HTTP服務器堆棧實施的安全緩解措施,以防止不良客戶端佔用服務器資源(例如,在IIS/ASP.NET中默認限制爲2k,但可以通過web.config中的某些元素增加它)。再一次,這不是一個語義問題,而是一個實際問題。
  • 如果您遵循REST原理,POST請求確實會指示數據修改,但有許多用於只讀操作的HTTP POST請求示例。 SOAP在其所有請求中都使用POST,而不管它所調用的操作是「安全」操作還是「修改」操作。所以你也可以使用POST進行這些操作。但是,通過偏離REST(以及「典型」HTTP)用法,您將失去協議的某些功能,例如可用於GET請求的緩存,但不適用於POST。
  • 你使用兩個請求(POST參數+ GET來「獲取」結果)的例子看起來過分了。正如我所提到的,POST請求不一定意味着修改資源,所以當一個請求足夠時,您不必創建新的「協議」(POST + GET)來訪問您的操作。
+2

+1不錯的答案,另一個重要的觀點:GET應該是冪等的,所以它可以(並且)被客戶端自動重試,POST永遠不會被重試。 –