WinInet API 浅谈

2024-02-01 01:08
文章标签 api 浅谈 wininet

本文主要是介绍WinInet API 浅谈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、WinInet API 简介

       WinInet (Win32 Internet Extensions) API是 Windows 提供的编写 Internet 客户端程序的专用接口。这些接口提供了对普通 Internet 协议的访问:HTTP、FTP、Gopher。

二、WinInet API 结构图(部分)

三、主要函数介绍

       1. InternetOpen

           初始化WinInet。函数原型如下:

           HINTERNET InternetOpen(
               LPCTSTR lpszAgent,                                   //指定调用 WinINet 函数的应用程序或入口,该入口用作HTTP协议中用户代理项
               DWORDdw AccessType,                              //访问要求类型
               LPCTSTR lpszProxyName,                           //当lAccessType类型为INTERNET_OPEN_TYPE_PROXY时,指定代理服务器的名字。
               LPCTSTR lpszProxyBypass,                        //指定一个可选的主机名列表或IP地址,列表可包括未知元素。
               DWORD dwFlags                    //标记
          );

       2. InternetOpenUrl

           通过一个完整的HTTP、FTP或Gopher网址打开一个资源。函数原型如下:

           HINTERNET InternetOpenUrl(
               HINTERNET hInternet,                                 //当前的 Internet 会话句柄。句柄必须由前面的 InternetOpen 调用返回
               LPCTSTR lpszUrl,                                       //指定读取的网址。只有以http:, ftp:, gopher:或者 https: 开头的网址被支持。
               LPCTSTR lpszHeaders,                              //指定发送到HTTP服务器的头信息
               DWORD dwHeadersLength,                       //额外的头信息的大小,以TCHAR为单位
               DWORD dwFlags,                                      //标记
               DWORD_PTR dwContext                           //指向一个应用程序定义的值,将随着返回的句柄,一起传递给回调函数
            );

       3. InternetConnect

           为指定的站点打开一个HTTP、FTP或Gopher会话。函数原型如下:

           HINTERNET InternetConnect(
                HINTERNET hInternet,                               //当前的 Internet 会话句柄。句柄必须由前面的 InternetOpen 调用返回
                LPCTSTR lpszServerName,                      //指定一个Internet服务器的主机名称
                INTERNET_PORT nServerPort,                //指定要连接的端口号
                LPCTSTR lpszUsername,                         //指定登录用户名
                LPCTSTR lpszPassword,                          //指定登录密码
                DWORD dwService,                                 //指定要访问的服务类型
                DWORD dwFlags,                                    //标记
                DWORD_PTR‍ dwContext                         //指向一个应用程序定义的值,将随着返回的句柄,一起传递给回调函数
            );

       4.HttpOpenRequest

          创建一个HTTP请求句柄。函数原型如下:

          HINTERNET HttpOpenRequest(
               HINTERNET hConnect,                             //InternetConnect返回的HTTP会话句柄
               LPCTSTR lpszVerb,                                 //指定HTTP访问方式,如:GET、POST
               LPCTSTR lpszObjectName,                     //指定的HTTP动作的目标对象名称
               LPCTSTR lpszVersion,                             //指定HTTP版本号
               LPCTSTR lpszReferer,                             //指定引用页
               LPCTSTR *lpszAcceptTypes,                   //指定客户端接收的媒体类型
               DWORD dwFlags,                                     //标记
               DWORD_PTR dwContext                         //指向一个应用程序定义的值,将随着返回的句柄,一起传递给回调函数
           );

      5. HttpSendRequest

          发送指定的HTTP请求到服务器。函数原型如下:

          BOOL HttpSendRequest(
               HINTERNET hRequest,                            //HttpOpenRequest返回的HTTP请求句柄
               LPCTSTR lpszHeaders,                           //指定额外的头信息
               DWORD dwHeadersLength,                    //额外的头信息长度
               LPVOID lpOptional,                                  //指定要发送给服务器的附加数据
               DWORD dwOptionalLength                     //附加数据长度
           );

      6. InternetReadFile

          接收数据。函数原型如下:

          BOOL InternetReadFile(
               HINTERNET hFile,                                   //由InternetOpenUrl、HttpOpenRequest、FtpOpenFile返回的有效句柄
               LPVOID lpBuffer,                                     //指定接收数据的缓冲区
               DWORD dwNumberOfBytesToRead,      //指定要接收的数据长度
               LPDWORD lpdwNumberOfBytesRead    //实际接收的数据长度
           );

四、应用实例(HTTP)(Visual C++ 2010编译运行通过)

       1. 直接使用 InternetOpenUrl 函数

           DWORD CNetTestDlg::GetHtml(void)
           {
                    HINTERNET hInternet=InternetOpen(_T("NetTest"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
                    if(!hInternet)
                            throw "Failed to initialize network.";

                    HINTERNET hUrl=InternetOpenUrl(hInternet,_T("http://www.google.com"),NULL,0,INTERNET_FLAG_RELOAD,0);
                    if(!hUrl)
                             throw "Failed to open the specified url.";

                    char szBuffer[16384];
                    memset(szBuffer,0,16384);
                    DWORD dwRead=0;
                    BOOL bSuccess=InternetReadFile(hUrl,szBuffer,16384,&dwRead);
                    if(!bSuccess)
                             throw "Failed to receive data.";

                    int len=MultiByteToWideChar(CP_ACP,0,szBuffer,-1,NULL,0);
                    wchar_t *pwStr=new wchar_t[len];
                    MultiByteToWideChar(CP_ACP,0,szBuffer,-1,pwStr,len);
                    SetDlgItemText(IDC_EDIT_READ,pwStr);

                    InternetCloseHandle(hUrl);
                    InternetCloseHandle(hInternet);

                    return dwRead;
            }

      2. 使用 InternetConnect、HttpOpenRequest和 HttpSendRequest

           DWORD CNetTestDlg::GetHtml(void)
           {
                    HINTERNET hInternet=InternetOpen(_T("NetTest"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
                   if(!hInternet)
                              throw "Failed to initialize network.";

                    HINTERNET hConnection=InternetConnect(hInternet,_T("www.baidu.com"),INTERNET_INVALID_PORT_NUMBER,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
                    if(!hConnection)
                              throw "Failed to connect the host.";

                    HINTERNET hRequest=HttpOpenRequest(hConnection,_T("GET"),_T("index.html"),_T("HTTP/1.1"),NULL,NULL,INTERNET_FLAG_RELOAD,0);
                    if(!hRequest)
                              throw "Failed to open the request.";

                    BOOL bSuccess=HttpSendRequest(hRequest,NULL,0,NULL,0);
                    if(!bSuccess)
                              throw "Failed to send the request.";

                    char szBuffer[16384];
                    memset(szBuffer,0,16384);
                    DWORD dwRead=0;
                    BOOL bRead=InternetReadFile(hRequest,szBuffer,16384,&dwRead);
                    if(!bRead)
                              throw "Failed to receive date.";

                    int len=MultiByteToWideChar(CP_ACP,0,szBuffer,-1,NULL,0);
                    wchar_t *pwstr=new wchar_t[len];
                    MultiByteToWideChar(CP_ACP,0,szBuffer,-1,pwstr,len);
                    SetDlgItemText(IDC_EDIT_READ,pwstr);

                    InternetCloseHandle(hRequest);
                    InternetCloseHandle(hConnection);
                    InternetCloseHandle(hInternet);
           }

           运行结果:

这篇关于WinInet API 浅谈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665617

相关文章

SpringBoo WebFlux+MongoDB实现非阻塞API过程

《SpringBooWebFlux+MongoDB实现非阻塞API过程》本文介绍了如何使用SpringBootWebFlux和MongoDB实现非阻塞API,通过响应式编程提高系统的吞吐量和响应性能... 目录一、引言二、响应式编程基础2.1 响应式编程概念2.2 响应式编程的优势2.3 响应式编程相关技术

java中4种API参数传递方式统一说明

《java中4种API参数传递方式统一说明》在Java中,我们可以使用不同的方式来传递参数给方法或函数,:本文主要介绍java中4种API参数传递方式的相关资料,文中通过代码介绍的非常详细,需要的... 目录1. 概述2. 参数传递方式分类2.1 Query Parameters(查询参数)2.2 Path

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.