昨天晚上在对接接口时,发现偶尔会拿不到响应信息,造成请求超时。再三检查后发现不是代码问题。于是打印了请求参数。发现大部分拿不到响应信息的数据都很长。于是想到了这个问题。在请求头上加了’Expect:'后果然解决了这个问题。
$headers = [
'Authorization:' . $this->token, 'Expect:'
];
于是研究了一下Except:的用法,在curl POST请求的时候,curl不会直接发送POST请求,而是分为了两个步骤,
- 发送一个请求, 包含一个Expect:100-continue, 询问Server是否愿意接受数据
- 接收到Server返回的100-continue应答以后, 才把数据POST给Server
但是不是所有的服务器都会应答100-continue, 比如lighttpd。另外还会造成延时,发送第一次的Expect:100-continue时,需要等待Server进行回答之后才发送request body。
如果确定服务器不会拒绝1024k数据的POST请求时,就可以不使用该方法而且也可以避免以上提到的两个问题,解决的办法就是文章开头提到的。
关于100-continue的问题:
HTTP/1.1 协议里设计 100 (Continue) HTTP 状态码的的目的是,在客户端发送 Request Message 之前,HTTP/1.1 协议允许客户端先判定服务器是否愿意接受客户端发来的消息主体(基于 Request Headers)。
即, 客户端 在 Post(较大)数据到服务端之前,允许双方“握手”,如果匹配上了,Client 才开始发送(较大)数据。
这么做的原因是,如果客户端直接发送请求数据,但是服务器又将该请求拒绝的话,这种行为将带来很大的资源开销。
链接: https://blog.csdn.net/skh2015java/article/details/88723028
.