IWinHttpRequest 请求数据ResponseText有时中断有时正常

在vc++使用IWinHttpRequest-Post请求数据时,ResponseText属性时常会中断。

img

img

以下是代码:


string FetchPost2(const char *hUrl, const char *rParam, const char *body, const char *refer)
{
    string tmp = "";
    string temp = "";
    string line = "";
    string hName = "";
    string hVal = "";
    int index = 0;
    bool flag = false;

    //以单线程创建初始化com对象
    CoInitialize(NULL);
    IWinHttpRequest *win = NULL;

    //根据给定的程序标识符从注册表找出对应的类识别符
    CLSID clsid = { 0 };
    HRESULT hr = CLSIDFromProgID(L"WinHttp.WinHttpRequest.5.1", &clsid);
    if (FAILED(hr))
        return tmp;

    //用指定的类标识符创建一个com对象
    hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, __uuidof(IWinHttpRequest), (LPVOID *)&win);
    if (FAILED(hr))
        return tmp;

    //拼接链接
    char rLink[MAX_SIZE]{0};
    strcpy(rLink, hUrl);
    strcat(rLink, rParam);

    //打开http连接
    hr = win->Open("POST", rLink);
    if (FAILED(hr))
        return tmp;


    //添加请求头
    temp = refer;
    while (!flag){
        index = temp.find("\r\n");
        if (index<0 || index>temp.length())
            flag = true;
        line = temp.substr(0, index);
        temp = temp.substr(index + 2);

        index = line.find(":");
        hName = line.substr(0, index);
        hVal = line.substr(index + 1);

        hr = win->SetRequestHeader(hName.c_str(), hVal.c_str());
        if (FAILED(hr))
            break;
    }

    //发送请求
    hr = win->Send(body);
    if (FAILED(hr))
        return tmp;


    //接收返回数据并进行相应转码
    _bstr_t Rtn =win->ResponseText;
    const char *buf = Rtn;
    string strRtn = buf;
    ConvertANSIToUTF8(strRtn, buf);

    win->Release();
    //关闭当前线程的com
    CoUninitialize();

    return strRtn;
}

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。