http请求

sdz1219 sdz1219 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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;
}
...全文
评论 1
收藏 已收藏
分享
返回顶部
sdz1219
C++ 语言 65,214 成员 250,514 内容