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

相关文章

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav