// 超文本传输协议(HyperText Transfer Protocol)是互联网上应用最广泛的协议,主要是用于网页的浏览。
// HTTP采用了请求-应答模式,也就是俗称的客户端/服务器模型,简称C/S模型。
// 其中,客户端向服务器发送一个请求,请求一般包括请求行、请求头和请求体三个部分。
// 在请求头中包含请求头中包含请求方法、URL、协议版本以及请求修饰符,客户消息和内容的类似于MIME的消息结构。
// 服务器以一个状态作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
// HTTP常用的请求方法有GET、POST、PUT、DELETE四个,对应着对网络资源的查、改、增、删四个操作。
// HTTP采用TCP通信,主要是保证传输数据的稳定性、完整性。
// HTTP文件上传,主要是向服务器发送POST请求,将数据按照服务器的接收格式传输到服务器上,服务器再根据接收格式接收数据,完成文件的上传操作。
// HTTP文件下载,主要是向服务器发送GET请求,服务器接收到相应的请求后,便会读取资源数据并返回,这就完成的文件下载操作。
// PS:HttpOpenRequest函数:
// 功能:创建一个HTTP请求句柄。
// 原型:HINTERNET HttpOpenRequest(
// _In_ HINTERNET hConnect,
// _In_ LPCTSTR lpszVerb,
// _In_ LPCTSTR lpszObjectName,
// _In_ LPCTSTR lpszVersion,
// _In_ LPCTSTR lpszReferer,
// _In_ LPCTSTR *lplpszAcceptTypes,
// _In_ DWORD dwFlags,
// _In_ DWORD_PTR dwContext
// )
// 参数:hConnect:由InternetConnect函数返回的连接句柄。
// lpszVerb:请求的方法,默认为GET。
// lpszObjectName:目标对象字符串,通常为文件名称、可自行模块或者查找标识符。
// lpszVersion:HTTP版本,如果为NULL,表示使用1.1或1.0版本的HTTP协议。
// lpszReferer:指向URL文档地址,如果为NULL,则不指定HTTP头。
// lplpszAcceptTypes:表示客户接受的内容类型,比如"text/json"等。
// dwFlags:标志,可以为以下值的一个或多个:
// INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP:禁用检测这种特殊类型的重定向。
// INTERNET_FLAG_IGNORE_CERT_CN_INVALID:根据请求中给出的主机名禁用检测从服务器返回的基于SSL/PCT的证书。
// INTERNET_FLAG_KEEP_CONNECTION:保持连接。
// INTERNET_FLAG_NO_AUTH:不会自动尝试验证。
// INTERNET_FLAG_NO_COOKIES:不会自动为请求添加Cookie标头,也不会自动将返回的Cookie添加到Cookie数据库。
// INTERNET_FLAG_NO_UI:禁用Cookie对话框。
// INTERNET_FLAG_RELOAD:强制从源服务器上下载所请求的文件,而不是从缓存中下载。
// INTERNET_FLAG_SECURE:启用HTTPS。
// dwContext:指定OpenRequest操作的上下文标识。
// 结果:成功返回HTTP请求句柄,失败返回NULL。
// PS:HttpSendRequestEx函数:
// 功能:将指定的请求发送到HTTP服务器。
// 原型:BOOL HttpSendRequestEx(
// _In_ HINTERNET hRequest,
// _In_ LPINTERNET_BUFFERS lpBuffersIn,
// _Out_ LPINTERNET_BUFFERS lpBuffersOut,
// _In_ DWORD dwFlags,
// _In_ DWORD_PTR dwContext
// )
// 参数:hRequest:由HttpOpenRequest创建的请求句柄。
// lpBuufersIn:可选,指向INTERNET_BUFFERS结构的指针。
// lpBuffersOut:保留,必须为NULL。
// dwFlags:保留,必须为NULL。
// dwContext:指定由应用程序定义的上下文值,前提是状态回调函数已注册。
// 结果:成功返回TRUE,失败返回FALSE。
// PS:HttpQueryInfo函数:
// 功能:查询有关HTTP请求的信息。
// 原型:BOOL WINAPI HttpQueryInfo(
// HINTERNET hRequest,
// DWORD dwInfoLevel,
// LPVOID lpBuffer,
// LPDWORD lpdwBufferLength,
// LPDWORD lpdwIndex
// )
// 参数:hRequest:由HttpOpenRequest函数创建的Request句柄。
// dwInfoLevel:请求要查询的属性和修改请求的标志组合。
// lpBuffer:接收信息的缓存区。
// lpdwBufferLength:接收缓存区大小。
// lpdwIndex:用于枚举具有相同名称的多个头的基于零的头索引。
// 结果:成功,返回TURE,失败,返回FALSE。
// PS:基于WinInet库实现的HTTP文件上传步骤如下:
// 1.调用InternetCrackUrl函数对Url进行分解,从URL中提取网站的域名、资源路径、用户名、密码以及URL的附加信息等。
// 2.调用InternetOpen函数建立会话,获取会话句柄。连接过程中要指明INTERNET_SERVICE_HTTP,这表明连接到HTTP服务器上。
// 3.调用InternetConnect函数建立连接,获取连接句柄。
// 4.调用HttpOpenRequest打开HTTP的POST请求,同时指明POST的资源路径,并且设置HTTP的访问标志。
// 5.调用HttpSendRequestEx函数向服务器发送访问请求。
// 6.调用InternetWriteFile函数将本地数据写到远程主机上,即向服务器上传数据。等数据上传完毕后,调用HttpEndRequest函数来结束请求。
// 7.关闭句柄,释放缓存区资源。
// PS:示例代码:
// 数据上传
BOOL Http_Upload(char *pszUploadUrl, BYTE *pUploadData, DWORD dwUploadDataSize)
{
// 变量(略)
// 分解URL
if (FALSE == Http_UrlCrack(pszUploadUrl, szScheme, szHostName, szUserName, szPassword, szUrlPath, szExtraInfo, MAX_PATH))
{
return FALSE;
}
// 数据上传
do
{
// 建立会话
hInternet = ::InternetOpen
WinInet库之Http通信
本文详细介绍了如何利用WinInet库实现Windows应用程序中的HTTP通信。内容涵盖WinInet的基本概念、初始化、发送请求、接收响应及关闭连接等关键步骤,为开发者提供了一个实用的WinInet HTTP通信教程。
摘要由CSDN通过智能技术生成