WinHTTP教程

WinHTTP教程这几天在捣鼓一个小玩意要用到WinHTTPAPI,发现资料很少,而且大都是些MFC封装的例子,看得我是一个头几个大。就把自己关于WinHTTP的学习总结了一下,仅供参考,各人理解可能有区别。

大家好,又见面了,我是你们的朋友全栈君。

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

BTW:Google Chrome就是基于WinHTTP写的,如果想深入学习,可以阅读分析Chrome Code.
从此处获取Chrome的源代码等相关信息
SVN: http://src.chromium.org/svn/trunk/src/chrome/
VIEW: http://src.chromium.org/viewvc/

WinHTTP APIs是一组用来进行HTTP操作的函数,相比WinINet更加安全和健壮一些。

WinHTTP API List:

WinHttpAddRequestHeaders
WinHttpCheckPlatform
WinHttpCloseHandle
WinHttpConnect
WinHttpCrackUrl
WinHttpCreateUrl
WinHttpDetectAutoProxyConfigUrl
WinHttpGetDefaultProxyConfiguration
WinHttpGetIEProxyConfigForCurrentUser
WinHttpGetProxyForUrl
WinHttpOpen
WinHttpOpenRequest
WinHttpQueryAuthSchemes
WinHttpQueryDataAvailable
WinHttpQueryHeaders
WinHttpQueryOption
WinHttpReadData
WinHttpReceiveResponse
WinHttpSendRequest
WinHttpSetCredentials
WinHttpSetDefaultProxyConfiguration
WinHttpSetOption
WinHttpSetStatusCallback
WinHttpSetTimeouts
WinHttpTimeFromSystemTime
WinHttpTimeToSystemTime
WinHttpWriteData

WinHTTP API逻辑上分成三个独立的对象进行建模:会话对象、连接对象、请求对象。大致为:

初始化WinHTTP(获得会话对象,)–>创建连接(连接1,连接2,…N)–>发送请求(请求1,请求2,….N)

会话对象、连接对象、请求对象都由HINTERNET句柄表示,句柄的使用传递过程大致为:

WinHttpOpen–>return Session handle
                        |
WinHttpConnect–>return Connection handle
                        |
WinHttpOpenRequest–>return Request handle

各对象句柄可以使用WinHttpCloseHandle进行关闭。为了进一步加深了解WinHTTP APIs的调用过程和关系,我们来看下面的图:

WinHTTP教程

                                                           (图来自MSDN)

会话对象
会话对象使用WinHttpOpen函数来进行创建。函数原形如下:

HINTERNET WinHttpOpen(
          __in LPCWSTR   pwszUserAgent,
          __in DWORD   dwAccessType,
          __in LPCWSTR   pwszProxyName,
          __in LPCWSTR   pwszProxyBypass
          __in DWORD   dwFlags
);

第一个参数指向一个应用程序自身名称及版本的字符串,使用在HTTP协议的User Agent中。如:Mozilla/4.0
第二个参数是WinHttp的访问类型要求。可能为下列值
WINHTTP_ACCESS_TYPE_NO_PROXY             //不使用默认代理服务器
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY   //使用默认的代理服务器(储存在注册表中的WINHTTP代理设置,注意:与IE的代理设置不同,为独立的)
WINHTTP_ACCESS_TYPE_NAMED_PROXY //使用指定的代理服务器设置
第三个参数指向一个代理服务器名称的字符串,如果前一个参数dwAccessType未设置为WINHTTP_ACCESS_TYPE_NAMED,这个参数就必须为WINHTTP_NO_PROXY_NMAE。
第四个参数指向一个HTTP服务器列表,其中的服务器不能通过前一个参数指定的代理服务器进行路由(这与IE代理服务器设置中的例外情况设置类似)
第五个参数定义了一个标记,当前只定义了一个标记
WINHTTP_FLAG_ASYNC //指示WinHTTP API将异步执行。

连接对象
连接对象使用WinHttpConnect函数来进行创建(注意前面提到的一个会话对象可以创建多个连接对象)。函数原形如下:

HINTERNET WinHttpConnect(
          __in HINTERNET   hSession,
          __in LPCWSTR   pswzServerName,
          __in INTERNET_PORT   nServerPort
          __in reserved DWORD   dwReserved
);

第一个参数指定连接的所属会话句柄。
第二个参数指定连接的服务器名称或IP地址
第三个参数指定服务器的端口号,这个参数还可以指定为下列值
INTERNET_DEFAULT_HTTP_PORT //使用默认HTTP Service端口号80
INTERNET_DEFAULT_HTTPS_PORT //使用默认HTTPS安全连接端口号443
INTERNET_DEFAULT_PORT //常规HTTP请求使用80,HTTPS请求使用443(这是个便利的参数值)
第四个参数是保留的,必须为0

请求对象
请求对象使用WinHttpOpenRequest函数来进行创建(注意前面提到的一个连接对象可以创建多个请求对象)。从请求对象开始,就进入原本目的HTTP操作了。函数原形如下:

HINTERNET WinHttpOpenRequest(
          __in HINTERNET   hConnect,
          __in LPCWSTR   pwszVerb,
          __in LPCWSTR   pwszObjectName,
          __in LPCWSTR   pwszVersion,
          __in LPCWSTR   pwszReferrer,
          __in LPCWSTR   *ppwszAcceptTypes,
          __in DWORD   dwFlags
)

第一个参数指定请求所属的连接句柄
第二个参数指定HTTP协议动作(如:GET、POST和HEAD),如果此参数为NULL,函数会默认使用GET。
第三个参数指定正在请求的资源名称和相对路径
第四个参数指定使用的HTTP协议版本,如果此参数为NULL,函数会默认使用HTTP/1.1
第五个参数指定引用的URL,如果没有,可以设置为WINHTTP_NO_REFERER
第六个参数指定客户端(本应用程序)将接受的媒体类型(如:image/gif、text/*、*/*),一般可以指定为WIN_HTTP_DEFAULT_ACCEPT_TYPES。
第七个参数指定请求行为标记,如可以指定为WINHTTP_FLAG_SECURE标记发出HTTPS请求,一般可以为0。其他可指定值请参考MSDN,我就不罗列了。

至此介绍了三个WinHTTP API,经过这个过程就基本建立了一个HTTP网络连接。由此我们已经对WInHTTP有了基本概念性的认识。WinHTTP APIs(2)中将再介绍利用WinHTTP API进行更为复杂的操作和实际的应用例子

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157465.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • idea 2021.9 激活码(JetBrains全家桶)

    (idea 2021.9 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • RePlugin集成AndroidAutoSize

    RePlugin集成AndroidAutoSize一、屏幕适配你可能会问“都2021年了还折腾屏幕适配?直接用dp单位适配不好吗?”,确实,如果公司的UI设计师、产品经理以及老板,能明白为什么一套UI在不同设备上显现出来的一些差异并不是bug时,开发者直接用dp单位配合一些布局技巧来进行适配是可以的,但是,实现多数情况下并不是如此美好,他们更希望看到的是UI在不同屏幕上,仅仅只是缩放的区别,为了满足这种要求,应用第三方屏幕适配方案就非常有必要了。根据在网上查到的比较好的原生屏幕适配方案有两种:smallestWidth

  • LeetCode Solutions : Swap Nodes in Pairs

    LeetCode Solutions : Swap Nodes in Pairs

  • 在centos中安装mysql_linux下pycharm使用

    在centos中安装mysql_linux下pycharm使用在centos中安装pycharm#全部过程如下:1.pycharm官网下载软件(linux版),我下载的是专业版forlinuxhttp://www.jetbrains.com/pycharm/download/#section=linux文件名为:pycharm-professional-2018.3.4.tar2.centos是阿里云的服务器,如果是虚拟机也是一样操作,然后…

  • 一场影响美国大选的战争利器:邮件安全+协作即时

    一场影响美国大选的战争利器:邮件安全+协作即时

  • Python获取秒级时间戳与毫秒级时间戳的方法[通俗易懂]

    Python获取秒级时间戳与毫秒级时间戳的方法[通俗易懂]1、获取秒级时间戳与毫秒级时间戳、微秒级时间戳importtimeimportdatetimet=time.time()print(t)#原始时间数据print(int(t))#秒级时间戳print(int(round(t*1000)))#毫秒级时间戳print(int(round(t*1000000)))#微秒级时间戳输出1648812012.4263625 #原始时

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号