2017-07-13 30 views
1

我們在查詢字符串中創建了一個HTTP GET請求,其中包含大量數據,表示要檢索的所有集合的ID。查詢字符串中包含許多項目的HTTP GET請求

關於在網址的查詢字符串的長度的限制,一個快速谷歌搜索說:

RFC 3986還規定沒有限制,但表示主機名是 限制在255個字符,因爲的DNS限制(第2.3.3節)。 微軟指出,在Internet Explorer URL的最大長度爲2,083個字符,在路徑不超過2,048個字符 的URL.May 1的一部分,2009年

如果我們不使用IE瀏覽器,我應該擔心可能超出查詢字符串長度的限制嗎? 我確定我看到了我的Node.js Express服務器超出了限制,特別是當我在GET請求的查詢字符串中包含表示圖像的base64字符串時。

什麼是解決此問題的好方法?我們應該使用HTTP POST請求嗎?當然,我們不想將1個GET請求分解成1000個,只是爲了避免這個問題。

+0

結果與鉻金絲雀,我們達到了一個URL的長度限制相當快(絕對沒有接近無限長度的任何東西)。 –

+0

似乎最好的辦法是找到一種方法來查詢不會爲每個文檔/行更改的字段上的集合。因此,而不是每行唯一的id,可以通過一些共享id進行搜索,以便識別您希望檢索的集合的子集。 –

+0

https://stackoverflow.com/questions/14202257/design-restful-query-api-with-a-long-list-of-query-parameters,https://stackoverflow.com/questions/4203686/how-can -i-deal-with-http-get-query-string-length-limitation-and-still-want-to-b,https://stackoverflow.com/questions/5020704/how-to-design-restful-search - 過濾,https://stackoverflow.com/questions/207477/restful-url-design-for-search – CodeCaster

回答

2

在REST風格的Web服務中,GET檢索數據。 POST請求在服務器上創建數據並且沒有大小限制,但服務器通常具有可以更改的默認限制。

如果維護一個RESTful應用程序不適用於您的情況,那麼您可以使用POST。

需要注意GET請求可以被緩存,但POST請求不能,所以如果你得到很多(相同)數據作爲回報,你應該使用GET。

0

我要說的是,如果你有GET要求,其長度超過比它聞起來像什麼是錯的設計(我不能找到一個很好的理由通過GET以base64而不是POST傳遞的圖像如你所說)。 我寧願在該場景中使用POST;也搜索約2048字符限制似乎它並不真正適用,請參閱firefox and Chrome,我不會依賴這個約會信息microsoft ie,here a more detailed analysis

您也可以考慮爲參數名稱和值實現一個字符串縮寫器,但在我看來,可讀性更重要。看看如何在javascript中縮短參數的問題this

4

如果你打算保持你的API清潔和RESTful,你可以將你的請求分成兩部分。第一個將您的配置發送到服務器進行計算(POST);第二個會收集結果(GET)。

此方法除了克服瀏覽器,防火牆,路由器等HTTP GET的限制外,還具有多種優點。例如,您可以稍後引入部分結果輪詢或取消長時間運行計算的可能性。此外,您可以保持網址簡短和用戶可讀。

實現細節已經被描述here

0

來自IE applies to both GET and POST requests的限制,所以首先,POST請求將不會完全解決您的問題。

對於瀏覽器,there's no universal limit,每個瀏覽器實現不同的限制,帶來不同的後果。

此外,除了網頁瀏覽器的限制外,服務器還可以有其自己的限制,可以是默認設置或設置(例如Apache's LimitRequestLine Directive)。

此外,處理數據(PHP例如可以爲每個腳本存儲器限制)時存儲器的問題可能是一個障礙,和PHP在Apache也有一個可配置post_max_size指令。

一般而言,有關此主題的共識將限制您的GET請求長度最多爲2000個字符,或者使用POST請求(儘管也有限制)。

我的建議:截斷您的請求併發送多個請求,這些請求由服務器存儲並在請求帶有最終標記時處理,這可能是一種可能的解決方案。此外,字符串壓縮庫的存在可以幫助您壓縮和解壓縮大型數據,例如,參見LZW compression,其中有幾十種編程語言。