文档章节

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

coder_life
 coder_life
发布于 2015/12/30 09:06
字数 567
阅读 29
收藏 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
博文 15
码字总数 3772
作品 0
闵行
程序员
上传文件到亚马逊云盘报12030(ERROR_WINHTTP_CONNECTION_ERROR)

我用winhttp协议,和亚马逊提供的网盘开发者接口写的上传文件示例,在上传小文件时,能正常上传,上传大文件时,在WinHttpWriteData处报12030错误,求大神提供解决方法。 示例代码如下: //...

Instance
2016/02/16
274
0
jupyter notebook的通信

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

gg5d
2017/12/03
0
0
解决MSN无法登录问题的意外收获

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

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

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

Mahabharata_
2017/06/22
0
0
Qt开发的UDP接收端

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

伊甸流云
2016/12/12
76
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
39分钟前
0
0
java大数据转换16进制转10进制

public static void main(String[] args) {String hex = "0xdbf3accc683297cf0000";BigInteger amount = new BigInteger(hex.substring(2), 16);System.out.println(amount);......

任梁荣
昨天
2
0
OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @真Skr小机灵鬼儿:8.13分享Jocelyn Pook/Russian Red的单曲《Loving Strangers》 《Loving Strangers》- Jocelyn Pook/Russian Red 手机党少...

小小编辑
昨天
9
3
TypeScript基础入门 - 函数 - 剩余参数

转载 TypeScript基础入门 - 函数 - 剩余参数 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.1 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
昨天
1
0
OpenCV边缘检测算子原理总结及实现

1. 拉普拉斯算子 原理:是一种基于图像导数运算的高通线性滤波器。它通过二阶导数来度量图像函数的曲率。 拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。一个二维图像函数的拉...

漫步当下
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部