文档章节

qt中使用winhttp发送服务端请求

coder_life
 coder_life
发布于 2015/12/30 09:06
字数 567
阅读 34
收藏 0
/**

 * @brief HttpClient::HttpRequest

 * 发送服务器请求

 * @param url

 * @param header

 * @param data

 * @param type

 * @param timeout

 * @return

 */

QJsonObject HttpClient::HttpRequest(QString url,QString header, QByteArray data,QString type,int timeout)

{

    QJsonObject resultJson;//{"state":"false";"message"="errormsg"}

    resultJson["state"]=true;

    HINTERNET hSession = 0;

    HINTERNET hConnect = 0;

    HINTERNET hRequest = 0;

    WinHttpUrl winHttpUrl((LPCWSTR)url.constData());

    const char* strPostData= data.data();

    try{

        hSession = winHttpUrl.OpenSession(L"");

        if (hSession == NULL) {

            resultJson["state"]=false;

            resultJson["message"]="Error:Open session!";

        }

        hConnect = winHttpUrl.Connect(hSession, winHttpUrl.GetHostName(), winHttpUrl.GetPort());

        if (hConnect == NULL) {

            resultJson["state"]=false;

            resultJson["message"]="Error:Connect failed!";

        }

        if(type.isEmpty()){

            type="POST";

        }

        hRequest = winHttpUrl.OpenRequest(hConnect, (LPCWSTR)type.constData(), winHttpUrl.GetAllPath(), winHttpUrl.GetScheme());

        if (hRequest == NULL) {

            resultJson["state"]=false;

            resultJson["message"]="Error:OpenRequest failed!";

        }

        if(header.isEmpty()){

            header="content-type:application/octet-stream";

        }

        //header="Content-Length:"+QString::number(data.toStdString().length())+"\r\n"+header;

        //qDebug()<<header;

        if (!winHttpUrl.AddRequestHeaders(hRequest, (LPCWSTR)header.constData())) {

            resultJson["state"]=false;

            resultJson["message"]="Error:AddRequestHeaders failed!";

        }

        if(!winHttpUrl.SetTimeouts(hRequest,timeout*1000)){

            resultJson["state"]=false;

            resultJson["message"]="Error:SetTimeouts failed";

        }

        if (!winHttpUrl.SendRequest(hRequest, strPostData, data.length())) {

            resultJson["state"]=false;

            resultJson["message"]="Error:SendRequest failed!";

        }


        if (!winHttpUrl.EndRequest(hRequest)) {

            resultJson["state"]=false;

            resultJson["message"]="Error:EndRequest failed!";

        }

        if(resultJson["state"].toBool()){

            char szBuf[BUF_SIZE];

            DWORD dwSize = 0;

            szBuf[0] = 0;

            dwSize = BUF_SIZE;


            for (;;) {

                dwSize = BUF_SIZE;

                if (winHttpUrl.ReadData(hRequest, szBuf, dwSize, &dwSize) == FALSE) {

                    break;

                }

                if (dwSize <= 0) {

                    break;

                }

                szBuf[dwSize] = 0;

                resultJson["state"]=true;

                resultJson["message"]=szBuf;


            }

        }

    }

    catch (EXCEPTION_DEBUG_INFO e)

    {

        resultJson["state"]=false;

        resultJson["message"]="ERROR:winhttp Exception";

    }

    winHttpUrl.CloseInternetHandle(hRequest);

    winHttpUrl.CloseInternetHandle(hConnect);

    winHttpUrl.CloseInternetHandle(hSession);

    return resultJson;

}


/**
 * 下载文件
 * @brief HttpClient::DownLoadFile
 * @param Url
 * @return
 */
bool HttpClient::DownLoadFile(QString url,QString savePath)
{
    bool resultFlag=false;
    HINTERNET hSession = 0;
    HINTERNET hConnect = 0;
    HINTERNET hRequest = 0;

    WinHttpUrl winHttpUrl((LPCWSTR)url.constData());
    BYTE *pBuffer = NULL;
    DWORD dwReadBytes, dwSizeDW = sizeof(dwSizeDW), dwContentSize, dwIndex = 0;
    try{
        hSession = winHttpUrl.OpenSession(L"winhttp by joyinwise");
        if (hSession == NULL) {
            qDebug()<<"Error:Open session!";
        }
        hConnect = winHttpUrl.Connect(hSession, winHttpUrl.GetHostName(), winHttpUrl.GetPort());
        if (hConnect == NULL) {
            qDebug()<<"Error:Connect failed!";
        }
        // 创建一个请求,先查询内容的大小
        hRequest = WinHttpOpenRequest(hConnect, L"HEAD",winHttpUrl.GetAllPath(), L"HTTP/1.1", WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_REFRESH);
        WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
        WinHttpReceiveResponse(hRequest, 0);
        WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_CONTENT_LENGTH|WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwContentSize, &dwSizeDW, &dwIndex);
        WinHttpCloseHandle(hRequest);
        // 创建一个请求,获取数据
        hRequest = WinHttpOpenRequest(hConnect, L"GET", winHttpUrl.GetAllPath(), L"HTTP/1.1", WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_REFRESH);
        WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
        WinHttpReceiveResponse(hRequest, 0);
        pBuffer = new BYTE[dwContentSize];
        ZeroMemory(pBuffer, dwContentSize);
        WinHttpReadData(hRequest, pBuffer, dwContentSize, &dwReadBytes);
        //写入文件
        HANDLE hFile = CreateFileW((LPCWSTR)savePath.constData(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        WriteFile(hFile, pBuffer, dwContentSize, &dwReadBytes, NULL);
        CloseHandle(hFile);
        resultFlag=true;
    }
    catch(QString e){
        resultFlag=false;
        qDebug()<<e;
    }

    delete pBuffer;

    winHttpUrl.CloseInternetHandle(hRequest);
    winHttpUrl.CloseInternetHandle(hConnect);
    winHttpUrl.CloseInternetHandle(hSession);
    return resultFlag;
}


//调用示例
QJsonDocument doc;
            doc.setObject(reqParam);
            QByteArray byte_array = doc.toJson(QJsonDocument::Compact);
            //设置请求头
            QString headerStr="Content-Length:"+QString::number(byte_array.length())+"\r\n";
            headerStr+="Cache-Control:no-cache\r\n";
            headerStr+="content-type:application/json\r\n";
            headerStr+=AppProperty::userLoginInfo->PARAM_Token.toLocal8Bit()+":"+AppProperty::userLoginInfo->getToken().toLocal8Bit()+"\r\n";
            QJsonObject reply=HttpClient::HttpRequest(ActionURL::URL_API_HOST+"/"+interfaceName,headerStr,byte_array,"",20);

//下载
bool downloadResult = HttpFileDownloder::DownLoadFile(apk_url,downDBFileName.replace(".db",".zip"))


© 著作权归作者所有

共有 人打赏支持
coder_life
粉丝 1
博文 16
码字总数 3772
作品 0
闵行
程序员
【SylixOS】QT-QWS流程介绍

QWS简介 QWS(QT Windows System)是QT自行开发的窗口系统,体系结构类似X Windows的C/S结构。QWS Server在物理设备上显示,QWS Client实现界面,两者通过socket进行彼此的通讯。在很多嵌入式系...

suokin
09/26
0
0
jupyter notebook的通信

提示用户输入一段代码,当用户输入以后执行。这种模式经常被称为REPL(交互式开发环境),或者Read-Eval-Print-Loop(读取﹣求值﹣输出循环). IPython 内核 所有其它接口,包括Notebook,Qt控制...

gg5d
2017/12/03
0
0
Qt开发的UDP接收端

上一篇已经说完了简单UDP发送端开发,参见我的博客:Qt开发的UDP发送端。 博文地址:https://my.oschina.net/marshal2bit/blog/803803 做完UDP发送端,我又尝试做了一个UDP接收端。先上图,做...

伊甸流云
2016/12/12
76
0
解决MSN无法登录问题的意外收获

解决MSN无法登录问题的意外收获 最近在运维过程中,遇到了两个历史悠久而且截然不同的疑难问题。但巧合的是,两个问题殊途同归,最后居然使用了同样的解决方法。为了庆祝送别这两个问题,也为...

yuelei
2011/04/29
0
0
[Qt] 基于Tcp协议的聊天室实现

时间:2017年6月21日 一、写在前面: 平时做图形学的东西多一些,虽然一直对网络编程很感兴趣,但是没有什么机会去尝试一下。最近正好赶上期末的课程实习,然后就参考Qt官方的 Network Prog...

Mahabharata_
2017/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

cacti监控安装

cacti是用PHP实现的一个软件,它用snmp服务获取数据,然后用rrdtool存储和更新数据,并生成图表展示。比较适合用于交换机、路由器的网络监控,插件众多,可图示化显示网络状况。 cacti官方推...

hiwill
10分钟前
0
0
shell特殊符号、cut、sort、uniq、wc、tee、tr、split命令

10月15日任务 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下 cut 命令 cut作用:截取字符串 用法如下:cat /etc/passwd |head -2 |cut -d ...

hhpuppy
39分钟前
1
0
Springboot实现filter拦截token验证和跨域

背景 web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需要引入其...

funnymin
今天
3
0
linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部