MFC使用HttpGet和HttpPost方法与服务器通信

来源:互联网 发布:相册管家是什么软件 编辑:程序博客网 时间:2024/04/28 19:21
处理过程封装到CHttpClient类中,同时支持http和https//////////////////////////////////// HttpClient.h#ifndef HTTPCLIENT_H#define HTTPCLIENT_H#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        2class CHttpClient{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);private:    int ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);    void Clear();private:    CInternetSession *m_pSession;    CHttpConnection *m_pConnection;    CHttpFile *m_pFile;};#endif // HTTPCLIENT_H////////////////////////////////// HttpClient.cpp#include "StdAfx.h"#include "HttpClient.h"#include "yazuoLog.h"#define  BUFFER_SIZE       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_INVALIDCHttpClient::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("Accept: *,*/*");        m_pFile->AddRequestHeaders("Accept-Language: zh-cn");        m_pFile->AddRequestHeaders("Content-Type: application/x-www-form-urlencoded");        m_pFile->AddRequestHeaders("Accept-Encoding: gzip, deflate");        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);        delete []pUnicode;         pUnicode = NULL;        strResponse = cs;        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("GET", strUrl, strPostData, strResponse);}int CHttpClient::HttpPost(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse){    return ExecuteRequest("POST", strUrl, strPostData, strResponse);}
转载:http://jiangsy1107.blog.sohu.com/200974046.html