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

相关文章

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

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服务重启,就会失效;