MFC HTTP请求封装

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

private :
    CInternetSession * m_pSession ;
    CHttpConnection * m_pConnection ;
    CHttpFile *m_pFile ;
};
// HttpClient.cpp : 实现文件
#include "stdafx.h"
#include "HttpClient.h"

#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); 
    LPCWSTR unicode = strUnicode.AllocSysString();

    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 )  
    {  
        CString 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: _tcslen( 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);  
        CString 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 );  
}

请求调用,包括URLENCODE

CString t=serverUrl+"/index/setOrdersForClient";
CHttpClient client;
string res;
CString s="data=哈哈哈哈哈哈";
CString aa=client.UrlEncode(s,NULL,TRUE);
client.HttpPost(t,aa,res);

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×