- 积分
- 40165
- 好友
- 记录
- 主题
- 帖子
- 听众
- 收听
|
发表于 2016-11-17 08:34:33
|
显示全部楼层
小知识
Expect请求头部域,用于指出客户端要求的特殊服务器行为。若服务器不能理解或者满足
Expect域中的任何期望值,则必须返回417(Expectation Failed)状态,或者如果请求
有其他问题,返回4xx状态。
这个头部域使用可扩展语法定义,以方便将来扩展。如果服务器收到包含Expect头部域的
请求且包含一个它不支持的期望值扩展,则必须返回417(Expectation Failed)状态。
期望值的比较,对于非引用符号(包括100-continue)是大小写无关的,对于引用字符串
的期望值扩展,则是大小写敏感的。
Expect域的机制是逐跳进行的,也就是说如果一个代理服务器收到包含不能满足的期望
的请求时,必须返回417(Expectation Failed)状态。而Expect请求头部域自身,
却是端到端的,如果请求被转发,则它也必须被转发。
很多旧的HTTP/1.0和HTTP/1.1应用不支持Expect头部。
到这里,基本明白了为什么会出现这样的错误,说明代码最后生成的HTTP请求,包含了服务器不能处理的Expect头部,到底是什么?装上Wireshark,监听一下请求内容,发现出现异常时的请求中的Expect头部是这样的:Expect:100-Continue,难道是它引起的?继续查……
对于Expect:100-Continue,HttpClient的官方文档是这样描述的:
The purpose of the Expect: 100-Continue handshake is to allow the client that
is sending a request message with a request body to determine if the origin
server is willing to accept the request (based on the request headers) before
the client sends the request body.
Expect: 100-continue handshake should be used with caution, as it may cause
problems with HTTP servers and proxies that do not support HTTP/1.1 protocol.
大意如下:
Expect:100-Continue握手的目的,是为了允许客户端在发送请求内容之前,判断源服务器是否愿意接受
请求(基于请求头部)。
Expect:100-Continue握手需谨慎使用,因为遇到不支持HTTP/1.1协议的服务器或者代理时会引起问题。
而HttpClient 4.0中,是否激活Expect:100-Continue,是由HTTP请求执行参数http.protocol.expect-continue来控制的,通过设置参数值为true或者false,可以相应的激活或者关闭Expect:100-Continue握手。注意,在HttpClient中,默认是激活的 |
|