1. 程式人生 > >http get 方式引數的長度限制

http get 方式引數的長度限制

這個問題一直以來似乎是被N多人誤解,其實Http Get方法提交的資料大小長度並沒有限制,而是IE瀏覽器本身對位址列URL長度有最大長度限制:2048個字元。

當您從 WinInet 應用程式到 Web 伺服器傳送一個長的查詢字串時,查詢字串可能會被截斷。

出現此問題是由於中 WinInet,定義 Wininet.h 檔案中,如下所示的 URL 的長度限制:

[cpp] view plaincopyprint?
  1. #define INTERNET_MAX_PATH_LENGTH        2048
  2. #define INTERNET_MAX_SCHEME_LENGTH      32          // longest protocol name length
  3. #define INTERNET_MAX_URL_LENGTH         (INTERNET_MAX_SCHEME_LENGTH + sizeof("://") + INTERNET_MAX_PATH_LENGTH)


此行為是設計使然。

注意: 因為 Internet Explorer 和 Internet 傳輸的控制也使用 WinInet,可能會出現相同的問題。

若要解決此問題,使用 HTTP POST 方法。

Microsoft Internet Explorer has a maximum uniform resource locator (URL) length of 2,083 characters. Internet Explorer also has a maximum path length of 2,048 characters. This limit applies to both POST request and GET request URLs. ‘>以下附上微軟官方的一段說明:

Microsoft Internet Explorer has a maximum uniform resource locator (URL) length of 2,083 characters. Internet Explorer also has a maximum path length of 2,048 characters. This limit applies to both POST request and GET request URLs. ‘>Microsoft Internet Explorer has a maximum uniform resource locator (URL) length of 2,083 characters. Internet Explorer also has a maximum path length of 2,048 characters. This limit applies to both POST request and GET request URLs.

If you are using the GET method, you are limited to a maximum of 2,048 characters, minus the number of characters in the actual path.

However, the POST method is not limited by the size of the URL for submitting name/value pairs. These pairs are transferred in the header and not in the URL. ‘>However, the POST method is not limited by the size of the URL for submitting name/value pairs. These pairs are transferred in the header and not in the URL.

RFC 2616, “Hypertext Transfer Protocol — HTTP/1.1,” does not specify any requirement for URL length.

 

其他文章內容摘要:

最近一直在做Web相關的專案,熟悉Web開發的人都知道,我們經常需要通過URL來傳遞引數,即所謂的“GET”方法,還有一種是“POST”,兩種方法都用的很多。其中,GET方法適合引數資料量比較小的情況,GET方法比較直觀,通過URL就能大概知道回傳了哪些引數。POST適合向伺服器回傳大量的資料,沒有GET方法直觀。以前我大概看過,通過URL回傳引數有個長度限制,當時我看的是1024位元組,由於以前做的專案,引數較少,基本不可能超過1024,所以我也沒有仔細研究過到底是不是1024位元組。最近這個專案,由於引數較多,已經超過1024了,顯然我要考慮URL能夠接收的最大長度了,在網上搜了一下,得到了準確答案:HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制。IE對URL長度的限制是2083位元組(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於作業系統的支援。[參考http://support.microsoft.com/kb/q208427/]。我這就放心,2083位元組應該是夠用了,呵呵。至於POST方法,可以參考如下這篇文章的介紹。

——————————————————————————————————————————————

表單Post&Get兩個長度限制問題的分析

一、問題起因 在某專案釋放後Bug統計的附件《釋放後問題》裡有: 
問題 原因 分析 備註
CSV處理時,如果處理的主題數過多,發生URL引數上限的錯誤; 可變長度的引數通過URL方式傳遞,會造成這種潛在的錯誤發生。 1、屬於2次發生問題,開發方面沒有及時通過checklist等方式向組員傳達相關注意事項;
2、測試時沒有作大批量資料的測試;
1、作為經驗新增至CheckList中,加強組內共享、檢查的效果;
2、加強測試點是否完備的檢查,重點關注對開發方面共性問題的測試;
通過對模組原有GUI狀況確認,進行CSV輸出時,輸出結果很大的場合,CSV檔案的內容不能輸出。 沒有考慮到POST資料量存在128K的大小限制。 這屬於新問題,以前從未遇見過,也沒有進行過大規模的資料量測試 已將此類檢查列出CheckList中
做為一種經驗積累,這些問題、原因及解決辦法將被列入Checklist,那麼: 第一個問題:URL引數上限的提法準確嗎?上限是多少? 第二個問題:為什麼POST時資料有限制?限制是128K嗎?  二、問題分析 1、第一個: 1)URL不存在引數上限的說法。該問題實際是IE對URL有長度限制的問題。 2)HTTP協議規範也沒有對URL長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制。IE對URL長度的限制是2083位元組(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於作業系統的支援。[參1] 3)“可變長度的引數通過URL方式傳遞”實際是說提交表單時使用了GET方法,而不是POST方法。造成這種潛在錯誤的是使用GET方法提交表單資料。因為GET方法將資料放在URL裡傳遞給伺服器處理。 4)注意這個限制是整個URL長度,而不僅僅是你的引數值資料長度。 5)既然是IE對URL長度的限制,那麼不管是GET方法還是POST方法都存在這個限制。 (關於FORM的GET和POST方法具體內容請參考相關資料[參2])  建議: 1)瞭解應用程式所在的環境,如Web應用的瀏覽器、伺服器環境,瞭解其特定的引數限制情況。 2)提交複雜資料儘量使用POST方法。注意FORM不寫method屬性時預設是使用GET方法。 結論(寫入Checklist): 對使用GET方法提交資料時,在IE環境下,需要考慮URL長度2083位元組的限制。  2、第二個: 1)理論上講,POST是沒有大小限制的。HTTP協議規範也沒有進行大小限制。 2)“POST資料量存在128K的大小限制”不夠準確,POST資料是沒有限制的,起限制作用的是伺服器的處理程式的處理能力。 3)對於ASP程式,Request物件處理每個表單域時存在100K的資料長度限制。但如果使用Request.BinaryRead則沒有這個限制。對於需要處理超過100K表單域資料的解決辦法,請參考後面的[參3]。 4)由這個延伸出去,對於IIS 6.0,微軟出於安全考慮,加大了限制[參4]。我們還需要注意:      IIS 6.0預設ASP POST資料量最大為200KB,每個表單域限制是100KB。      IIS 6.0預設上傳檔案的最大大小是4MB。      IIS 6.0預設最大請求頭是16KB。      IIS 6.0之前沒有這些限制。 建議: 1)弄清楚執行環境的預設設定值有助於你的設計及對出現的問題做快速的解決。 2)應該考慮伺服器版本。各個版本的IIS對這些引數的預設設定都不一樣,有必要的話,找資料整理出一份對照表。這樣開發與測試時都有個參考。 3)IIS 6.0的這些限制實際只是它的預設設定值而已,實際應用環境你可以修改它們。      在WINNT\system32\inetsrv\MetaBase.xml裡預設定義了:
         AspBufferingLimit="4194304"            對應於上傳檔案最大大小
         AspMaxRequestEntityAllowed="204800"     對應於POST最大資料量
         ... 結論(寫入Checklist): 使用ASP時,需要考慮POST表單每個域一般讀取處理時有100KB的限制。充分考慮是否使用Request.Binary。