WinHTTP

记录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从服务端下载资源。

时间: 2024-10-04 15:52:20

WinHTTP的相关文章

达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面

于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模块能够得到简化,于是差点儿重写了这两个功能的代码.由于Get.Post和文件上传功能的基础(父)类基本没有修改,函数调用的流程也基本没有变化,所以本文我将重点解说修改点. (转载请指明出于breaksoftware的csdn博客) 首先我改动了接口的字符集.之前我都是使用UNICODE作为接口參数类型,当中一

POST教程笔记 - WinHttp获取网页源码

①.WinINet与WinHttp的异同点,为什么使用WinHttp讲解? 详情见:<WinINet与WinHttp总结>文档,已经打包给大家了. ②.WinHttp接口调用方式:微软官方地址:http://msdn.microsoft.com/en-us/ ... 84263(v=vs.85).aspxWinHttp微软提供了两种调用方式:C++调用API的版本.COM组件的版本.这里面使用的是 C++ Interface 接口的组件的方式来给大家讲解. ③.WinHttp常用命令讲解:详情

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

在<使用WinHttp接口实现HTTP协议Get.Post和文件上传功能>一文中,我已经比较详细地讲解了如何使用WinHttp接口实现各种协议.在最近的代码梳理中,我觉得Post和文件上传模块可以得到简化,于是几乎重写了这两个功能的代码.因为Get.Post和文件上传功能的基础(父)类基本没有改动,函数调用的流程也基本没有变化,所以本文我将重点讲解修改点.(转载请指明出于breaksoftware的csdn博客) 首先我修改了接口的字符集.之前我都是使用UNICODE作为接口参数类型,其中一个

WINHTTP的API接口说明

BOOL WINAPI WinHttpAddRequestHeaders( _In_  HINTERNET hRequest, _In_  LPCWSTR pwszHeaders, _In_  DWORD dwHeadersLength, _In_  DWORD dwModifiers ); 作用:加入一个HTTP的请求头域. 參数说明: hRequest [in] 一个HINTERNET句柄通过调用WinHttpOpenRequest返回. pwszHeaders [in] 请求的头域字符串,

WINHTTP的API接口说明。

BOOL WINAPI WinHttpAddRequestHeaders( _In_  HINTERNET hRequest, _In_  LPCWSTR pwszHeaders, _In_  DWORD dwHeadersLength, _In_  DWORD dwModifiers ); 作用:加入一个HTTP的请求头域. 參数说明: hRequest [in] 一个HINTERNET句柄通过调用WinHttpOpenRequest返回. pwszHeaders [in] 请求的头域字符串,

HTTP API选择WinInet or WinHttp?

微软对于HTTP提供了两套接口API,很多时候我们不知道用哪个更好.(当然了,两套都不用,自己用winsock2API来写也可以) 看看微软官方的推荐,选择适合自己的: 微软MSDN说明 https://msdn.microsoft.com/en-us/library/aa384068.aspx 微软这里推荐WinInet  https://msdn.microsoft.com/en-us/library/windows/desktop/hh227298(v=vs.85).aspx 两套API我

winlnet跟winhttp访问的代理问题

今天在写代码的时候,需要使用代理来进行get和post,也就是网页访问.但是发现一个问题,就是使用winlnet和winhttp的代理设置竟然有区别. 这确实让我不得其解,让我产生了下面几个疑问: 一winlnet和winhttp访问网页各自的原理是什么? 二两者的区别在什么地方? 三两者大ip代理方式区别在什么地方? 由于急着把代码写好,把问题解决,也没那么多的时间和心思去研究上面三个问题. 最后,我发现一个很有趣的现象,精易的网页_访问的代理貌似不可靠,而网页_访问_对象的代理访问貌似很可靠

批量采集世纪佳缘会员图片及winhttp异步采集效率

原始出处:http://www.cnblogs.com/Charltsing/p/winhttpasyn.html 最近老有人问能不能绕过世纪佳缘的会员验证来采集图片,我测试了一下,发现是可以的. 同时也测试了winhttp异步采集的效率.(在vba里面使用winhttp开发速度快) 经过测试,在网站不忙的情况下,检索一万个会员大约只需要三分钟或者更少的时间. 下面简单说一下如何使用winhttp做并发采集: 1.在类模块里面建立winhttp的各种事件,用于处理error和response数据

VS2008 C++ 利用WinHttp API获取Http请求/响应头部Header

http://www.cnblogs.com/LCCRNblog/p/3833472.html 这一篇博客中,实现了获取http请求/响应后的html源码,现在需要获取http请求/响应的头部Header..通过对WinHttp Api的查看,现给出实现代码.. 1 // WinHttpTest.cpp : 定义控制台应用程序的入口点. 2 // 3 //#include <stdafx.h> 4 #include <vector> 5 #include <winsock2.