libcurl发起post请求时间延迟问题。except为空即可

最近在做团购酒店APP分享到qzone功能,使用libcurl访问qzone的分享cgi接口,酒店分享信息以POST方式传输,在测试的时候发现分享接口平均有2s的延迟,这延迟也太大了吧,于是乎问了空间的接口人,答曰:怎么可能,这个接口的平均调用时延是100-200ms,肯定是你的代码有问题。好吧,开始检查代码,使用strace -p跟踪系统调用,发现curl发送了两次请求,其中第一次请求的响应特别的慢,额,原来这个才是导致延迟的罪魁祸首,tcpdump之后发现curl发送的第一个请求包含一个Expect: 100-continue的头,这是为什么呢,于是开始百度,google,得到的解释如下:

当使用libcurl的POST方式时,如果POST数据的大小大于1024个字节,libcurl不会直接发送POST请求,而是会分为两步执行请求:
1、发送一个请求,该请求头部包含一个Expect: 100-continue的字段,用来询问server是否愿意接受数据
2、当接收到从server返回的100-continue的应答后,它才会真正的发起POST请求,将数据发送给server。

对于“100-continue"这个字段,RFC文档(http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3)是这么解释的:它可以让客户端在发送请求数据之前去判断服务器是否愿意接收该数据,如果服务器愿意接收,客户端才会真正发送数据,这么做的原因是如果客户端直接发送请求数据,但是服务器又将该请求拒绝的话,这种行为将带来很大的资源开销。所以为了避免这种情况,libcurl在发送大于1024字节的POST请求时采用了这种方法,但是相对的,它会引起请求延迟的加大,另外并不是所有的server都会正确处理并且应答”100-continue“,比如lighttpd,就会返回417”Expectation Failed“,造成请求逻辑出错。

如果确定服务器不会拒绝1024个字节以上的POST请求,就可以不使用该方法而且也可以避免以上提到的两个副作用,解决的办法如下:

  1. // disable Expection header
  2. curl_easy_setopt(curl, CURLOPT_HTTPHEADER, array(‘Expect:‘));

禁用该机制后,测试了一下qzone分享接口平均调用时延减小到了200ms,这才是正常的延时嘛,嘿嘿。
参考资料:
http://www.laruence.com/2011/01/20/1840.html

from:http://blog.csdn.net/zxgfa/article/details/7604624

时间: 2024-12-13 06:41:05

libcurl发起post请求时间延迟问题。except为空即可的相关文章

用curl发起https请求

使用curl发起https请求 使用curl如果想发起的https请求正常的话有2种做法: 方法一.设定为不验证证书和host. 在执行curl_exec()之前.设置option $ch = curl_init(); ...... curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 方法二.设定一个正确的证书. 本地ssl判别证书太旧,导致链接报错ssl

C#的百度地图开发(一)发起HTTP请求

百度地图的开发文档中给出了很多的事例,而当用到具体的语言来开发时,又会有些差异.我是使用C#来开发的.在获取相应的数据时,需要通过URL传值,然后获取相应的返回值(这一点很多平台的开发都是如此:比如微信的企业号).所以我们第一步要解决的就是如何发起URL请求. 如果是在前端,我们可以很轻易的发起URL请求,就是在浏览器的地址栏中输入URL即可,那么在C#的后台要如何发起请求呢?来看下面的代码: [csharp] view plaincopy /// <summary> /// 向指定URL发起

发起https请求并获取结果

/**     * 发起https请求并获取结果     *      * @param requestUrl     *            请求地址     * @param requestMethod     *            请求方式     * @param outputStr     *            请求数据     * @return     * @throws Exception     */    public static String MsgHttpsR

接入支付宝支付接口(一):发起支付请求

一.前言 在接入支付宝接口之前,需要在支付宝官网进行应用注册和实名认证,地址不再贴出. 在此,贴出支付宝开放平台文档地址:https://docs.open.alipay.com/58/103585/ 在这个地址中,详细介绍了如何接入支付宝接口 二.发起请求 支付宝的签名方式等不做详细介绍,在开发文档中有详细说明,笔者建议:编码格式请使用UTF-8. 接下来的介绍中,主要贴出代码(代码仅供参考) 在贴出代码之前,首先大致了解一下如何发起支付请求: 第一步:组装阿里参数 该步骤组装的参数来自于商户

发起post请求

scrapy发起post请求的两种方式 一定要对start_requests方法进行重写 1.Request方法中给method属性复制成post 2.FormRequest()进行post请求的发送 方法1(不建议使用): import scrapy class PostexampleSpider(scrapy.Spider): name = 'postexample' # allowed_domains = ['www.baidu.com'] start_urls = ['https://w

使用 HttpRequester 更方便的发起 HTTP 请求

原文:使用 HttpRequester 更方便的发起 HTTP 请求 使用 HttpRequester 更方便的发起 HTTP 请求 Intro 一直感觉 .net 里面(这里主要说的是 .net framework 下)发送 HTTP 请求的方式用着不是特别好用,而且在 .net framework 里发送 HTTP 请求的方式有好几种,如:WebClient/WebRequest/HttpClient,于是自己封装了一个?HttpRequester WebClient 主要是用来下载,不能对

curl 请求https内容,返回空

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$api); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//禁止直接显示获取的内容 重要 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不验证证书下同 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // $json = curl_exec($ch);

使用libcurl提交POST请求

最近在学习libcurl,并利用它提交POST请求,可是返回的响应总是无从验证该次POST请求是否成功提交了. 1. 先看下根据firebug提交的一次成功的请求,这里以login我喜欢上的xiami为例,嘻嘻~ 1.1 本次POST请求的HTTP交互 1.2 POST 1.3 经server端redirect的GET 2. OK,接下来看下使用libcurl向xiami发送POST请求 2.1 使用libcurl的大概流程curl_easy_init()curl_easy_setopt()cu

C/C++中用libcurl进行http请求,向ES中插入数据

#include <stdio.h> #include <curl/curl.h> int Insert(long arg1, long arg2, long arg3, long arg4, const char* arg5) { CURL *curl; CURLcode res; //const char* str = "{\"time\":\"1542852001\",\"total\":\"10