Http
说明
HTTP(超文本传输协议)是应用层的协议,用于从万维网服务器传输网页到本地浏览器。在HTTP通信过程中,客户端(如浏览器)和服务器之间不仅传输请求的内容(如GET或POST请求中的数据),还会交换一些控制信息,这些控制信息就是通过HTTP请求头(HEAD)和特定的请求方法(如OPTIONS)来实现的。
Http 请求方法
HEAD
HEAD方法是一种类似于GET请求的方法,但服务器在响应时只返回HTTP头部信息,并不返回请求的实体内容。这使得客户端可以检查资源的存在、类型、大小等元信息,而无需传输整个内容。HEAD请求常用于以下场景:
- 验证资源:检查文件是否存在,或者比较本地缓存的资源与服务器上的是否一致,而无需下载整个资源。
- 获取资源元数据:获取如Content-Type、Content-Length、Last-Modified等头部信息,以便决定如何进一步处理资源。
- 节省带宽:特别是当客户端只需确认资源属性,而不需要实际内容时。
OPTIONS
OPTIONS方法是一个请求,用于获取目标URL所支持的所有HTTP方法(如GET、POST、PUT等)以及其它通信选项。它允许客户端查询服务器支持哪些功能,而不需要实际执行任何操作。OPTIONS请求主要用于以下几个目的:
- ** CORS预检请求**:当进行跨域资源共享(CORS)时,浏览器会自动发送一个OPTIONS请求作为“预检”请求,以确认实际请求是否安全可接受。服务器通过响应告知浏览器允许的请求方法、来源等。
- 发现服务功能:开发者可以使用OPTIONS请求来了解服务器端点支持哪些HTTP方法,这对于自动化的API探索工具或客户端库非常有用。
- 测试服务器可达性:虽然不如HEAD或GET直接,OPTIONS请求也可以作为一种轻量级的方式来检测服务器的可达性和响应性。
GET
Delete
POST
PUT
- Get 与 Delete 参数都在 URL 中
- POST 与 Put 参数可以在 URL 中,也可以在 body 中
GET 与 POST 对比
- 多数浏览器对于 POST 采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于 GET),也就是第一步发送 header 数据,第二步再发送 body 部分。HTTP 是应用层的协议,而在传输层有些情况 TCP 会出现两次连结的过程,HTTP 协议本身不保存状态信息,一次请求一次响应。对于 TCP 而言,通信次数越多反而靠性越低,能在一次连结中传输完需要的消息是最可靠的,尽量使用 GET 请求来减少网络耗时。如果通信时间增加,这段时间客户端与服务器端一直保持连接状态,在服务器侧负载可能会增加,可靠性会下降
GET 请求能够被 cache
,GET 请求能够被保存在浏览器的浏览历史里面(密码等重要数据 GET 提交,别人查看历史记录,就可以直接看到这些私密数据)POST 不进行缓存
- GET 参数是带在 URL 后面,传统 IE 中 URL 的最大可用长度为 2048 字符,其他浏览器对 URL 长度限制实现上有所不同。POST 请求无长度限制(目前理论上是这样的)
- GET 提交的数据大小,不同浏览器的限制不同,一般在 2k-8K 之间,POST 提交数据比较大,大小靠服务器的设定值限制,而且某些数据只能用 POST 方法「携带」,比如 file
- 全部用 POST 不是十分合理,最好先把请求按功能和场景分下类,对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的 2k 范围内,这样的情况使用 GET。其他地方使用 POST
- GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「幂等」的,在这一点上,GET 被认为是「安全的」。但实际上 server 端也可以用作资源更新,但是这种用法违反了约定,容易造成 CSRF(跨站请求伪造)
问题
POST 大小限制
理论上讲,POST 是没有大小限制的
HTTP 协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力
Tomcat 默认限制 POST 最大 2M
conf 目录,打开
server.xml
文件1
2
3
4
5
6
7
8
9<Connector connectionTimeout="20000"
port="8000"
protocol="HTTP/1.1"
maxPostSize="20485760"
URIEncoding="UTF-8"
redirectPort="8443"
acceptCount="500"
maxThreads="500"/>
# maxPostSize="20485760" 表示POST 最大 20MB; maxPostSize="0" (设为 0 是取消 POST 的大小限制)
URL 长度限制问题
参考
https://www.jianshu.com/p/512389822f8b
小结
- HTTP 协议未规定 GET 和 POST 的长度限制
- 不管是 Get 还是 Post,URL 长度限制是因为浏览器和 web 服务器限制了 URI 的长度
- 不同的浏览器和 WEB 服务器,限制的最大长度不一样
- 限制的是整个 URI 长度,而不仅仅是你的参数值数据长度
- 如果超出了最大长度,大部分的服务器直接截断,也有一些服务器会报 414 错误
- Get 请求参数都在 URL 中;POST 参数可以在 URL 中,也可以在 Body 中
浏览器
IE
2083(2K+53),超过这个限制,则自动截断(若是 form 提交则提交按钮不起作用)
firefox
长度限制为 65 536 字符,但实际上有效的 URL 最大长度不少于 100,000 个字符
Chrome
超过 8182 个字符返回错误
服务器
Apache
Apache 能接受 url 长度限制为 8192 字符
IIS
Microsoft Internet Information Server (IIS) 能接受 url 长度限制为 16 384 个字符。
这个是可以通过修改的(IIS7)configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryStringsetting.<requestLimits maxQueryString="length"/>
Nginx
可以通过修改配置来改变 url 请求串的 url 长度限制
client_header_buffer_size 默认值:client_header_buffer_size 1k
large_client_header_buffers 默认值 :large_client_header_buffers 4 4k/8k
由于 jsonp 跨域请求只能通过 get 请求,url 长度根据浏览器及服务器的不同而有不同限制。
若要支持 IE 的话,url 长度限制为 2083 字符,若是中文字符的话只有 2083/9=231 个字符。
若是 Chrome 浏览器支持的最大中文字符只有 8182/9=909 个。Tomcat
conf 目录,打开
server.xml
文件默认最大 8K
1
2
3
4
5
6
7
8
9
10<Connector connectionTimeout="20000"
port="8000"
protocol="HTTP/1.1"
maxPostSize="20485760"
maxHttpHeaderSize="65536"
URIEncoding="UTF-8"
redirectPort="8443"
acceptCount="500"
maxThreads="500"/>
# maxHttpHeaderSize="65536" 表示URL 最大 64Kb