18,356
社区成员
发帖
与我相关
我的任务
分享
bool CProtocol::Request(const string& LoginXml, string& ResponseXml)
{
//初始化WinINet
HINTERNET hInternet = InternetOpen("Testing", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); //初始化WinINet
if (0 == hInternet)
{
return false;
}
//连接服务器
HINTERNET hConnect;
hConnect = InternetConnect(hInternet, m_ip.c_str(), m_port,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (0 == hConnect)
{
if (NULL != hInternet)
{
InternetCloseHandle(hInternet);
}
return false;
}
LPCTSTR lpszVerb = "POST";//m_verb.c_str();
LPCTSTR lpszObjectName = m_path.c_str();
LPCTSTR lpszVersion = NULL; // Use default.
LPCTSTR lpszReferrer = NULL; // No referrer.
LPCTSTR *lplpszAcceptTypes = NULL; // Whatever the server wants to give us.
DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
INTERNET_FLAG_KEEP_CONNECTION |
INTERNET_FLAG_NO_AUTH |
INTERNET_FLAG_NO_AUTO_REDIRECT |
INTERNET_FLAG_NO_COOKIES |
INTERNET_FLAG_NO_UI |
INTERNET_FLAG_RELOAD;
DWORD dwOpenRequestContext = 0;
//打开请求
HINTERNET hOpenRequest = HttpOpenRequest(hConnect, lpszVerb,
lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes,
dwOpenRequestFlags, dwOpenRequestContext);
if (0 == hOpenRequest)
{
if (NULL != hConnect)
{
InternetCloseHandle(hInternet);
}
if (NULL != hInternet)
{
InternetCloseHandle(hInternet);
}
return false;
}
if (!m_cookie.empty())
{
BOOL bAddHead = HttpAddRequestHeaders(hOpenRequest,m_cookie.c_str(),m_cookie.size(),HTTP_ADDREQ_FLAG_ADD);
DWORD dwError = GetLastError();
}
// DWORD t = 1000;
// BOOL bso = InternetSetOption(hInternet,/*INTERNET_OPTION_CONNECT_TIMEOUT*//*INTERNET_OPTION_RECEIVE_TIMEOUT*/INTERNET_OPTION_SEND_TIMEOUT, &t, 4);
DWORD e = GetLastError();
//发送请求
BOOL bRequest = HttpSendRequest(hOpenRequest, NULL, 0, (void *)LoginXml.c_str(), LoginXml.size()); //发送http请求
e = GetLastError();
if (!bRequest || e == ERROR_INTERNET_TIMEOUT )
{
if (NULL != hOpenRequest)
{
InternetCloseHandle(hInternet);
}
if (NULL != hConnect)
{
InternetCloseHandle(hInternet);
}
if (NULL != hInternet)
{
InternetCloseHandle(hInternet);
}
return false;
}
//获取cookie
if (m_cookie.empty())
{
DWORD dwBufferLength = 1024;
CHAR lpBuffer[1024] = {0};
CString strSetCookie;
BOOL bHQI = HttpQueryInfo(hOpenRequest, HTTP_QUERY_SET_COOKIE, lpBuffer, &dwBufferLength, NULL);
DWORD dwError = GetLastError();
if (dwError == ERROR_INSUFFICIENT_BUFFER)
{
LPSTR lpSetCookie = new CHAR[dwBufferLength + 1];
memset(lpSetCookie, 0, dwBufferLength + 1);
HttpQueryInfo(hOpenRequest, HTTP_QUERY_COOKIE, lpBuffer, &dwBufferLength, NULL);
strSetCookie = lpSetCookie;
}
if (bHQI)
{
strSetCookie = lpBuffer;
int ix = strSetCookie.Find('=');
int ixEnd = strSetCookie.Find(';');
m_cookie = "Cookie: JSESSIONID=" + strSetCookie.Mid(ix + 1, ixEnd - ix -1);
}
}
char szRes[1024 * 100] = {0};
char szBuffer[1024 * 10] = {0};
DWORD dwByteRead = 0;
while (InternetReadFile(hOpenRequest, szBuffer, sizeof(szBuffer), &dwByteRead) && dwByteRead > 0)
{
strncat(szRes, szBuffer, dwByteRead);
memset(szBuffer, 0, sizeof(szBuffer));
dwByteRead = 0;
}
ResponseXml = szRes;
InternetCloseHandle(hOpenRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
#ifdef _DEBUG
{
time_t t;
time(&t);
struct tm *ptr;
ptr = localtime(&t);
char nt[20] = {0};
char date[20] = {0};
char fileName[MAX_PATH] = {0};
strftime(nt, 20, "%Y-%m-%d/%H:%M:%S", ptr);
strftime(date, 20, "%Y-%m-%d", ptr);
sprintf(fileName, "./ProtocolLog/%s.txt", date);
ofstream of;
of.open(fileName, ofstream::out | ofstream::app);
CXmlParse xp;
xp.Parse(ResponseXml.c_str());
string req;
xp.PrintXml(req);
of << "时间:" << nt << endl;
of << "请求包:" << LoginXml << endl;
of << "应答包:" << req << endl;
}
#endif
return true
}