利用wininet接口实现访问http服务:
#include "StdAfx.h"
#include <WinInet.h>
#pragma comment(lib,"wininet.lib")
int main()
{
//第一步,连接12306网站服务器
LPCTSTR lpszAgent = L"WinInetGet/0.1";
HINTERNET hInternet = InternetOpen( lpszAgent,
INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
LPCTSTR lpszServerName = L"kyfw.12306.cn";
INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTPS_PORT; // HTTPS端口443
LPCTSTR lpszUserName = NULL; //无登录用户名
LPCTSTR lpszPassword = NULL; //无登录密码
DWORD dwConnectFlags = 0;
DWORD dwConnectContext = 0;
HINTERNET hConnect = InternetConnect(hInternet,
lpszServerName, nServerPort,
lpszUserName, lpszPassword,
INTERNET_SERVICE_HTTP,
dwConnectFlags, dwConnectContext);
if(hConnect == NULL)
{
return false;
}
//第二步,访问12306网站登录验证码接口
LPCTSTR lpszVerb = L"GET";
LPCTSTR lpszObjectName = L"/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand";//L"/urchin.js";
LPCTSTR lpszVersion = NULL; // 默认.
LPCTSTR lpszReferrer = L""; // 没有引用页
LPCTSTR *lplpszAcceptTypes = NULL; // Accpet所有类型.
DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
INTERNET_FLAG_KEEP_CONNECTION |
INTERNET_FLAG_NO_AUTH |
INTERNET_FLAG_NO_COOKIES |
INTERNET_FLAG_NO_UI |
INTERNET_FLAG_SECURE | //设置启用HTTPS
INTERNET_FLAG_RELOAD;
DWORD dwOpenRequestContext = 0;
//初始化Request
HINTERNET hRequest = HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion,
lpszReferrer, lplpszAcceptTypes,
dwOpenRequestFlags, dwOpenRequestContext);
//发送Request
BOOL bResult = HttpSendRequest(hRequest, NULL, 0, NULL, 0);
//失败
if (!bResult)
{
fprintf(stderr, "HttpSendRequest failed, error = %d (0x%x)\n",
GetLastError(), GetLastError());
return -2;
}
//第三步,获取返回结果
//获得HTTP Response Header信息
DWORD dwInfoLevel = HTTP_QUERY_RAW_HEADERS_CRLF;
DWORD dwInfoBufferLength = 2048;
BYTE *pInfoBuffer = (BYTE *)malloc(dwInfoBufferLength+2);
while (!HttpQueryInfo(hRequest, dwInfoLevel, pInfoBuffer, &dwInfoBufferLength, NULL))
{
DWORD dwError = GetLastError();
if (dwError == ERROR_INSUFFICIENT_BUFFER)
{
free(pInfoBuffer);
pInfoBuffer = (BYTE *)malloc(dwInfoBufferLength + 2);
}
else
{
fprintf(stderr, "HttpQueryInfo failed, error = %d (0x%x)\n",
GetLastError(), GetLastError());
break;
}
}
pInfoBuffer[dwInfoBufferLength] = '\0';
pInfoBuffer[dwInfoBufferLength + 1] = '\0';
printf("%s", pInfoBuffer); //很奇怪HttpQueryInfo保存的格式是wchar_t 和下面的InternetReadFile不一样
free(pInfoBuffer);
//获得HTTP Response 的 Body, 这里是png图片二进制数据流
DeleteFile(L"verifycode.png");
DWORD dwBytesAvailable;
while (InternetQueryDataAvailable(hRequest, &dwBytesAvailable, 0, 0))
{
BYTE *pMessageBody = (BYTE *)malloc(dwBytesAvailable+1);
DWORD dwBytesRead;
BOOL bResult = InternetReadFile(hRequest, pMessageBody,
dwBytesAvailable, &dwBytesRead);
if (!bResult)
{
fprintf(stderr, "InternetReadFile failed, error = %d (0x%x)\n",
GetLastError(), GetLastError());
break;
}
if (dwBytesRead == 0)
break; // End of File.
pMessageBody[dwBytesRead] = '\0';
printf("%s", pMessageBody); //InternetReadFile读出来的是普通的char. InternetReadFileEx 似乎是有宽字节版本的
//MessageBox((LPCTSTR)(char*)pMessageBody);
write_file("verifycode.png",(char*)pMessageBody,dwBytesRead);
free(pMessageBody);
}
return 0;
}