VC,MFC中通过POST与GET方式与WEB服务器通信

转载自:http://blog.zbdream.com/archives/61
// CHttpClient 命令目标
#include <afxinet.h>
#include <string>

using namespace std ;

#define  IE_AGENT  _T("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)")

// 操作成功
#define SUCCESS        0
// 操作失败
#define FAILURE        1
// 操作超时
#define OUTTIME        2

class CHttpClient : public CObject

{

public :
	CHttpClient (LPCTSTR strAgent = IE_AGENT );
	virtual ~CHttpClient ( void);
	int HttpGet ( LPCTSTR strUrl , LPCTSTR strPostData , string & strResponse );
	int HttpPost ( LPCTSTR strUrl , LPCTSTR strPostData , string & strResponse );
	static CString CHttpClient :: UrlEncode (CString strUnicode ,LPCTSTR url= NULL ,BOOL isWide =FALSE , BOOL isChangeEqualAndSlash= FALSE );//,该函数用来对url进行编码。将非ASCII字符转化成"%XX%XX%XX"格式,isWide和isChangeEqualAndSlash分别用来决定是否将获取到的内容转成宽字符和是否转换'='和'/'转换出的url按照UTF-8编码
private :
	int ExecuteRequest ( LPCTSTR strMethod , LPCTSTR strUrl , LPCTSTR strPostData, string&strResponse );
	void Clear ();
private :

	CInternetSession * m_pSession ;
	CHttpConnection * m_pConnection ;
	CHttpFile *m_pFile ;
};
//
#define  BUFFER_SIZE  4*1024
#define  NORMAL_CONNECT             INTERNET_FLAG_KEEP_CONNECTION
#define  SECURE_CONNECT             NORMAL_CONNECT | INTERNET_FLAG_SECURE
#define  NORMAL_REQUEST             INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE
#define  SECURE_REQUEST             NORMAL_REQUEST | INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID

CString CHttpClient ::UrlEncode ( CString strUnicode ,LPCTSTR url ,BOOL isWide, BOOL isChangeEqualAndSlash )
{
	LPCWSTR unicode = T2CW( strUnicode );
	int len = WideCharToMultiByte ( CP_UTF8 , 0, unicode , - 1, 0 , 0 , 0 , 0 );

	if (! len)
		return strUnicode ;

	char *utf8 = new char [ len + 1 ];
	char *utf8temp = utf8;
	WideCharToMultiByte ( CP_UTF8 , 0, unicode , - 1, utf8 , len + 1 , 0 , 0 );

	utf8 [len ] = 0 ;   
	CString strTemp , strEncodeData ;
	if (url != NULL)
		strEncodeData = url;

	while ((* utf8) != 0)
	{
		if ((*utf8 )<= 127&&(* utf8 )>0 &&(* utf8)!= '+' &&(*utf8 )!= ' ' &&(*utf8 )!= '?'&&(* utf8)!= '%' &&(*utf8 )!= '#'&&(! isChangeEqualAndSlash ||((*utf8 )!= '='&&(* utf8 )!='/' )))
		strEncodeData +=( char)(* utf8 );
		else 
		{
			strTemp . Format( _T ("%%%2x" ), ( BYTE )*utf8 );
			strEncodeData += strTemp ;
		}
		++utf8;
	}
	delete [] utf8temp ;
	if (isWide ==FALSE )
	{
		CStringA stra( strEncodeData .GetBuffer (0 ));
		return ( LPCWSTR )stra . GetBuffer (0 );
	} 
	else 
		return strEncodeData ;
}

// CHttpClient 成员函数
CHttpClient ::CHttpClient ( LPCTSTR strAgent )
{
	m_pSession = new CInternetSession (strAgent );
	m_pConnection = NULL ;
	m_pFile = NULL ;
}
CHttpClient ::~CHttpClient ( void)
{
	Clear ();
	if (NULL != m_pSession )
	{
		m_pSession -> Close();
		delete m_pSession ;
		m_pSession = NULL ;
	}
}

void CHttpClient ::Clear ()
{
	if (NULL != m_pFile )
	{
		m_pFile -> Close();
		delete m_pFile ;
		m_pFile = NULL ;
	}
	if (NULL != m_pConnection )
	{
		m_pConnection -> Close();
		delete m_pConnection ;
		m_pConnection = NULL ;
	}
}

int CHttpClient ::ExecuteRequest (LPCTSTR strMethod , LPCTSTR strUrl , LPCTSTR strPostData, string&strResponse )
{
	CString strServer ;
	CString strObject ;
	DWORD dwServiceType ;
	INTERNET_PORT nPort ;
	strResponse = "" ;

	AfxParseURL ( strUrl, dwServiceType , strServer , strObject , nPort );
	if (AFX_INET_SERVICE_HTTP != dwServiceType && AFX_INET_SERVICE_HTTPS != dwServiceType )
	{
		return FAILURE ;
	}
	try
	{
		m_pConnection = m_pSession ->GetHttpConnection (strServer ,
		dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_CONNECT : SECURE_CONNECT,nPort );
		m_pFile = m_pConnection ->OpenRequest (strMethod , strObject ,NULL , 1 , NULL , NULL ,( dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_REQUEST:SECURE_REQUEST));
		//DWORD dwFlags;
		//m_pFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);
		//dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
		set web server option
		//m_pFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);
		m_pFile -> AddRequestHeaders (_T ("Accept: *,*/*" ));
		m_pFile -> AddRequestHeaders (_T ("Accept-Language: zh-cn" ));
		m_pFile -> AddRequestHeaders (_T ("Content-Type: application/x-www-form-urlencoded" ));
		m_pFile -> AddRequestHeaders (_T ("Accept-Encoding: deflate")); //gzip,
		m_pFile -> SendRequest (NULL , 0 , ( LPVOID)( LPCTSTR )strPostData , strPostData == NULL ? 0: strlen (( LPCSTR)( strPostData )));

		char szChars [BUFFER_SIZE + 1 ] = { 0 };
		string strRawResponse = "" ;
		UINT nReaded = 0 ;
		while (( nReaded = m_pFile -> Read(( void *)szChars , BUFFER_SIZE )) > 0 )
		{
			szChars[ nReaded ] = '\0';
			strRawResponse += szChars ;
			memset ( szChars , 0, BUFFER_SIZE + 1 );
		}

		int unicodeLen = MultiByteToWideChar (CP_UTF8 , 0 , strRawResponse. c_str(), -1 , NULL , 0 );
		WCHAR * pUnicode = new WCHAR [ unicodeLen + 1];
		memset ( pUnicode ,0 ,(unicodeLen + 1)* sizeof (wchar_t ));
		MultiByteToWideChar ( CP_UTF8 ,0 ,strRawResponse . c_str(),- 1 , pUnicode, unicodeLen );
		CString cs ( pUnicode );
		//AfxMessageBox(cs);
		CStringA stra ( cs. GetBuffer (0 ));
		strResponse = stra. GetBuffer (0 ); //(LPCSTR)(LPCWSTR)cs;
		stra . ReleaseBuffer ();
		delete [] pUnicode ;
		pUnicode = NULL ;
		Clear ();
	}
	catch ( CInternetException * e )
	{
		Clear ();
		DWORD dwErrorCode = e-> m_dwError ;
		e -> Delete();
		DWORD dwError = GetLastError ();
		//PRINT_LOG("dwError = %d", dwError, 0);
		if ( ERROR_INTERNET_TIMEOUT == dwErrorCode )
		{
			return OUTTIME ;
		}
		else
		{
			return FAILURE ;
		}
	}
	return SUCCESS ;
}

int CHttpClient ::HttpGet (LPCTSTR strUrl , LPCTSTR strPostData , string & strResponse )
{
	return ExecuteRequest ( _T( "GET" ), strUrl , strPostData , strResponse );
}

int CHttpClient ::HttpPost (LPCTSTR strUrl , LPCTSTR strPostData , string & strResponse )
{
	return ExecuteRequest ( _T( "POST" ), strUrl , strPostData , strResponse );
}
//


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值