MFC ---- Http Post。

HttpClient.h

#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H

#include <afxinet.h>
#include
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:
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.cpp

#include “StdAfx.h”
#include “HttpClient.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_INVALID

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(TEXT("Accept: *,*/*"));
    m_pFile->AddRequestHeaders(TEXT("Accept-Language: zh-cn"));
    m_pFile->AddRequestHeaders(TEXT("Content-Type: application/x-www-form-urlencoded"));
    m_pFile->AddRequestHeaders(TEXT("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.GetBuffer(0);

    Clear();
}
catch (CInternetException* e)
{
    Clear();
    DWORD dwErrorCode = e->m_dwError;
    e->Delete();

    DWORD dwError = GetLastError();

    if (ERROR_INTERNET_TIMEOUT == dwErrorCode)
    {
        return OUTTIME;
    }
    else
    {
        return FAILURE;
    }
}
return SUCCESS;

}

int CHttpClient::HttpGet(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
return ExecuteRequest(TEXT(“GET”), strUrl, strPostData, strResponse);
}

int CHttpClient::HttpPost(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
return ExecuteRequest(TEXT(“POST”), strUrl, strPostData, strResponse);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值