C++编程笔记:使用WinHTTP实现HTTP访问(解决接收UTF8数据乱码问题)

实现HTTP访问的流程包括以下几步:
1, 首先我们打开一个Session获得一个HINTERNET session句柄;
2, 然后我们使用这个session句柄与服务器连接得到一个HINTERNET connect句柄;
3, 然后我们使用这个connect句柄来打开Http请求得到一个HINTERNET request句柄;
4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据;
5, 最后依次关闭request,connect,session句柄。

微软提供了两套http访问的接口:WinHTTP和WinINet。WinHTTP比WinINet更加安全和健壮,可以认为WinHTTP是WinINet的升级版本。这两套API包含了很多相似的函数与宏定义,访问的流程也是完全类似的(上述5步)。本文主要通过WinHTTP实现post请求方法,严格按照上述5个步骤给大家进行讲解。
又由于我所接收到的数据是UTF8而不是ASCII码,因此一开始接收到的数据存在乱码。在下述代码中我会详细解释出现乱码的原因以及如何解决。
好,小二,上代码!

#include "stdafx.h"
#include "jsonparser.h"

#include <string>
#include <windows.h>
#include <winhttp.h>
#pragma comment(lib, "winhttp.lib")



int _tmain(int argc, _TCHAR* argv[])
{
    HINTERNET hSession = NULL;
    HINTERNET hConnect = NULL;
    HINTERNET hRequest = NULL;

    //1. 初始化一个WinHTTP-session句柄,参数1为此句柄的名称
    hSession = WinHttpOpen(L"csdn@elaine_bao", NULL, NULL, NULL, NULL);
    if (hSession == NULL) {
        cout<<"Error:Open session failed: "<<GetLastError()<<endl;
        return -1;
    }

    //2. 通过上述句柄连接到服务器,需要指定服务器IP和端口号。若连接成功,返回的hConnect句柄不为NULL
    hConnect = WinHttpConnect(h
  • 14
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,以下是一个使用WinHTTP API访问百度并计算请求时间的C++示例代码: ```cpp #include <Windows.h> #include <Winhttp.h> #include <iostream> #pragma comment(lib, "Winhttp.lib") int main() { // 初始化WinHTTP库 HINTERNET hSession = WinHttpOpen(L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (!hSession) { std::cerr << "Failed to open WinHTTP session: " << GetLastError() << std::endl; return 1; } // 打开连接 HINTERNET hConnect = WinHttpConnect(hSession, L"www.baidu.com", INTERNET_DEFAULT_HTTP_PORT, 0); if (!hConnect) { std::cerr << "Failed to connect: " << GetLastError() << std::endl; WinHttpCloseHandle(hSession); return 1; } // 打开请求 HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); if (!hRequest) { std::cerr << "Failed to open request: " << GetLastError() << std::endl; WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } // 发送请求 if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0)) { std::cerr << "Failed to send request: " << GetLastError() << std::endl; WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } // 等待响应 if (!WinHttpReceiveResponse(hRequest, NULL)) { std::cerr << "Failed to receive response: " << GetLastError() << std::endl; WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } // 获取响应时间 DWORD dwStartTime = GetTickCount(); DWORD dwEndTime; DWORD dwBytesRead; BYTE pBuffer[1024]; while (WinHttpReadData(hRequest, pBuffer, sizeof(pBuffer), &dwBytesRead)) { // 读取响应内容,这里不需要处理 } dwEndTime = GetTickCount(); // 输出请求时间 std::cout << "Request time: " << (dwEndTime - dwStartTime) << "ms" << std::endl; // 关闭句柄 WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 0; } ``` 该示例使用WinHTTP API来访问百度首页,并计算了请求时间。具体实现步骤为: 1. 初始化WinHTTP库 2. 打开连接 3. 打开请求 4. 发送请求 5. 等待响应 6. 获取响应时间 7. 关闭句柄 注意,由于WinHTTP API是异步的,所以在等待响应时需要使用循环读取响应内容,直到读取完毕为止。在本示例中,我们使用了简单的循环来读取响应内容,但实际应用中应该根据需要进行更加完善的处理。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值