winhttp是windows网络库,要测试自己写的post请求是否有效,首先得在postman上面建立一个可用的接口。我的如下。

代码思路如下:

1、首先使用WinHttpCrackUrl拆解链接,后面会使用到拆解出来的信息。

2、再使用WinHttpOpen初始化

3、WinHttpSetTimeouts设置超时,这一步可有可无。

4、WinHttpConnect链接到目标,这里就需要使用拆解出来的信息了

5、WinHttpOpenRequest创建一个http请求

6、WinHttpAddRequestHeaders这里添加请求头,需要注意的是请求头类型需要和postman中的头相对应。

7、WinHttpSendRequest发送请求

8、WinHttpReceiveResponse收取回答

9、WinHttpQueryDataAvailable、WinHttpReadData查询读取回复

整个winhttp的post请求就是这么简单

注:const wchar_t *wzUrl 表示链接地址

std::string &cstrRecv 表示获取到的回复

DWORD dwMaxSize回复的最大长度

std::string data表示发送参数

bool PostWebData ( const wchar_t *wzUrl , std::string &cstrRecv , DWORD dwMaxSize, std::string data)
{
    cstrRecv.clear();
    HINTERNET hSession     = NULL , hConnect = NULL , hRequest = NULL;
    PVOID     pTempBuf     = NULL;
    DWORD     dwDownloaded = 0 ,    dwTotalDownloaded = 0;
    DWORD     dwSize       = 0;
    DWORD     dwTotal      = 0;
    DWORD     dwFlag       = 0;

URL_COMPONENTS urlComp    = {0};
    urlComp.dwStructSize      = sizeof(urlComp);
    urlComp.dwSchemeLength    = -1;
    urlComp.dwHostNameLength  = -1;
    urlComp.dwUrlPathLength   = -1;
    urlComp.dwExtraInfoLength = -1;

std::string sendData = data;
    const void* ss       = (const char*)sendData.c_str();

if ( !WinHttpCrackUrl(wzUrl , wcslen(wzUrl) , 0 , &urlComp) )
        return false;

hSession = WinHttpOpen ( L"User-Agent" ,
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY , 
        WINHTTP_NO_PROXY_NAME ,
        WINHTTP_NO_PROXY_BYPASS ,
        0 );
    if ( hSession == NULL )
    {
        return false;
    }

WinHttpSetTimeouts( hSession, 20000 , 20000 , 0 , 0 );

std::wstring wstrHostName = urlComp.lpszHostName;
    wstrHostName = wstrHostName.substr ( 0 , urlComp.dwHostNameLength );
    hConnect = WinHttpConnect ( hSession , wstrHostName.c_str() , urlComp.nPort , 0 );
    if ( hConnect == NULL )
    {
        goto Failed1;
    }

if ( urlComp.nPort == INTERNET_DEFAULT_HTTPS_PORT )
    {
        dwFlag = WINHTTP_FLAG_SECURE;
    }
    else
    {
        dwFlag = 0;
    }

hRequest = WinHttpOpenRequest ( hConnect ,
        L"POST" ,
        urlComp.lpszUrlPath ,
        L"HTTP/1.1" ,
        WINHTTP_NO_REFERER ,
        WINHTTP_DEFAULT_ACCEPT_TYPES , 
        dwFlag );
    if ( hRequest == NULL )
    {
        goto Failed2;
    }

LPCWSTR header = L"Content-type: application/x-www-form-urlencoded\r\n";
    SIZE_T  len    = lstrlenW(header);
    WinHttpAddRequestHeaders(hRequest,header,DWORD(len), WINHTTP_ADDREQ_FLAG_ADD);
    if(!hRequest)
        goto Failed3;

if ( !WinHttpSendRequest(hRequest, 0, 0,const_cast<void *>(ss),sendData.length(), sendData.length(), 0 ) )
    {
        goto Failed3;
    }

if ( !WinHttpReceiveResponse(hRequest , NULL) )
    {
        goto Failed3;
    }

do
    {
        dwSize = 0;
        if ( !WinHttpQueryDataAvailable(hRequest, &dwSize) )
        {
            goto Failed3;
        }

if ( dwSize == 0 )
            break;

dwTotal += dwSize;
        if ( dwTotal >= dwMaxSize )
        {
            goto Failed3;
        }

pTempBuf = calloc ( 1 , dwSize + 16 );
        if ( pTempBuf == NULL ) 
        {
            goto Failed3;
        }

if ( !WinHttpReadData(hRequest , (PVOID)((UINT64)pTempBuf) , dwSize , &dwDownloaded) )
        {
            free ( pTempBuf );
            goto Failed3;
        }

if ( dwDownloaded == 0 )
        {
            free ( pTempBuf );
            break;
        }

cstrRecv += (char*)pTempBuf;
        free ( pTempBuf );        
        dwTotalDownloaded += dwDownloaded;
    } while (dwSize > 0);

WinHttpCloseHandle ( hRequest );
    WinHttpCloseHandle ( hConnect );
    WinHttpCloseHandle ( hSession );
    return true;

Failed3:
    WinHttpCloseHandle ( hRequest );
Failed2:
    WinHttpCloseHandle ( hConnect );
Failed1:
    WinHttpCloseHandle ( hSession );
    return false;

}

使用c++ winhttp实现post请求相关推荐

  1. C++编程笔记:使用WinHTTP实现HTTP访问(解决接收UTF8数据乱码问题)

    实现HTTP访问的流程包括以下几步:  1, 首先我们打开一个Session获得一个HINTERNET session句柄:  2, 然后我们使用这个session句柄与服务器连接得到一个HINTER ...

  2. WinInet 和 WinHttp 有何区别?

    自制工具   翰华Box:https://hanhuabox.lanzous.com/b00zjq9uf 翰华Box - 开发日志:https://blog.csdn.net/qq_41517936/ ...

  3. C++ winhttp 实现文件下载器

    本篇内容讲述 C++ winHttp 实现下载器的简单 demo,使用了 WinHttpOpen.WinHttpConnect.WinHttpOpenRequest.WinHttpSendReques ...

  4. Fiddler大师之路系列(一)

    江湖传言,Fiddler是捕获客户端与服务器之间的所有HTTP(S) 请求的利器,但是在具体使用过程中,发现使用Fiddler进行抓包时有一部分请求总是没到,多方苦寻之下发现客户端使用WinINET这 ...

  5. VB6 调用HttpsAPI请求(WinHttp.WinHttpRequest)

    VB6客户端中如何访问Https的API请求呢? 使用WinHttp组件里的WinHttpRequest对象可以解决我们的问题. 1.引用"Microsoft WinHTTP Service ...

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

    2019独角兽企业重金招聘Python工程师标准>>> /** * @brief HttpClient::HttpRequest * 发送服务器请求 * @param url * @ ...

  7. VisualFreeBasic通过WinHttp.dll实现Http/Https请求

    VisualFreeBasic中自带了Http请求的操作,自带了三个函数Http_Get.Http_Post.Http_Upload. 'GET方法获取网页 'URL:字符串,目标域名或者IP地址+, ...

  8. winhttp 请求头加上Accept-Encoding: deflate, gzip后该如何解压,不加会出现不可识别的乱码

    hRequest = OpenRequest(hConnect, L"GET" ..... //自动判断gzip,如果压缩了,就会自动解压     DWORD dwOption = ...

  9. 实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现

    在<使用WinHttp接口实现HTTP协议Get.Post和文件上传功能>一文中,我已经比较详细地讲解了如何使用WinHttp接口实现各种协议.在最近的代码梳理中,我觉得Post和文件上传 ...

  10. 使用WinHttp接口实现HTTP协议Get、Post和文件上传功能

    我实现了一个最新版本的接口,详见<实现HTTP协议Get.Post和文件上传功能--使用WinHttp接口实现>.还有基于libcurl实现的版本<实现HTTP协议Get.Post和 ...

最新文章

  1. 作为一名合格的前端开发工程师需要会哪些
  2. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...
  3. Android源码解析(一)动画篇-- Animator属性动画系统
  4. flutter 图片转base64_京东技术中台的Flutter实践之路
  5. mpvue 微信小程序_使用Vue.js开发微信小程序:开源框架mpvue解析
  6. js中实现页面跳转(返回前一页、后一页)
  7. 计算机网络讨论4,计算机网络实验四
  8. 大数据和BI商业智能有何区别?有何相关?
  9. linux启用dcb步骤,Linux DCB体系——简短概述
  10. Echart报错: Map china not exists. You can download map file on
  11. 线性反馈移位寄存器LFSR和循环冗余码CRC
  12. “同心鼓”运动在理想状态下的最佳策略研究
  13. 小米6连接WIFI后无法联网,线刷教程
  14. Android触摸屏校对,android实现触摸屏校准
  15. 带遮挡效果的轮廓线(描边)在3D实时渲染中的一种实现
  16. C语言学生成绩信息管理系统课程设计报告
  17. 无线调试——免除数据线的干扰
  18. 最短路(Finding Shortest Path)
  19. 【SQL】LATERAL VIEW 的用法
  20. ArTalk | 兆芯安超云:打造国产桌面云新势力

热门文章

  1. 数字隔离器件在功率计量芯片中的应用
  2. 安川机器人如何注释化指令_关于安川机器人I/O注释导入的报告
  3. SpringMVC+VUE开发环境搭建
  4. java 获取url图片_java io流根据url读取图片
  5. 《凤凰项目》读书笔记二
  6. C语言--16进制转字符串
  7. 这个网站堪称宝藏,收藏起来吧
  8. H5页面内实现分享给微信好友功能
  9. MySQL 定时备份数据库(包含脚本)
  10. Solaris操作系统介绍