libcurl的使用问题之Expect: 100-continue
更新日期:
文章目录
当使用libcurl的POST方式时,如果POST数据的大小大于1024个字节,libcurl不会直接发送POST请求,而是会分为两步执行请求:
- 发送一个请求,该请求头部包含一个Expect: 100-continue的字段,用来询问server是否愿意接受数据
- 当接收到从server返回的100-continue的应答后,它才会真正的发起POST请求,将数据发送给server。
对于“100-continue”这个字段
- RFC文档
- 它可以让客户端在发送请求数据之前去判断服务器是否愿意接收该数据,如果服务器愿意接收,客户端才会真正发送数据,这么做的原因是如果客户端直接发送请求数据,但是服务器又将该请求拒绝的话,这种行为将带来很大的资源开销。所以为了避免这种情况,libcurl在发送大于1024字节的POST请求时采用了这种方法,但是相对的,它会引起请求延迟的加大,另外并不是所有的server都会正确处理并且应答”100-continue“,比如lighttpd,就会返回417”Expectation Failed“,造成请求逻辑出错。
如果确定服务器不会拒绝1024个字节以上的POST请求,就可以不使用该方法而且也可以避免以上提到的两个副作用,解决的办法如下:
1 | struct curl_slist * headers = NULL; |