HTTP(GET和POST訪問URL) -- wininet

string CNet::GetUrlHost(string strUrl)
{
	string strRtn;
	if(strUrl.empty())
		return "";
	int length = strUrl.length();

	int i=0;
	int j=0;
	
	for(;i<length;i++)
	{
		if(strUrl.at(i) == '/')
		{
			j++;
		}

		if(j == 3)
			break;
	}

	strRtn = strUrl.substr(0,i);
	length = strRtn.length();
	int rPos = strRtn.rfind('/');
	strRtn = strRtn.substr(rPos+1,length);

	return strRtn;
}

string CNet::GetUrlOther(string strUrl)
{
	string strRtn;
	if(strUrl.empty())
		return "";
	int length = strUrl.length();

	int i=0;
	int j=0;

	for(;i<length;i++)
	{
		if(strUrl.at(i) == '/')
		{
			j++;
		}

		if(j == 3)
			break;
	}

	strRtn = strUrl.substr(i,length);

	return strRtn;
}

void CNet::GetHttp(string strUrl,string strPost,BOOL bIsShow,BOOL bIsKeepAlive)
{
	OutputDebugString(_T("http開始了!"));

	if(strUrl.empty())
	{
		cout<<"輸入的url爲空!"<<endl;
		return;
	}

	HINTERNET hInternet = InternetOpen( _T("Testing"),
					INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,NULL, NULL, 0 ); //初始化WinINet

	if(hInternet == NULL)
	{
		cout<<"WinINet初始化失敗!"<<endl;
		return;
	}
	string strCntName = GetUrlHost(strUrl);

	HINTERNET hConnect = InternetConnect(hInternet, stringToLPCWSTR(strCntName), INTERNET_DEFAULT_HTTP_PORT,
		NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); //連接服務器

	if(hConnect == NULL)
	{
		cout<<"連接服務器失敗!"<<endl;
		InternetCloseHandle(hInternet);
		return;
	}
	string strOther = GetUrlOther(strUrl);
	strOther.append("\r\n");
    HINTERNET hOpenRequest;

	if(strPost.empty())
	{
		hOpenRequest = HttpOpenRequestA(hConnect, "GET",strOther.c_str() , ("HTTP/1.1"), NULL,
			(LPCSTR*)"*/*", INTERNET_FLAG_DONT_CACHE, 1); //創建http請求  post
	}
	else
	{
		hOpenRequest = HttpOpenRequestA(hConnect, "POST",strOther.c_str() , ("HTTP/1.1"), NULL,
			(LPCSTR*)"*/*", INTERNET_FLAG_DONT_CACHE, 1); //創建http請求  post
	}
	
	if(hOpenRequest == NULL)
	{
		cout<<"創建http請求失敗!"<<endl;
		InternetCloseHandle(hConnect);
		InternetCloseHandle(hInternet);
		return;
	}

	//添加請求頭信息,keepalive  "Connection: keep-alive"
	//長連接

	if(bIsKeepAlive == TRUE)
	{
		LPCSTR header= "Connection: keep-alive/r/n";

		SIZE_T len = strlen(header);

		HttpAddRequestHeadersA(hOpenRequest,header,len,NULL);
	}

	BOOL bRequest;

	if(strPost.empty())
	{
		bRequest = HttpSendRequestA( hOpenRequest, NULL,0, NULL,0);
	}
	else
	{
		//post 發送數據
		DWORD dwSize = (strPost.empty()) ? 0 : strlen(strPost.c_str());
		bRequest = HttpSendRequestA( hOpenRequest, NULL,0, (LPVOID)strPost.c_str(),dwSize); //發送http請求
	}

	int n = GetLastError();

	if(bRequest == FALSE)
	{
		cout<<"發送http請求失敗!"<<endl;
		InternetCloseHandle(hConnect);
		InternetCloseHandle(hInternet);
		InternetCloseHandle(hOpenRequest);
		return;
	}

    char szBuffer[1024] = {0};  
    DWORD dwByteRead = 0;
	
	while (InternetReadFile(hOpenRequest, szBuffer, sizeof(szBuffer), &dwByteRead) && dwByteRead > 0)
	{
		if(bIsShow == TRUE)
		{
			cout<<szBuffer<<endl;
			ZeroMemory(szBuffer, dwByteRead);   
		} 
	}

   InternetCloseHandle(hConnect);
   InternetCloseHandle(hInternet);
   InternetCloseHandle(hOpenRequest);

   OutputDebugString(_T("http結束了!"));
}

這裏實現了get方法和post方法,post方法可以提交數據,strPost代表的提交的數據,通過wireshark抓包分析可知,



數據上傳成功,get方法下實現了keepalive(原理是對請求頭添加信息 keepalive\r\n,可以開啓長連接,當然是否開啓成功還是要看服務器是否支持)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章