在c++中使用wininet
using wininet in C++
我有一个服务器,如果我发送它"https://MyDomain/Dir1/Dir2/login.html?u=1234&t=5678"将响应一个xml文档。有人知道我怎么在wininet中做这个吗?
到目前为止我所做的是:
std::string GetLoginData(void)
{
HINTERNET hInternet, hConnection, hRequest;
std::string retVal;
hInternet = InternetOpen(L"My Application", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(NULL != hInternet)
{
hConnection = InternetConnect(hInternet, L"MyDomain", INTERNET_DEFAULT_HTTPS_PORT, L"", L"", INTERNET_SERVICE_HTTP, 0, NULL);
if(NULL != hConnection)
{
const wchar_t* lplpszAcceptTypes[] = {L"text/xml", L"application/xml", L"application/xhtml+xml", NULL};
hRequest = HttpOpenRequest(hConnection, L"GET", L"Dir1/Dir2/Login.html", NULL, NULL, lplpszAcceptTypes,
INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | INTERNET_FLAG_KEEP_CONNECTION |
INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_UI | INTERNET_FLAG_PRAGMA_NOCACHE, 0);
if(NULL != hRequest)
{
const char Params[] = {"u=1234&t=5678"};
BOOL rc = HttpSendRequest(hRequest, NULL, 0, (void*)Params, strlen(Params));
if(rc) // here rc = 0 and GetLastError() returns 12152
{
DWORD availDataLen;
char Buff[4096];
DWORD readCount = ERROR_INTERNET_CONNECTION_RESET;
InternetQueryDataAvailable(hInternet, &availDataLen, 0, 0);
while(0 < availDataLen)
{
InternetReadFile(hInternet, Buff, min(sizeof(Buff), availDataLen), &readCount);
availDataLen -= readCount;
retVal = retVal + Buff;
}
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hConnection);
}
InternetCloseHandle(hInternet);
}
return retVal;
}
但是在代码中可以看到HttpSendRequest()
失败,GetLastError()
返回12152
提前谢谢你山姆
这是ERROR_WINHTTP_INVALID_SERVER_RESPONSE。最好的猜测是你在HTTPS端口上发出HTTP请求。
我不知道API很好,但看起来你需要添加INTERNET_FLAG_SECURE到你的HttpOpenRequest调用,和/或在你的InternetConnect调用的flags参数:
INTERNET_FLAG_SECURE
使用安全事务语义。这转换为使用安全套接字层/私有通信技术(SSL/PCT),并且仅在HTTP请求中有意义。这个标志被HttpOpenRequest和InternetOpenUrl使用,但是如果https://出现在URL中,这是多余的。InternetConnect函数将此标志用于HTTP连接;在此连接下创建的所有请求句柄都将继承此标志。
添加INTERNET_FLAG_SECURE
到HttpOpenRequest
对我有效
HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, lpszVerb, lpszObjectName, 0, 0, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_SECURE, 0);
相关文章:
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- WinInet只下载网页的一部分
- 使用 WinInet 修改/删除 HTTP 响应标头
- Qt <winInet.h> 在构建时输出许多 C4430 和 C2146 错误
- C++ WinINET FtpPutFile 错误代码 3
- 将文件发送到 HTTP 服务器 (C++ Wininet)
- C Wininet FTP列出了许多文件错误
- 如何安全地防止在 Wininet 中调用状态回调函数
- 使用 WinInet 的客户端身份验证(证书 + 私钥)
- 通过Wininet下载数据
- Wininet未定义标识符
- Wininet 收到发送的标头
- WinInet如何使用sock代理
- 如何使用WinINet查找是否存在网页
- 如何与多个线程正确连接Wininet
- WinInet输出中的随机字符
- 在c++中使用wininet时发生链接器错误
- 如何在Wininet中使用C++中的HTTPPOST
- C++ WinINet InternetReadFile 函数刷新
- WinINet API可以在Windows Server OS上使用吗?