关于httpget/post请求参数长度最大值的一个理解误区(转载)

author author     2022-09-20     624

关键词:

1. Get方法长度限制

Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。下面就是对各种浏览器和服务器的最大处理能力做一些说明.

浏览器/服务器说明
Microsoft Internet Explorer  IE浏览器对URL的最大限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。  
Firefox 对于Firefox浏览器URL的长度限制为65,536个字符
Safari URL最大长度限制为 80,000个字符
Opera URL最大长度限制为190,000个字符
Google chrome URL最大长度限制为8182个字符
Apache Server 能接受最大url长度为8,192个字符
IIS 能接受最大url的长度为16,384个字符

 

通过上面的数据可知,为了让所有的用户都能正常浏览, URL最好不要超过IE的最大长度限制(2083个字符),当然,如果URL不直接提供给用户,而是提供给程序调用,这时的长度就只受Web服务器影响了。
注:对于中文的传递,最终会为urlencode后的编码形式进行传递,如果浏览器的编码为UTF8的话,一个汉字最终编码后的字符长度为9个字符。

因此如果使用的 GET 方法,最大长度等于URL最大长度减去实际路径中的字符数。

2.POST方法长度限制

理论上讲,POST是没有大小限制的。HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力。

如:在Tomcat下取消POST大小的限制(Tomcat默认2M);

打开tomcat目录下的conf目录,打开server.xml 文件,修改 

<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="8080"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="GBK"
> 
</Connector>

增加红色字体部分 maxPostSize="0" (设为0是取消POST的大小限制)

 

刚看到群里又有同学在说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过XX,而 Post 是无限制的,看到这里,我想他们定是看多了一些以讹传讹的博客或者书籍,导致一种理解上的误区:

1、首先即使有长度限制,也是限制的是整个 URI 长度,而不仅仅是你的参数值数据长度。

2、HTTP 协议从未规定 GET/POST 的请求长度限制是多少。

The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET-based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15). 
 Note: Servers ought to be cautious about depending on URI lengths above 255 bytes, because some older client or proxy implementations might not properly support these lengths.

3、所谓的请求长度限制是由浏览器和 web 服务器决定和设置的,各种浏览器和 web 服务器的设定均不一样,这依赖于各个浏览器厂家的规定或者可以根据 web 服务器的处理能力来设定。

The limit is in MSIE and Safari about 2KB, in Opera about 4KB and in Firefox about 8KB, (255 bytes if we count very old browsers) . We may thus assume that 8KB is the maximum possible length and that 2KB is a more affordable length to rely on at the server side and that 255 bytes is the safest length to assume that the entire URL will come in.
If the limit is exceeded in either the browser or the server, most will just truncate the characters outside the limit without any warning. Some servers however may send a HTTP 414 error. If you need to send large data, then better use POST instead of GET. Its limit is much higher, but more dependent on the server used than the client. Usually up to around 2GB is allowed by the average webserver. This is also configureable somewhere in the server settings. The average server will display a server-specific error/exception when the POST limit is exceeded, usually as HTTP 500 error.
HTTP 1.1 defines Status Code 414 Request-URI Too Long for the cases where a server-defined limit is reached. You can see further details on RFC 2616. For the case of client-defined limits, there is no sense on the server returning something, because the server won‘t receive the request at all.
The server is refusing to service the request because the Request-URI is longer than the server is willing to interpret. This rare condition is only likely to occur when a client has improperly converted a POST request to a GET request with long query information, when the client has descended into a URI "black hole" of redirection (e.g., a redirected URI prefix that points to a suffix of itself), or when the server is under attack by a client attempting to exploit security holes present in some servers using fixed-length buffers for reading or manipulating the Request-URI.

 

附 GET VS POST:

1、多数浏览器对于POST采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于GET),也就是第一步发送header数据,第二步再发送body部分。HTTP是应用层的协议,而在传输层有些情况TCP会出现两次连结的过程,HTTP协议本身不保存状态信息,一次请求一次响应。对于TCP而言,通信次数越多反而靠性越低,能在一次连结中传输完需要的消息是最可靠的,尽量使用GET请求来减少网络耗时。如果通信时间增加,这段时间客户端与服务器端一直保持连接状态,在服务器侧负载可能会增加,可靠性会下降。

Tips:关于这点你可以参考:Yahoo网站性能优化指南之服务器篇

http://segmentfault.com/a/1190000000353790

http://developer.yahoo.com/performance/rules.html

http://blogread.cn/it/article/6100?f=wb    YSLOW法则中,为什么yahoo推荐用GET代替POST?

上面这篇文章介绍了 wireshark 抓包验证 post 两次发包,get 一次发包的全过程,推荐阅读。

2、GET请求能够被cache,GET请求能够被保存在浏览器的浏览历史里面(密码等重要数据GET提交,别人查看历史记录,就可以直接看到这些私密数据)POST不进行缓存。

3、GET参数是带在URL后面,传统IE中URL的最大可用长度为2048字符,其他浏览器对URL长度限制实现上有所不同。POST请求无长度限制(目前理论上是这样的)。

4、GET提交的数据大小,不同浏览器的限制不同,一般在2k-8K之间,POST提交数据比较大,大小靠服务器的设定值限制,而且某些数据只能用 POST 方法「携带」,比如 file。

5、全部用POST不是十分合理,最好先把请求按功能和场景分下类,对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的2k范围内,这样的情况使用GET。其他地方使用POST。

6、GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「幂等」的,在这一点上,GET 被认为是「安全的」。但实际上 server 端也可以用作资源更新,但是这种用法违反了约定,容易造成 CSRF(跨站请求伪造)。

REF:

maximum length of HTTP GET request?

http://stackoverflow.com/questions/2659952/maximum-length-of-http-get-request  

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.15 Request-URI Too Long

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.1 General Syntax

http://www.cnblogs.com/xiaotaomaomao/articles/986070.html

http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解

post方式相比get安全,携带数据更大,我准备所有数据都用post方式获取,这样好吗?

http://segmentfault.com/q/1010000000213082  

http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html   浅谈CSRF攻击方式

linux命令发送httpget/post请求

https://www.cnblogs.com/kaleidoscope/p/9719841.htmlGet请求curl命令模拟Get请求:1、使用curl命令:1234curl "http://www.baidu.com"  如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地curl-i "http://www.baidu.com"  查看详情

curl命令模拟httpget/post请求

在对后端程序进行测试的时候,需要进行模拟连接或者书写测试脚本.curl是一个很棒的命令.例如目标网站Url:127.0.0.1:8080/check_your_status?user=Summer&passwd=12345678通过Get方法请求:curlprotocol://address:port/url?argscurlhttp://127.0.0.1:8080/check_your 查看详情

三个例子—java发送httpget/post请求,调用http接口方法(代码片段)

三个例子—JAVA发送httpget/post请求,调用http接口、方法例1:使用HttpClientimportjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.InputStream;importorg.apache.commons. 查看详情

httpget|post|delete请求(代码片段)

依赖:<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.10.0</version></dependency>Example:publicclassMQHttpClient/***GET|POST|DELETE**@paramparamsMapifnullandtherequestisGet,otherwisedependentonrequest... 查看详情

get/post请求参数长度的最大值

1.Get方法长度限制HttpGet方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。下面就是对各种浏览器和服务器的最大处理能力做一些说明.浏览器/服务器 说明Mi... 查看详情

检查待处理的 AJAX 请求或 HTTP GET/POST 请求

】检查待处理的AJAX请求或HTTPGET/POST请求【英文标题】:CheckPendingAJAXrequestsorHTTPGET/POSTrequest【发布时间】:2011-03-1619:17:00【问题描述】:如何检查页面是否有待处理的AJAX或HTTPGET/POST请求?我使用javascript和/或python进行此检查。如... 查看详情

为啥 Angular 6 不发送 HTTP Get/Post 请求?

】为啥Angular6不发送HTTPGet/Post请求?【英文标题】:WhyAngular6doesn\'tsendHTTPGet/Postrequests?为什么Angular6不发送HTTPGet/Post请求?【发布时间】:2018-08-0507:45:07【问题描述】:我在Angular6中有以下服务:@Injectable()exportclassLoginServiceconstructo... 查看详情

关于postman使用上发现的一点问题

之前后台用的java,一直用的postman测试接口数据,之前不管是get、post、delete、put请求都是在param传递的数据,java下面是没问题可以测试的。但是今天自己写Node发现post请求postman的数据放在param下面是无法把数据传到后台的研究了... 查看详情

捕获“超出最大请求长度”

】捕获“超出最大请求长度”【英文标题】:Catching"Maximumrequestlengthexceeded"【发布时间】:2009-03-2009:23:08【问题描述】:我正在编写一个上传函数,但在捕获“System.Web.HttpException:超过最大请求长度”时遇到问题,文件大... 查看详情

关于前端存储

cookie前言网络早期最大的问题之一是如何管理状态。简而言之,服务器无法知道两个请求是否来自同一个浏览器。当时最简单的方法是在请求时,在页面中插入一些参数,并在下一个请求中传回参数。这需要使用包含参数的隐藏... 查看详情

超出最大请求长度

】超出最大请求长度【英文标题】:Maximumrequestlengthexceeded【发布时间】:2019-12-1809:50:12【问题描述】:我收到最大请求长度超出错误,尝试从站点下载文件(在asp.net中开发)。我确实尝试了下面链接中建议的解决方案Maximumreques... 查看详情

如何解决“超出最大请求长度”异常?

】如何解决“超出最大请求长度”异常?【英文标题】:HowdoIresolvethe"maximumrequestlengthexceeded"exception?【发布时间】:2010-09-0813:23:18【问题描述】:当我上传图片时出现此错误:超过最大请求长度我该如何解决这个问题?【... 查看详情

uSQL 超出最大请求长度

】uSQL超出最大请求长度【英文标题】:uSQLMaximumRequestLengthExceeded【发布时间】:2018-08-0113:56:31【问题描述】:我正在尝试将大量不同的文件折叠成统一的布局。我将大约3k个文件折叠到40个主题区域。我最初的设计是40个作业,每... 查看详情

HTTP GET 请求的最大长度

】HTTPGET请求的最大长度【英文标题】:MaximumlengthofHTTPGETrequest【发布时间】:2011-02-0905:42:43【问题描述】:是多少?如果服务器接收到超过此长度的GET请求,是否定义了响应错误可以/应该返回?这是在Web服务API的上下文中,尽... 查看详情

get请求有大小限制?别再执迷不悟了!

...的就是get有长度限制,1024B。时至今日,好尴尬!Http的get请求方法提交的数据大小长度并没有限制,Http协议规范没有对URL长度进行限制。目前说的get长度有限制,是特定的浏览器及服务器对它的限制。各种浏览器和服务器的最... 查看详情

WebApi 2 超出最大请求长度

】WebApi2超出最大请求长度【英文标题】:WebApi2Maximumrequestlengthexceeded【发布时间】:2015-10-0418:27:40【问题描述】:有谁知道是否有办法捕捉到这个错误?基本上我正在尝试实现一些功能,以允许用户将文件从网页上传到webapi控制... 查看详情

如何从 MongoDB 集合中存在的一组文档中找到数组的最大长度?

】如何从MongoDB集合中存在的一组文档中找到数组的最大长度?【英文标题】:HowtofindthemaxlengthofanarrayfromasetofdocumentspresentinacollectioninMongoDB?【发布时间】:2021-08-0416:07:50【问题描述】:我在MongoDB的集合中存在\'n\'个文档。这些文... 查看详情

jmeter请求元件之jmeterrequest发送get请求和post请求

...址:http://v.juhe.cn/laohuangli/d返回格式:json/xml请求方式:httpget/post请求示例:http://v.juhe.cn/laohuangli/d?date=2014-09-11&key=您申请的KEY接口备 查看详情