WinHTTP

article/2025/10/29 12:28:21

记录WinHTTP学习过程

一、什么是WinHTTP?

WinHTTP的全称是Microsoft Windows HTTP Services, 它提供给开发者一个HTTP客户端应用程序接口(API),通过这种API借助HTTP协议给其他的HTTP服务器发送请求。

 

二、WinHTTP访问流程

如上图,大致流程是:

1.通过WinHttpOpen来获得一个Session句柄;

2.使用该句柄通过WinHttpConnect连接服务器获得一个Connect句柄;

3.用得到的Connect句柄通过WinHttpOpenRequest打开Http请求,获得Request句柄;

4.使用这个Request句柄就可以和服务器发送接收数据了;

5.以上句柄需要依次关闭。

 

初始化WinHttp

在使用WinHttp连接服务器之前,须要使用WinHttpOpen来进行初始化。WinHttpOpen将创建一个维护Http会话细节的会话环境(Session Context),并返回一个session handle。使用该句柄,WinHttpConnect可以连接到目标Http(Https)服务器。

注意 在请求特定的资源之前,WinHttpConnect并不会建立到目标服务器的实际连接。

打开请求

WinHttpOpenRequest打开一个HTTP请求冰球返回一个HINTERNET句柄以供其他HTTP函数使用。在调用WinHttpOpenRequest时并不会向服务器发送请求。实际上是WinHttpSendRequest建立了一个网络链接并发送请求。

下面例子演示了使用默认参数调用WinHttpOpenRequest:

HINTERNET hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL, NULL, NULL, NULL, 0);

 

增加请求头部

WinHttpAddRequestHeaders方法能够向一个Http请求句柄添加一个或者多个请求头部。

 

发送请求

WinHttpSendRequest可以建立一个到Http服务器的连接并发送请求。它需要一个HINTERNET句柄作为参数,该句柄由WinHttpOpenRequest创建。WinHttpSendRequest在发送请求的同时可以连带头部或者选项信息一起发送,选项信息通常被用于向服务器发送信息的操作(PUT和POST等)。

在WinHttpSendRequest发送请求之后,应用可以通过使用HINTERNET句柄调用WinHttpReadData和WinHttpQueryDataAvailable方法下载服务器的资源。

向服务器发送数据

要向服务器发送数据,在调用WinHttpOpenRequest时HTTP verb(HTTP method)应设为PUT或者POST。当调用WinHttpSendRequest时,dwTotalLength应设为发送数据的字节数。然后通过WinHttpWriteData来向服务器发送数据。

另外,可以通过设置WinHttpSendRequest的lpOptional参数为一个包含数据的缓冲区的地址来发布到服务器。使用这种方法时,必须设置WinHttpSendRequest的两个参数dwOptionalLength和dwTotalLength 的数据大小。以这种方式调用WinHttpSendRequest的话就不需要再调用WinHttpWriteData了。

获取请求信息

WinHttpQueryHeaders函数允许应用程序检索HTTP请求的信息。该函数需要一个WinHttpOpenRequest返回的HINTERNET,一个information level值,和一个缓冲区长度。同时还需要一个用以存储信息的缓冲区以及一个用以列举同名头部的指针。

Web下载资源

在通过WinHttpOpenRequest打开一个请求并以WinHttpSendRequest发送至服务端之后,使用WinHttpRecevieResponse可以接受服务端的回应,应用也可硬使用 WinHttpReadData和WinHttpQueryDataAvailable从服务端下载资源。

转载于:https://www.cnblogs.com/lzwd003/p/3910104.html


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

相关文章

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

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

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

Java的递归算法

递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。 关键要抓住的是: &…

java递归算法实现

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

【Java】递归算法

文章目录 什么是递归?递归求阶乘递归求解斐波那契数列猴子吃桃问题 什么是递归? 程序 调用自身 的编程技巧成为 递归(recursion)。 递归算法是一种直接或间接调用、定义自身的函数或方法的算法,也就是调用自身。 递归…

Java递归算法

递归在程序语言中就是方法本身自己调用自己,而递归思想是算法的重要思想之一,就是利用递归来实现解决问题的算法。 递归也分为直接递归和间接递归。 那么什么叫直接递归什么又叫间接递归呢? //直接递归调用 function(){...function();... …

散布矩阵(scatter_matrix)及相关系数(correlation coefficients)实例分析

在进行机器学习建模之前,需要对数据进行分析,判断各特征(属性,维度)的数据分布及其之间的关系成为十分必要的环节,本文利用Pandas和Numpy的散布矩阵函数及相关系数函数对数据集特征及其关系进行实例分析。 散布矩阵(scatter_matri…

Probability And Statistics——CorrelationsCovariance

Skew(偏度) 在概率论和统计学中,偏度衡量实数随机变量概率分布的不对称性。偏度的值可以为正,可以为负或者甚至是无法定义。在数量上,偏度为负(负偏态)就意味着在概率密度函数左侧的尾部比右侧的…

structural covariance network

structural covariance network 结构协方差网络 结构协方差网络是一个较老的概念,只是近年受到了一定的重视。 大佬 Aaron Alexander-Bloch 在2013年通过一篇综述描述了这种结构协方差网络的应用意义及前景。 既往一般是在bold信号和fiber tracking建立连接&#xf…

_variant_t、CComVariant与COleVariant、CDBVariant

目前计算机语言多种多样,如C、Java、Basic、Pascal等,此外还有JavaScript、VBScript、ActionScript等脚本语言,它们各自维护自己的数据类型,当使用C这样强类型的语言来读取数据库或者与其他语言之间来交换数据时,它很有…

Partial correlation coefficient

利用PYTHON计算偏相关系数(Partial correlation coefficient) 在统计学中,我们经常使用皮尔逊相关系数来衡量两个变量之间的线性关系。然而,有时我们感兴趣的是理解两个变量之间的关系,同时控制第三个变量。 例如,假设…

Multilevel Cooperative Coevolution for Large Scale Optimization

0、论文背景 本文在CCEA_G的基础上,提出了MLCC框架。在MLCC中,基于不同组大小的随机分组策略构造了一组问题分解器。演化过程分为若干个循环,在每个周期开始时,MLCC使用自适应机制根据其历史性能选择分解器。由于不同的组大小捕获…

mean value coordinates(均值重心坐标)定义及证明

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 在图形学中对于物体的描述往往是离散,但是在具体展示过程中我们又希望是连续。线性插值是解决离散与连续的常用手段。 三角形中的插值点击前往凸四边形中的…