http请求
int CommonUtil::HttpSendRequest(wstring wstrURL,
wstring wstrVerb,
LPVOID lpOptional,
DWORD dwOptionalLength,
string &strResult){
strResult="";
DWORD dwSize = 0;
DWORD dwFlags = 0;
std::wstring strServer;
std::wstring strObject;
INTERNET_PORT nPort;
INT nScheme;
BOOL bHttps = FALSE;
BOOL bResult = FALSE;
HINTERNET hSession(NULL);
HINTERNET hConnect(NULL);
HINTERNET hRequest(NULL);
wstring strHeaders=L"Content-Type: application/x-www-form-urlencoded\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate\r\n";
if (!ParseUrl(wstrURL.c_str(), strServer, nPort, strObject, nScheme)) {
strResult=ReadErrorMsg("解析URL错误", 0);
return CONST_SYSTEM_ERROR;
}
// 打开会话
//LOG_INFO("打开会话...");
hSession = InternetOpenW(
L"Mozilla/4.0 (compatible; MSIE 5.22)",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0
);
if (NULL == hSession) {
strResult=ReadErrorMsg("InternetOpen失败", GetLastError());
return CONST_SYSTEM_ERROR;
}
// 打开连接
//LOG_INFO("打开连接...");
hConnect = InternetConnectW(hSession,
strServer.c_str(),
nPort,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
NULL
);
if (NULL == hConnect ) {
strResult=ReadErrorMsg("InternetConnect失败", GetLastError());
return CONST_SYSTEM_ERROR;
}
// 设置请求标志
//LOG_INFO("设置请求标志...");
dwFlags = INTERNET_FLAG_RELOAD;
if (INTERNET_SCHEME_HTTPS == nScheme) {
dwFlags |= INTERNET_FLAG_SECURE;
dwFlags |= INTERNET_FLAG_IGNORE_CERT_CN_INVALID;
dwFlags |= INTERNET_FLAG_IGNORE_CERT_DATE_INVALID;
}
//if (!bAutoRedirect) {
dwFlags |= INTERNET_FLAG_NO_AUTO_REDIRECT;
//}
// 打开请求
//LOG_INFO("打开请求...");
hRequest = HttpOpenRequestW(hConnect,
wstrVerb.c_str(),
strObject.c_str(),
NULL,
NULL,
NULL,
dwFlags,
/*(DWORD_PTR)this*/
NULL
);
if (NULL == hRequest) {
strResult=ReadErrorMsg("HttpOpenRequest失败", GetLastError());
return CONST_SYSTEM_ERROR;
}
/*if (!strCookie.empty()) {
strHeaders += L"Cookie: ";
strHeaders += strCookie;
strHeaders += L"\r\n";
}*/
LPCWSTR lpszHeaders = strHeaders.empty( ) ? NULL : strHeaders.c_str();
/*LPVOID lpOptional = strOptional.empty( ) ? NULL : (LPVOID)strOptional.c_str();*/
//LOG_INFO("设置超时...");
DWORD dwTimeout = AppConfig::GetInstance()->GetTimeout();
// 设置标志
InternetSetOption(hRequest,
INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT,
&dwTimeout,
sizeof(DWORD)
);
if (INTERNET_SCHEME_HTTPS == nScheme) {
DWORD dwBuffLen = sizeof(dwFlags);
InternetQueryOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_REVOCATION;
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
InternetSetOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, sizeof(dwFlags)) ;
}
//LOG_INFO("发送请求...");
bResult = HttpSendRequestW( hRequest,
lpszHeaders,
strHeaders.length(),
lpOptional,
dwOptionalLength
);
if (!bResult) {
if (ERROR_INTERNET_TIMEOUT == GetLastError()) {
//dwStatusCode = HTTP_STATUS_REQUEST_TIMEOUT;
strResult = "Request timeout!";
}else{
strResult=ReadErrorMsg("HttpSendRequestW失败", GetLastError());
}
return CONST_SYSTEM_ERROR;
}
//LOG_INFO("读取结果...");
if (bResult) {
//OnReadCookie(hRequest);
//OnReadStatusCode(hRequest);
DWORD dwSize = 0;
/****************ReadStatusCode***********************/
DWORD dwStatusCode = 0;
dwSize = sizeof( DWORD );
if ( !HttpQueryInfo( hRequest,
HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
&dwStatusCode,
&dwSize,
NULL
) ){
strResult = "读取状态失败";
return CONST_SYSTEM_ERROR;
}
if(HTTP_STATUS_OK!=dwStatusCode){
char sz[24] = { 0 };
sprintf_s( sz, 24, "%d", dwStatusCode );
strResult = "StatusCode:"+string(sz);
return CONST_SYSTEM_ERROR;
}
/****************ReadStatusCode***********************/
/****************ReadData***********************/
LPSTR lpszData =0;
DWORD dwDownloaded = 0;
dwSize=0;
while ( InternetQueryDataAvailable( hRequest, &dwSize, 0, 0 ) ) {
if ( dwSize == 0 ) {
break;
}
lpszData = new CHAR[ dwSize+1 ];
if( InternetReadFile( hRequest,
(LPVOID)lpszData,
dwSize,
&dwDownloaded )
) {
strResult += std::string( (char*) lpszData, dwDownloaded );
}
delete[] lpszData;
if ( dwDownloaded == 0 ) {
break;
}
}
//EndRequest();
strResult=CommonUtil::Utf8ToGBK(strResult);
/****************ReadData***********************/
return CONST_NOT_ERROR;
}
else {
//LOG_ERROR("HttpSendRequest失败", GetLastError());
//EndRequest();
}
return CONST_SYSTEM_ERROR;
}