文档章节

MFC中Http通信Post和Get方法实现

AndyZhouX
 AndyZhouX
发布于 2017/08/24 16:24
字数 416
阅读 40
收藏 0

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        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);
}

 

百度云下载链接:http://pan.baidu.com/s/1skVK9e1

© 著作权归作者所有

共有 人打赏支持
AndyZhouX
粉丝 2
博文 151
码字总数 102410
作品 0
深圳
程序员
私信 提问
C++和MFC的应用

由于刚开始想搞C++,现在是在一台机器人上面写C++程序,机器人含有自己的开发库函数,程序中主要是实现和java的通信和视频的传输。在机器人这里不需要界面的显示,现在用VC 6.0工具,发现win...

ysxm
2012/12/13
773
1
网络与服务器编程框架库 acl_3.0.12 发布

acl 3.0.12 版本 (项目主页:https://sourceforge.net/projects/acl/, 技术文章主页:http://zsxxsz.ietye.com/) 发布了,acl 是 one Advanced C/C++ library 的简称,主要包括网络通信库以及...

郑树新
2013/10/03
1K
0
acl redis C++ 库被 redis 官方收录

acl 库中的新增模块 redis C++ 客户端库被 redis 官方正式收录,参见 http://redis.io/clients 中的 C++ 部分,其中 “redis-client for C++” 库即为 acl redis C++ 客户端库。acl 中的 re...

郑树新
2015/03/09
7.2K
10
acl 网络通信服务器框架 3.1.0 版本发布

acl 3.1.0 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平台;整个 acl 项目主要包含三个...

郑树新
2015/02/08
2.9K
2
功能强大的 C++ redis 客户端库增加至 acl 项目中

虽然 redis 开发库已有不少,但 C/C++ 的客户端库好用的并不多,虽然官方也提供了 C 版的客户端库,但易用性较差,而且不支持连接池功能,相对于 C/C++ 的库,JAVA 版的 jedis 要好用的多,j...

郑树新
2015/02/04
8.2K
9

没有更多内容

加载失败,请刷新页面

加载更多

阿里大规模数据中心性能分析

郭健美,阿里巴巴高级技术专家,目前主要从事数据中心的性能分析和软硬件结合的性能优化。CCF 系统软件专委和软件工程专委的委员。曾主持国家自然科学基金面上项目、入选上海市浦江人才计划A...

阿里云官方博客
36分钟前
1
0
Coding and Paper Letter(四十四)

资源整理。 1 Coding: 1.Rstudio2019年会“机器学习应用”的幻灯片,代码和数据 rstudio conf 2019 2.R语言包sparkxgb,Spark上XGBoost的R接口。 sparkxgb 3.自动SQL注入和数据库接管工具。 ...

胖胖雕
38分钟前
1
0
Ubuntu最新的主要操作系统放弃32位支持?

现在是2018年,2019年即将到来——64位处理器已经成为主流很长一段时间了。如果你仍然使用32位的电脑,那么是时候把它扔进垃圾箱了。 我为所有基于Linux的操作系统维护者感到自豪,他们有勇气...

Linux就该这么学
39分钟前
1
0
Fundebug发布Vue插件,简化BUG监控接入代码

摘要: 代码越短越好! 我们发布了fundebug-vue插件,可以简化Vue框架接入Fundebug的代码。 Vue如何接入Fundebug 1. 安装fundebug-javascript与fundebug-vue npm install fundebug-javascrip...

Fundebug
47分钟前
1
0
MySQL学习笔记之二

数据库的操作总结就是:增删改查(CURD),今天记录一下基础的检索查询工作。 检索MySQL 1.查询表中所有的记录 mysql> select * from apps;+----+------------+-----------------------+------...

凌宇之蓝
57分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部