文档章节

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

coder_life
 coder_life
发布于 2015/12/30 09:06
字数 567
阅读 189
收藏 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
粉丝 2
博文 17
码字总数 3772
作品 0
闵行
程序员
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.6K
8
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.3K
3
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
708
1
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.9K
1
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22

没有更多内容

加载失败,请刷新页面

加载更多

Subversion存储库中“分支”,“标记”和“主干”的含义是什么?

问题: I've seen these words a lot around Subversion (and I guess general repository) discussions. 我已经在Subversion(我猜通用存储库)讨论中看到了很多这样的话。 I have been us......

富含淀粉
今天
5
0
《Java8实战》笔记(03):Lambda表达式

本文源码 Lambda 管中窥豹 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。 Lambda表达...

巨輪
今天
7
0
从其他文件夹导入文件 - Importing files from different folder

问题: I have the following folder structure. 我有以下文件夹结构。 application/app/folder/file.py and I want to import some functions from file.py in another Python file which r......

javail
今天
22
0
大数据研发学习之路--Hadoop集群搭建

阅读编译文档 准备一个hadoop源码包,我选择的hadoop版本是:hadoop-2.7.7-src.tar.gz,在hadoop-2.7.7的源码 包的根目录下有一个文档叫做BUILDING.txt,这其中说明了编译hadoop所需要的一些...

DSJ-shitou
今天
8
0
OSChina 周五乱弹 —— 特么是别的公司派来的特洛伊木马吧?

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐:《我会守在这里》- 毛不易 《我会守在这里》- 毛不易 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :股市连跪了五天,...

小小编辑
今天
77
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部