使用WinHTTP与服务器通讯

article/2025/10/29 9:14:52

WinHTTP 的工作流程如下

工作流程

一.初始化WinHTTP

在与服务器交互之前, 必须用调用WinHttpOpen进行初始化,WinHttpOpen创建一个会话,并返回该会话的句柄,接着有了这个句柄, WinHttpConnect就能指定一个目标服务器
注意:调用了WinHttpConnect并不意味着和服务器建立了真正的连接

二.打开一个请求

 WinHttpOpenRequest函数打开一个HTTP请求并返回一个HINTERNET 句柄,该句柄在接下来的步骤中会用到, WinHttpOpenRequest并不会向服务器发送请求, 实际上是WinHttpSendRequest通过网络与服务器建立连接并发送请求.

三.发送请求

WinHttpSendRequest工作时需要 第二步中WinHttpOpenRequest返回的HINTERNET 句柄,WinHttpSendRequest可以发送额外的头部和其他信息,这个"其他信息"通常在PUT和POST操作中被使用

四.以POST方式向服务器发送数据

为了能够向使用POST或者PUT方法,在调用WinHttpOpenRequest时,第五个参数必须设置为"PUT"或者"POST",注意要使用大写,WinHttpSendRequest的第几个参数要设置为准备传送的数据的字节数, 然后就可以使用WinHttpWriteData来传送数据了

如果不想用 WinHttpWriteData 传送数据,则需要把 WinHttpSendRequest 第五个和第六个参数设置都为准备传送的数据的字节数,第四个参数为待传送数据的地址。
这样就可以直接在WinHttpSendRequest 中传送数据了在用 WinHttpOpenRequest 打开了一个请求,用 WinHttpSendRequest 发送数据并用 WinHttpReceiveResponse 接受返回消息之后,就能够用 WinHttpReadData 和 WinHttpQueryDataAvailable从HTTP 服务器下载资源了

Demo:

DWORD dwSize = 0;DWORD dwDownloaded = 0;LPSTR pszOutBuffer;BOOL  bResults = FALSE;HINTERNET  hSession = NULL, hConnect = NULL,hRequest = NULL;// 获得一个会话的句柄.hSession = WinHttpOpen( L"WinHTTP Example/1.0",  WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0 );// 指定HTTP服务器.if( hSession )hConnect = WinHttpConnect( hSession, L"www.microsoft.com",INTERNET_DEFAULT_HTTPS_PORT, 0 );// 创建HTTP请求连接.if( hConnect )hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE );// 发送请求.if( hRequest )bResults = WinHttpSendRequest( hRequest,WINHTTP_NO_ADDITIONAL_HEADERS, 0,WINHTTP_NO_REQUEST_DATA, 0, 0, 0 );// 结束请求.if( bResults )bResults = WinHttpReceiveResponse( hRequest, NULL );// 接收数据.if( bResults ){do {// 检查是否有可用数据.dwSize = 0;if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) )printf( "Error %u in WinHttpQueryDataAvailable.\n",GetLastError( ) );// 分配空间.pszOutBuffer = new char[dwSize+1];if( !pszOutBuffer ){printf( "Out of memory\n" );dwSize=0;}else{// 读取数据.ZeroMemory( pszOutBuffer, dwSize+1 );if( !WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded ) )printf( "Error %u in WinHttpReadData.\n", GetLastError( ) );elseprintf( "%s", pszOutBuffer );// 释放空间.delete [] pszOutBuffer;}} while( dwSize > 0 );}// 如果出错,输出具体错误代码.if( !bResults )printf( "Error %d has occurred.\n", GetLastError( ) );// 关闭所有句柄.if( hRequest ) WinHttpCloseHandle( hRequest );if( hConnect ) WinHttpCloseHandle( hConnect );if( hSession ) WinHttpCloseHandle( hSession );

更多详细内容


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

相关文章

使用c++ winhttp实现post请求

winhttp是windows网络库,要测试自己写的post请求是否有效,首先得在postman上面建立一个可用的接口。我的如下。 代码思路如下: 1、首先使用WinHttpCrackUrl拆解链接,后面会使用到拆解出来的信息。 2、再使用WinHttpOpen初始化 3、…

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

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

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

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

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

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

使用WinINet和WinHTTP实现Http访问

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

WinHttp.WinHttpRequest.5.1

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

Tinyhttpd for Windows

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

windows安装http测试服务

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

C++ winhttp 实现文件下载器

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

WinHTTP教程

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

WinHttp c++ 介绍及应用

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

WinHTTP

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

Java递归算法计算5的阶乘

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

Java算法递归与递推

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

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

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

java中递归算法的理解

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

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

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

Java递归

1.递归的概念: 一个方法在执行过程中调用自身, 就称为 "递归". 示例: //递归求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递归算法(一)——详解以及几个经典示例

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

Java 递归算法

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