http请求

sdz1219 2015-10-23 04:11:12
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;
}
...全文
76 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxway 2015-10-23
  • 打赏
  • 举报
回复
你的问题是什么呢?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧