curl 在项目中使用频率较高,比如内部接口、第三方 api、图片存储服务等,但是我们在使用 curl 时可能并没有注意到 Expect 这个请求头信息,而 Expect 设置不正确,会导致不必要的一次 HTTP 请求,甚至可能会导致业务逻辑错误。
问题
在不设置 Expect 头信息使用 curl 发送 POST 请求时,如果 POST 数据大于 1kb,curl 默认行为 如下:
- 先追加一个
Expect: 100-continue
请求头信息,发送这个不包含 POST 数据的请求; - 如果服务器返回的响应头信息中包含
Expect: 100-continue
,则表示 Server 愿意接受数据,这时才 POST 真正数据给 Server;
通过 tcpdump 工具抓包 curl 客户端网络请求。查看 HTTP 请求响应头以及数据:
|
请求信息内容:
|
响应信息:
|
可见此时,curl 发送了一次不必要的 HTTP 请求,从系统性能上来说这是不允许的。另外,并不是所有的 Server 都会正确响应100-continue
,反而会返回417 Expectation Failed
,curl 端不会发起数据 POST 请求,则会造成业务逻辑错误,我们应该避免这种情况的发生。
解决办法
如果查看过一些开源类库(guzzle、qq第三方api,不过 solarium 并未支持),你就会发现他们在 curl 时已经注意到并解决这个问题了,只需 设置 Expect 请求头为空 即可。
|
再次 tcpdump 抓包,发现使用 curl 发送超过 1kb 的 POST 数据时,也并未出现 100-continue 的 HTTP 请求。
- 本文作者: 樊浩柏科学院
- 本文链接: https://www.fanhaobai.com/2017/08/curl-expect-continue.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,转载请注明出处!