HTTP请求网页(包括HTTPS)
借鉴了网上的,忘记是在哪里看到的了。 增加了对HTTPS的支持。用到了MFC的CString,可以自行修改无需MFC。直接贴代码:
WebClient.h:
#pragma once
#include <Windows.h>
#include <winhttp.h>
#pragma comment(lib, "Winhttp.lib")
#include <vector>#ifdef _DLL
#ifndef _AFXDLL
#error 需要MFC支持!
#endif
#endif#ifndef _UNICODE
#error 只能用于UNICODE项目中!
#endif//小型动态缓冲区
//仅支持基本数据类型
template<typename T>
class DynamicBuffer
{enum {DEFAULT_SIZE = 32000, //默认初始大小GROW_SIEZ = 32000, //每次增长大小};
private:T *m_pData;size_t m_nData;size_t m_nBuffer;
public:explicit DynamicBuffer(const T *pData = NULL, size_t nData = 0);//允许用右值构造DynamicBuffer(const DynamicBuffer &&RValue);//允许用右值赋值DynamicBuffer& operator = (const DynamicBuffer &&RValue);~DynamicBuffer();//追加数据void Append(const T *pData, size_t nData);//清空所有数据,恢复默认构造后的状态void Clear();//释放所有内存,一般在不再使用时才调用bool Release();//获取保存的数据大小size_t Size(){return m_nData;}const T* Data(){return m_pData;}operator const T*(){return m_pData;}
private:DynamicBuffer(const DynamicBuffer&);DynamicBuffer& operator = (const DynamicBuffer&);
};class WebClient
{
public:enum RetCode {SUCCESS = 0,INVALID_URL = 1,WINHTTP_ERROR = 2,INTERNET_ERROR = 3,TIMEOUT_ERROR = 4,CREATE_FILE_ERROR = 5,};enum {ANSI = 1,UTF8 = 2,};
private:HINTERNET m_hSession;CStringW m_strUserAgent;int m_CharSet;
public:explicit WebClient(LPCWSTR wszUserAgent = L"Mozilla/5.0");~WebClient();//清理Cookie,重置会话void ClearAll();//发起GET请求,获取页面HTMLRetCode Get(LPCWSTR wszUrl, CStringW &strHtml,int iCnt = 0);RetCode GetEx(LPCWSTR wszUrl, const CStringW &strHead, CStringW &strHtml,int iCnt = 0);RetCode GetEx(LPCWSTR wszUrl, const std::vector<CStringW> &vec_strHead, CStringW &strHtml,int iCnt =0);//发起POST请求,获取返回的HTMLRetCode Post(LPCWSTR wszUrl, const CStringW &strPostData, CStringW &strHtml);RetCode PostEx(LPCWSTR wszUrl, const CStringW &strPostData, const CStringW &strHead, CStringW &strHtml);RetCode PostEx(LPCWSTR wszUrl, const CStringW &strPostData, const std::vector<CStringW> &vec_strHead, CStringW &strHtml);//下载文件RetCode DownloadFile(LPCWSTR wszUrl, LPCWSTR wszFilePath);//设置超时值bool SetTimeouts(DWORD dwConnectTimeout, DWORD dwTransmissionTimeout);//设置代理bool SetProxy(const CStringW &strProxy);//取消代理bool RemoveProxy();//设置目标网站编码,默认为UTF8bool CharSet(int iCharSet);
private:enum {MAX_URL_LENGTH = 2084,TEMP_BUFFER_SIZE = 4096,//4000,};//分析URLbool ParseUrl(LPCWSTR wszUrl, int &iProtocol, WORD &nPort, CStringW &strHostName, CStringW &strUrlPath);//编码转换CStringW UTF8ToUTF16(LPCSTR szUTF8, int nLen = -1);CStringW AnsiToUTF16(LPCSTR szAnsi, int nLen = -1);CStringA UTF16ToUTF8(LPCWSTR wszUTF16, int nLen = -1);private:WebClient(const WebClient&);WebClient& operator = (const WebClient&);
};
WebClient.cpp:
#include "stdafx.h"
#include "WebClient.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif//小型动态缓冲区
template<typename T>
DynamicBuffer<T>::DynamicBuffer(const T *pData /*=NULL*/, size_t nData /*=0*/)
{ASSERT(!(!pData && nData != 0));if (nData > DEFAULT_SIZE)m_nBuffer = nData + GROW_SIEZ;elsem_nBuffer = DEFAULT_SIZE;m_pData = (T*)malloc(m_nBuffer * sizeof(T));memset(m_pData, 0, m_nBuffer * sizeof(T));if (pData)memcpy_s(m_pData, m_nBuffer * sizeof(T), pData, nData * sizeof(T));m_nData = nData;
}//允许用右值构造
template<typename T>
DynamicBuffer<T>::DynamicBuffer(const DynamicBuffer &&RValue)
{m_pData = RValue.m_pData;m_nData = RValue.m_nData;m_nBuffer = RValue.m_nBuffer;
}//允许用右值赋值
template<typename T>
DynamicBuffer<T>& DynamicBuffer<T>::operator = (const DynamicBuffer &&RValue)
{if (m_pData)free(m_pData);m_pData = RValue.m_pData;m_nData = RValue.m_nData;m_nBuffer = RValue.m_nBuffer;return *this;
}template<typename T>
DynamicBuffer<T>::~DynamicBuffer()
{Release();
}//追加数据
template<typename T>
void DynamicBuffer<T>::Append(const T *pData, size_t nData)
{ASSERT(!(pData == NULL && nData != 0));if (nData > m_nBuffer - m_nData){//需要重新分配内存size_t nNewBuffer = 0;if (nData > GROW_SIEZ)nNewBuffer = m_nData + nData + GROW_SIEZ;elsenNewBuffer = m_nBuffer + GROW_SIEZ;m_pData = (T*)realloc(m_pData, nNewBuffer * sizeof(T));memset(m_pData + m_nBuffer, 0, (nNewBuffer - m_nBuffer) * sizeof(T));m_nBuffer = nNewBuffer;}memcpy_s(m_pData + m_nData, (m_nBuffer - m_nData) * sizeof(T), pData, nData * sizeof(T));m_nData += nData;
}//释放所有内存,一般在不再使用时才调用
template<typename T>
bool DynamicBuffer<T>::Release()
{if (m_pData){free(m_pData);m_pData = NULL;m_nData = 0;m_nBuffer = 0;return true;}elsereturn false;
}//清空所有数据,恢复默认构造后的状态
template<typename T>
void DynamicBuffer<T>::Clear()
{if (m_pData && m_nBuffer == DEFAULT_SIZE){//已经是默认构造后的大小,清空下数据即可memset(m_pData, 0, m_nBuffer);m_nData = 0;return;}if (m_pData)free(m_pData);m_pData = (T*)malloc(DEFAULT_SIZE * sizeof(T));memset(m_pData, 0, DEFAULT_SIZE * sizeof(T));m_nBuffer = DEFAULT_SIZE;m_nData = 0;
}WebClient::WebClient(LPCWSTR wszUserAgent /*= L"Mozilla/5.0"*/)
{ASSERT(wszUserAgent != NULL);m_CharSet = UTF8;m_strUserAgent = wszUserAgent;m_hSession = WinHttpOpen(m_strUserAgent, WINHTTP_ACCESS_TYPE_NO_PROXY,WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, NULL);//自动跟踪所有重定向DWORD dwOption = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;BOOL bSuccessSet = WinHttpSetOption(m_hSession, WINHTTP_OPTION_REDIRECT_POLICY, &dwOption, sizeof(DWORD));ASSERT(m_hSession != NULL && bSuccessSet);
}WebClient::~WebClient()
{if (m_hSession)WinHttpCloseHandle(m_hSession);
}//清理Cookie,重置会话
void WebClient::ClearAll()
{if (m_hSession)WinHttpCloseHandle(m_hSession);m_hSession = WinHttpOpen(m_strUserAgent, WINHTTP_ACCESS_TYPE_NO_PROXY,WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, NULL);//自动跟踪所有重定向DWORD dwOption = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;BOOL bSuccessSet = WinHttpSetOption(m_hSession, WINHTTP_OPTION_REDIRECT_POLICY, &dwOption, sizeof(DWORD));ASSERT(m_hSession != NULL && bSuccessSet);
}//发起GET请求,获取页面HTML
WebClient::RetCode WebClient::Get(LPCWSTR wszUrl, CStringW &strHtml,int iCnt)
{return GetEx(wszUrl, L"", strHtml,iCnt);
}WebClient::RetCode WebClient::GetEx(LPCWSTR wszUrl, const CStringW &strHead, CStringW &strHtml,int iCnt)
{std::vector<CStringW> vec_strHead;if (!strHead.IsEmpty())vec_strHead.push_back(strHead);return GetEx(wszUrl, vec_strHead, strHtml,iCnt);
}WebClient::RetCode WebClient::GetEx(LPCWSTR wszUrl, const std::vector<CStringW> &vec_strHead, CStringW &strHtml,int iCnt)
{ASSERT(wszUrl != NULL);//解析URLint iProtocal;WORD nPort;CStringW strHostName, strUrlPath;if (!ParseUrl(wszUrl, iProtocal, nPort, strHostName, strUrlPath))return INVALID_URL;HINTERNET hConnect = WinHttpConnect(m_hSession, strHostName, nPort, NULL);if (!hConnect)return WINHTTP_ERROR;//不接受缓存DWORD dwFlags = WINHTTP_FLAG_REFRESH;if (iProtocal == INTERNET_SCHEME_HTTPS){dwFlags |= WINHTTP_FLAG_SECURE;}HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", strUrlPath, NULL,WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, dwFlags);if (!hRequest){WinHttpCloseHandle(hConnect);return WINHTTP_ERROR;}////添加请求头 FOR HTTPSDWORD dwBuffLen = sizeof(dwFlags); WinHttpQueryOption (hRequest, WINHTTP_OPTION_SECURITY_FLAGS,(LPVOID)&dwFlags, &dwBuffLen);dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;dwFlags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;dwFlags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;// dwFlags |= SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;WinHttpSetOption (hRequest, WINHTTP_OPTION_SECURITY_FLAGS,&dwFlags, sizeof (dwFlags) );end//for (size_t i=0; i<vec_strHead.size(); i++){if (!vec_strHead[i].IsEmpty()){WinHttpAddRequestHeaders(hRequest, vec_strHead[i],-1L, WINHTTP_ADDREQ_FLAG_ADD|WINHTTP_ADDREQ_FLAG_REPLACE);}}////发送请求if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, WINHTTP_NO_REQUEST_DATA, NULL, NULL, NULL)){DWORD dwErrorCode = GetLastError();RetCode retcode;if (dwErrorCode == ERROR_WINHTTP_NAME_NOT_RESOLVED || dwErrorCode == ERROR_WINHTTP_CANNOT_CONNECT ||dwErrorCode == ERROR_WINHTTP_INVALID_SERVER_RESPONSE || dwErrorCode == ERROR_WINHTTP_CONNECTION_ERROR)retcode = INTERNET_ERROR;else if (dwErrorCode == ERROR_WINHTTP_TIMEOUT)retcode = TIMEOUT_ERROR;elseretcode = WINHTTP_ERROR;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);return retcode;}//接收内容if (!WinHttpReceiveResponse(hRequest, NULL)){DWORD dwErrorCode = GetLastError();RetCode retcode;if (dwErrorCode == ERROR_WINHTTP_NAME_NOT_RESOLVED || dwErrorCode == ERROR_WINHTTP_CANNOT_CONNECT ||dwErrorCode == ERROR_WINHTTP_INVALID_SERVER_RESPONSE || dwErrorCode == ERROR_WINHTTP_CONNECTION_ERROR)retcode = INTERNET_ERROR;else if (dwErrorCode == ERROR_WINHTTP_TIMEOUT)retcode = TIMEOUT_ERROR;elseretcode = WINHTTP_ERROR;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);return retcode;}//读出内容DynamicBuffer<char> DyBuffData;char *pTempBuffer = new char[TEMP_BUFFER_SIZE];DWORD dwRead = 0;//写入文件FILE *fp;char name[64];ZeroMemory(name,64);//这边我所请求的数据是已知的jpg图片sprintf(name,"%d.jpg",iCnt);if ((fp = fopen(name, "ab+")) == NULL) // 存储图片return CREATE_FILE_ERROR;do {memset(pTempBuffer, 0, TEMP_BUFFER_SIZE);if (!WinHttpReadData(hRequest, pTempBuffer, TEMP_BUFFER_SIZE, &dwRead)){DWORD dwErrorCode = GetLastError();RetCode retcode;if (dwErrorCode == ERROR_WINHTTP_NAME_NOT_RESOLVED || dwErrorCode == ERROR_WINHTTP_CANNOT_CONNECT ||dwErrorCode == ERROR_WINHTTP_INVALID_SERVER_RESPONSE || dwErrorCode == ERROR_WINHTTP_CONNECTION_ERROR)retcode = INTERNET_ERROR;else if (dwErrorCode == ERROR_WINHTTP_TIMEOUT)retcode = TIMEOUT_ERROR;elseretcode = WINHTTP_ERROR;delete [] pTempBuffer;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);return retcode;}dwRead > 0?fwrite(pTempBuffer, dwRead,1 ,fp):NULL;DyBuffData.Append(pTempBuffer, dwRead);} while (dwRead > 0);delete [] pTempBuffer;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);//关闭文件fclose(fp);//进行编码转换if (m_CharSet == UTF8){strHtml = UTF8ToUTF16(DyBuffData, DyBuffData.Size());}else{strHtml = AnsiToUTF16(DyBuffData, DyBuffData.Size());}return SUCCESS;
}//下载文件
WebClient::RetCode WebClient::DownloadFile(LPCWSTR wszUrl, LPCWSTR wszFilePath)
{ASSERT(wszUrl != NULL && wszFilePath != NULL);//解析URLint iProtocal;WORD nPort;CStringW strHostName, strUrlPath;if (!ParseUrl(wszUrl, iProtocal, nPort, strHostName, strUrlPath))return INVALID_URL;HINTERNET hConnect = WinHttpConnect(m_hSession, strHostName, nPort, NULL);if (!hConnect)return WINHTTP_ERROR;//不接受缓存DWORD dwFlags = WINHTTP_FLAG_REFRESH;if (iProtocal == INTERNET_SCHEME_HTTPS)dwFlags |= WINHTTP_FLAG_SECURE;HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", strUrlPath, NULL,WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, dwFlags);if (!hRequest){WinHttpCloseHandle(hConnect);return WINHTTP_ERROR;}//发送请求if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, WINHTTP_NO_REQUEST_DATA, NULL, NULL, NULL)){DWORD dwErrorCode = GetLastError();RetCode retcode;if (dwErrorCode == ERROR_WINHTTP_NAME_NOT_RESOLVED || dwErrorCode == ERROR_WINHTTP_CANNOT_CONNECT ||dwErrorCode == ERROR_WINHTTP_INVALID_SERVER_RESPONSE || dwErrorCode == ERROR_WINHTTP_CONNECTION_ERROR)retcode = INTERNET_ERROR;else if (dwErrorCode == ERROR_WINHTTP_TIMEOUT)retcode = TIMEOUT_ERROR;elseretcode = WINHTTP_ERROR;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);return retcode;}//接收内容if (!WinHttpReceiveResponse(hRequest, NULL)){DWORD dwErrorCode = GetLastError();RetCode retcode;if (dwErrorCode == ERROR_WINHTTP_NAME_NOT_RESOLVED || dwErrorCode == ERROR_WINHTTP_CANNOT_CONNECT ||dwErrorCode == ERROR_WINHTTP_INVALID_SERVER_RESPONSE || dwErrorCode == ERROR_WINHTTP_CONNECTION_ERROR)retcode = INTERNET_ERROR;else if (dwErrorCode == ERROR_WINHTTP_TIMEOUT)retcode = TIMEOUT_ERROR;elseretcode = WINHTTP_ERROR;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);return retcode;}//读出内容,写入到文件CFile File;if (!File.Open(wszFilePath, CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite)){WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);return CREATE_FILE_ERROR;}char *pTempBuffer = new char[TEMP_BUFFER_SIZE];DWORD dwRead = 0;do {memset(pTempBuffer, 0, TEMP_BUFFER_SIZE);if (!WinHttpReadData(hRequest, pTempBuffer, TEMP_BUFFER_SIZE, &dwRead)){DWORD dwErrorCode = GetLastError();RetCode retcode;if (dwErrorCode == ERROR_WINHTTP_NAME_NOT_RESOLVED || dwErrorCode == ERROR_WINHTTP_CANNOT_CONNECT ||dwErrorCode == ERROR_WINHTTP_INVALID_SERVER_RESPONSE || dwErrorCode == ERROR_WINHTTP_CONNECTION_ERROR)retcode = INTERNET_ERROR;else if (dwErrorCode == ERROR_WINHTTP_TIMEOUT)retcode = TIMEOUT_ERROR;elseretcode = WINHTTP_ERROR;delete [] pTempBuffer;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);//未下载完,网络异常,删除文件File.Close();::DeleteFileW(wszFilePath);return retcode;}File.Write(pTempBuffer, dwRead);} while (dwRead > 0);delete [] pTempBuffer;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);File.Close();return SUCCESS;
}//发起POST请求,获取返回的HTML
WebClient::RetCode WebClient::Post(LPCWSTR wszUrl, const CStringW &strPostData, CStringW &strHtml)
{return PostEx(wszUrl, strPostData, L"", strHtml);
}WebClient::RetCode WebClient::PostEx(LPCWSTR wszUrl, const CStringW &strPostData, const CStringW &strHead, CStringW &strHtml)
{std::vector<CStringW> vec_strHead;if (!strHead.IsEmpty())vec_strHead.push_back(strHead);return PostEx(wszUrl, strPostData, vec_strHead, strHtml);
}WebClient::RetCode WebClient::PostEx(LPCWSTR wszUrl, const CStringW &strPostData, const std::vector<CStringW> &vec_strHead, CStringW &strHtml)
{ASSERT(wszUrl != NULL);//解析URLint iProtocal;WORD nPort;CStringW strHostName, strUrlPath;if (!ParseUrl(wszUrl, iProtocal, nPort, strHostName, strUrlPath))return INVALID_URL;HINTERNET hConnect = WinHttpConnect(m_hSession, strHostName, nPort, NULL);if (!hConnect)return WINHTTP_ERROR;//不接受缓存DWORD dwFlags = WINHTTP_FLAG_REFRESH;if (iProtocal == INTERNET_SCHEME_HTTPS)dwFlags |= WINHTTP_FLAG_SECURE;HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"POST", strUrlPath, NULL,WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, dwFlags);if (!hRequest){WinHttpCloseHandle(hConnect);return WINHTTP_ERROR;}//添加POST必备的请求头WinHttpAddRequestHeaders(hRequest, L"Content-Type: application/x-www-form-urlencoded",-1L, WINHTTP_ADDREQ_FLAG_ADD|WINHTTP_ADDREQ_FLAG_REPLACE);//添加其它请求头for (size_t i=0; i<vec_strHead.size(); i++){if (!vec_strHead[i].IsEmpty()){WinHttpAddRequestHeaders(hRequest, vec_strHead[i],-1L, WINHTTP_ADDREQ_FLAG_ADD|WINHTTP_ADDREQ_FLAG_REPLACE);}}//转换编码CStringA strPostData_utf8 = UTF16ToUTF8(strPostData);//发送请求if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, (LPSTR)(LPCSTR)strPostData_utf8, strPostData_utf8.GetLength(), strPostData_utf8.GetLength(), NULL)){DWORD dwErrorCode = GetLastError();RetCode retcode;if (dwErrorCode == ERROR_WINHTTP_NAME_NOT_RESOLVED || dwErrorCode == ERROR_WINHTTP_CANNOT_CONNECT ||dwErrorCode == ERROR_WINHTTP_INVALID_SERVER_RESPONSE || dwErrorCode == ERROR_WINHTTP_CONNECTION_ERROR)retcode = INTERNET_ERROR;else if (dwErrorCode == ERROR_WINHTTP_TIMEOUT)retcode = TIMEOUT_ERROR;elseretcode = WINHTTP_ERROR;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);return retcode;}//接收内容if (!WinHttpReceiveResponse(hRequest, NULL)){DWORD dwErrorCode = GetLastError();RetCode retcode;if (dwErrorCode == ERROR_WINHTTP_NAME_NOT_RESOLVED || dwErrorCode == ERROR_WINHTTP_CANNOT_CONNECT ||dwErrorCode == ERROR_WINHTTP_INVALID_SERVER_RESPONSE || dwErrorCode == ERROR_WINHTTP_CONNECTION_ERROR)retcode = INTERNET_ERROR;else if (dwErrorCode == ERROR_WINHTTP_TIMEOUT)retcode = TIMEOUT_ERROR;elseretcode = WINHTTP_ERROR;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);return retcode;}//读出内容DynamicBuffer<char> DyBuffData;char *pTempBuffer = new char[TEMP_BUFFER_SIZE];DWORD dwRead = 0;do {memset(pTempBuffer, 0, TEMP_BUFFER_SIZE);if (!WinHttpReadData(hRequest, pTempBuffer, TEMP_BUFFER_SIZE, &dwRead)){DWORD dwErrorCode = GetLastError();RetCode retcode;if (dwErrorCode == ERROR_WINHTTP_NAME_NOT_RESOLVED || dwErrorCode == ERROR_WINHTTP_CANNOT_CONNECT ||dwErrorCode == ERROR_WINHTTP_INVALID_SERVER_RESPONSE || dwErrorCode == ERROR_WINHTTP_CONNECTION_ERROR)retcode = INTERNET_ERROR;else if (dwErrorCode == ERROR_WINHTTP_TIMEOUT)retcode = TIMEOUT_ERROR;elseretcode = WINHTTP_ERROR;delete [] pTempBuffer;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);return retcode;}DyBuffData.Append(pTempBuffer, dwRead);} while (dwRead > 0);delete [] pTempBuffer;WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);//进行编码转换if (m_CharSet == UTF8)strHtml = UTF8ToUTF16(DyBuffData, DyBuffData.Size());elsestrHtml = AnsiToUTF16(DyBuffData, DyBuffData.Size());return SUCCESS;
}//分析URL
bool WebClient::ParseUrl(LPCWSTR wszUrl, int &iProtocol, WORD &nPort, CStringW &strHostName, CStringW &strUrlPath)
{ASSERT(wszUrl != NULL);WCHAR *wszHostName = new WCHAR[MAX_URL_LENGTH+1];WCHAR *wszUrlPath = new WCHAR[MAX_URL_LENGTH+1];memset(wszHostName, 0 , MAX_URL_LENGTH+1);memset(wszUrlPath, 0, MAX_URL_LENGTH+1);URL_COMPONENTS urlComp = {sizeof(URL_COMPONENTS)};urlComp.lpszHostName = wszHostName;urlComp.dwHostNameLength = MAX_URL_LENGTH;urlComp.lpszUrlPath = wszUrlPath;urlComp.dwUrlPathLength = MAX_URL_LENGTH;BOOL bSuccessParse = WinHttpCrackUrl(wszUrl, NULL, NULL, &urlComp);if (bSuccessParse){iProtocol = urlComp.nScheme;nPort = urlComp.nPort;strHostName = urlComp.lpszHostName;strUrlPath = urlComp.lpszUrlPath;}delete [] wszHostName;delete [] wszUrlPath;if (bSuccessParse)return true;elsereturn false;
}//编码转换
CStringW WebClient::UTF8ToUTF16(LPCSTR szUTF8, int nLen /*= -1*/)
{//先获取转换后需要的缓冲区大小DWORD nWszLen = MultiByteToWideChar(CP_UTF8, NULL, szUTF8, nLen, NULL, NULL);CStringW strUTF16;nWszLen = MultiByteToWideChar(CP_UTF8, NULL, szUTF8, nLen, strUTF16.GetBuffer(nWszLen), nWszLen);strUTF16.ReleaseBuffer(nWszLen);return strUTF16;
}CStringW WebClient::AnsiToUTF16(LPCSTR szAnsi, int nLen /*= -1*/)
{//先获取转换后需要的缓冲区大小DWORD nWszLen = MultiByteToWideChar(CP_ACP, NULL, szAnsi, nLen, NULL, NULL);CStringW strUTF16;nWszLen = MultiByteToWideChar(CP_ACP, NULL, szAnsi, nLen, strUTF16.GetBuffer(nWszLen), nWszLen);strUTF16.ReleaseBuffer(nWszLen);return strUTF16;
}CStringA WebClient::UTF16ToUTF8(LPCWSTR wszUTF16, int nLen /*= -1*/)
{//先获取转换后需要的缓冲区大小DWORD nszLen = WideCharToMultiByte(CP_UTF8, NULL, wszUTF16, nLen, NULL, NULL, NULL, NULL);CStringA strUTF8;nszLen = WideCharToMultiByte(CP_UTF8, NULL, wszUTF16, nLen, strUTF8.GetBuffer(nszLen), nszLen, NULL, NULL);strUTF8.ReleaseBuffer(nszLen);return strUTF8;
}//设置超时值
bool WebClient::SetTimeouts(DWORD dwConnectTimeout, DWORD dwTransmissionTimeout)
{if (WinHttpSetTimeouts(m_hSession, 0, dwConnectTimeout, dwTransmissionTimeout, dwTransmissionTimeout))return true;elsereturn false;
}//设置代理
bool WebClient::SetProxy(const CStringW &strProxy)
{WINHTTP_PROXY_INFO ProxyInfo = {WINHTTP_ACCESS_TYPE_NAMED_PROXY,(LPWSTR)(LPCWSTR)strProxy, (LPWSTR)(LPCWSTR)strProxy};if (WinHttpSetOption(m_hSession, WINHTTP_OPTION_PROXY, &ProxyInfo, sizeof(WINHTTP_PROXY_INFO)))return true;elsereturn false;
}//取消代理
bool WebClient::RemoveProxy()
{WINHTTP_PROXY_INFO ProxyInfo = {WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL};if (WinHttpSetOption(m_hSession, WINHTTP_OPTION_PROXY, &ProxyInfo, sizeof(WINHTTP_PROXY_INFO)))return true;elsereturn false;
}//设置目标网站编码
bool WebClient::CharSet(int iCharSet)
{if (iCharSet != ANSI && iCharSet != UTF8)return false;m_CharSet = iCharSet;return true;
}
调用:
WebClient webclient;g_iCnt = 0;CString strHtml;//请求12306的图片为例webclient.Get(_T("https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.7099142521619793"), strHtml,g_iCnt);
转载于:https://www.cnblogs.com/LandAll/p/4465219.html
HTTP请求网页(包括HTTPS)相关推荐
- 利用wget 抓取 网站网页 包括css背景图片
利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...
- 使用requests请求网页时,返回的页面信息有时是乱码,如下代码
使用requests请求网页时,返回的页面信息有时是乱码,如下代码 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895,817, 687 有任何不懂的都可以在里面交流, ...
- Python使用request包请求网页乱码解决方法
使用requests请求网页时,返回的页面信息有时是乱码,如下代码 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) Appl ...
- nginx优化——包括https、keepalive等
nginx优化--包括https.keepalive等 一.nginx之tcp_nopush.tcp_nodelay.sendfile 1.TCP_NODELAY 你怎么可以强制 socket 在它的 ...
- 请求网页时,怎么给我返回了一段 JavaScript 代码
今天给大家带来的是一个论坛网站,牛仔俱乐部-努比亚社区, 网址为:https://bbs.nubia.cn/ 如果你想要获取这个网站的源代码的话,必须要先获取一个 cookie,其字段名为:acw_s ...
- java如何做网页_java怎么做一个简单网页?网页包括什么?
学了java程序之后,大家就可以将这些运用到生活中去,比如做一个简单的网页.正好也可以检测自己学了怎么样,那么接下来,我们就来给大家讲解一下这方面的内容. 用Java语言编写实现一个简单的WEB浏览器 ...
- flutter_webview Ios端请求网页显示空白
flutter_webview Ios端请求网页显示空白 在使用flutter_webview插件时,请求网页在Android端运行正常,但在IOS端一些网页可以正常打开而一些网页无法打开. 经过排查 ...
- python怎么做https请求_Python使用https请求的方法
Python使用https请求的方法 发布时间:2020-07-17 11:13:34 来源:亿速云 阅读:139 作者:清晨 这篇文章主要介绍Python使用https请求的方法,文中介绍的非常详细 ...
- 在Nginx中让所有HTTP请求转发到HTTPS
title: 在Nginx中让所有HTTP请求转发到HTTPS date: 2017-10-23 20:50:24 tags: nginx http https categories: 运维 背景 在 ...
最新文章
- 【bzoj3261】最大异或和 可持久化Trie树
- HDU1533(最小权完美匹配)
- android 怎么获取当天日期_18个Java8日期处理的实践,非常有用!
- 为什么在进程中还需要线程呢?
- Python日志模块学习,从这里开始...
- PAT 乙级 1009. 说反话 (20) Java版
- 如何识别媒体偏见_面部识别技术存在偏见:为什么我们不应该盲目相信新技术
- NB-IOT开发实战
- python批量检测域名和url能否打开
- 基于LM324的音调放大电路
- 五笔字型初学者常见问题答疑
- 软件开发角色知识概括
- curl myip.ipip.net curl ip.cn curl cip.cc
- WebRTC 教程二:WebRTC API 和 Leak
- 5g网速究竟有多快?比4g快多少?
- 中国一票否决Arm被购案的六个理由
- 微信查券返利机器人公众号搭建教程分享
- python实现多句话翻译多语种(调翻译接口)
- 做梦都想复习的网络编程
- 数字图像隐写术之JPEG 隐写分析
热门文章
- 关于mac电脑如何导入ps笔刷您知道多少?
- Linux 10GE端口,ES5D001VST00 2端口 万兆10GE SFP 华为 S5700交换机 光接口板
- RC延时电路简要分析
- 测试人最容易背负的三口“锅”
- C语言与C++初学“你好 世界”
- 使用ffmpeg调用摄像头录制视频(C#)
- 业余数学牛人的数学自学心得(转)
- lds链接脚本基础与例子分析
- 要想富,先有LU,超能鹿战队LU开盘涨幅240%
- 在Github账户如何修改设置个人头像