使用c++ winhttp实现post请求

article/2025/10/29 9:10:48

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;

}


http://chatgpt.dhexx.cn/article/YnPvB0d3.shtml

相关文章

HTTP HTTPS POST GET(包含curl版本和winhttp两种实现)

玩过抓包&#xff0c;网络协议分析的朋友肯定都知道http https post get&#xff0c;web端和用户的交互主要是通过post get完成的。 今天带给大家的是C版本的http https get post,只会易语言的朋友请移步。 我这里有两种实现&#xff1a; 1&#xff1a;libcurl实现的CHttpClien…

C++用winhttp实现https访问服务器

由于项目升级&#xff0c;在数据传输过程中需要经过OAuth2.0认证&#xff0c;访问服务器需要https协议。 首先&#xff0c;实现C代码访问https 服务器&#xff0c;实现Get和post功能&#xff0c;在网上搜索一通&#xff0c;发现各种各样的都有&#xff0c;有的很简单&#xff0…

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

在《使用WinHttp接口实现HTTP协议Get、Post和文件上传功能》一文中&#xff0c;我已经比较详细地讲解了如何使用WinHttp接口实现各种协议。在最近的代码梳理中&#xff0c;我觉得Post和文件上传模块可以得到简化&#xff0c;于是几乎重写了这两个功能的代码。因为Get、Post和文…

使用WinINet和WinHTTP实现Http访问

Http访问有两种方式&#xff0c;GET和POST&#xff0c;就编程来说GET方式相对简单点&#xff0c;它不用向服务器提交数据&#xff0c;在这个例程中我使用POST方式&#xff0c;提交数据value1与value2&#xff0c;并从服务器得到他们的和&#xff08;value1 value2&#xff09;…

WinHttp.WinHttpRequest.5.1

Set oHttp CreateObject ( " WinHttp.WinHttpRequest.5.1 " )oHttp.Option( 6 ) 0 禁止自动Redirect&#xff0c;最关键的 oHttp.SetTimeouts 9999999 , 9999999 , 9999999 , 9999999 设置超时&#xff5e;和ServerXMLHTTP组件一样 oHttp.Open " GET &q…

Tinyhttpd for Windows

TinyHTTPd forWindows 前言 TinyHTTPd是一个开源的简易学习型的HTTP服务器&#xff0c;项目主页在&#xff1a;http://tinyhttpd.sourceforge.net/&#xff0c;源代码下载&#xff1a;https://sourceforge.net/projects/tinyhttpd/&#xff0c;因为是学习型的代码,已经有好多年…

windows安装http测试服务

祝您身体健康&#xff0c;前程似锦&#xff0c;小弟期待文章对您有帮助&#xff0c;也期待您的打赏: 目录 1. 下载 HttpMockServer工具 2. windows10 安装jdk1.8 3. jdk按照上面配置完环境变量后打开cmd&#xff0c;运行 4. 准备测试的响应数据 text.txt,内容如下: 5. 会弹…

C++ winhttp 实现文件下载器

本篇内容讲述 C winHttp 实现下载器的简单 demo&#xff0c;使用了 WinHttpOpen、WinHttpConnect、WinHttpOpenRequest、WinHttpSendRequest、WinHttpReceiveResponse、WinHttpQueryDataAvailable、WinHttpReadData、WinHttpCloseHandle 等函数。 版权声明&#xff1a;本文为C…

WinHTTP教程

最近有些忙&#xff0c;也没更新BLOG&#xff0c;这几天在捣鼓一个小玩意要用到WinHTTP API&#xff0c;发现资料很少&#xff0c;而且大都是些MFC封装的例子&#xff0c;看得我是一个头几个大。就把自己关于WinHTTP的学习总结了一下&#xff0c;仅供参考&#xff0c;各人理解可…

WinHttp c++ 介绍及应用

一、HTTP协议介绍 http协议的底层协议是TCP协议。TCP协议是基于数据流的传输方式。其又叫做“超文本传输协议”&#xff0c;为什么呢&#xff0c;因为它是将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器&#xff0c;通过因特网传送万维网文档的数据传送协议。 1…

WinHTTP

记录WinHTTP学习过程 一、什么是WinHTTP&#xff1f; WinHTTP的全称是Microsoft Windows HTTP Services&#xff0c; 它提供给开发者一个HTTP客户端应用程序接口(API)&#xff0c;通过这种API借助HTTP协议给其他的HTTP服务器发送请求。 二、WinHTTP访问流程 如上图&#xff0c;…

Java递归算法计算5的阶乘

递归 package com.etime.test019; //计算5的阶乘&#xff1b; public class Test15 {public static void main(String[] args) {//调用test1方法&#xff0c;且只调用一次int i test1(5);System.out.println(i);}//定义一个int类型返回值的静态方法public static int test1(i…

Java算法递归与递推

Java算法----递归与递推 递推实现递推思想递归实现递归思想递归实现递推思想递推实现递归思想四种方法的特点思维拓展 问题&#xff1a;给你一个整数n&#xff0c;如果n是奇数&#xff0c;就进行运算nn*31&#xff0c;如果n是偶数&#xff0c;就进行运算nn/2&#xff0c;直到n等…

Java开发 | 数据结构和算法之——递归算法

著名的Pascal之父——Nicklaus Wirth(沃斯)让他获得图灵奖的一句话就是他提出的著名公式:“程序=数据结构+算法”,这个公式对计算机科学的影响类似于爱因斯坦的质能方程在物理界的影响。 因此可以看出来数据结构和算法在我们开发程序中有多么的重要了,下面我们来简单认识…

java中递归算法的理解

Coding多了&#xff0c;递归算法是非常常见的&#xff0c;最近我一直在做树形结构的封装&#xff0c;所以更加的离不开递归算法。所以今天就简单说一下这个递归算法&#xff0c;用java实现一个非常经典的递归实例。 递归算法&#xff0c;其实说白了&#xff0c;就是程序的自身调…

【递归】java递归算法及替代方法

文章目录 菜单树递归&#xff08;树根往子节点递归&#xff09;需求&#xff1a; 取所有level小于2的节点 ( 返回结果为普通list格式) 为list格式的数据设置children&#xff08;非递归&#xff09;需求&#xff1a; 数据库查出来的原始list 如果有children就设置 使用循环代替…

Java递归

1.递归的概念&#xff1a; 一个方法在执行过程中调用自身, 就称为 "递归". 示例&#xff1a; //递归求n的阶乘 public static void main(String[] args) {int n 5;int ret factor(n);System.out.println("ret " ret); }public static int factor(int…

java递归算法(一)——详解以及几个经典示例

什么是递归 递归就是一个程序或函数在其中定义或说明有之间或者间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解&#xff0c;递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算&#xff0c;大…

Java 递归算法

一、概述&#xff1a; Java递归&#xff1a;简单说就是函数自身直接或间接调用函数的本身。 二、应用场景&#xff1a; 若&#xff1a;一个功能在被重复使用&#xff0c;并每次使用时&#xff0c;参与运算的结果和上一次调用有关&#xff0c;这时就可以使用递归来解决这个问题…

递归与递归算法实例(java实现)

一、递归介绍 递归算法&#xff08;英语&#xff1a;recursion algorithm&#xff09;在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。绝大 多数编程语言支持函数的自调用&#xff0c;在这些语言中函数可以通过调用自身来进行递归。 定义&#xff1…