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

2023-05-16

处理过程封装到CHttpClient类中,同时支持http和https


HttpClient.h

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1.  HttpClient.h  
  2. #ifndef HTTPCLIENT_H  
  3. #define HTTPCLIENT_H  
  4.   
  5. #include <afxinet.h>  
  6. #include <string>  
  7. using namespace std;  
  8.   
  9. #define  IE_AGENT  _T("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)")  
  10.   
  11. // 操作成功  
  12. #define SUCCESS        0  
  13. // 操作失败  
  14. #define FAILURE        1  
  15. // 操作超时 www.it165.net  
  16. #define OUTTIME        2  
  17.   
  18. class CHttpClient  
  19. {  
  20. public:  
  21.     CHttpClient(LPCTSTR strAgent = IE_AGENT);  
  22.     virtual ~CHttpClient(void);  
  23.   
  24.     int HttpGet(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);  
  25.     int HttpPost(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);  
  26.   
  27. private:  
  28.     int ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);  
  29.     void Clear();  
  30.   
  31. private:  
  32.     CInternetSession *m_pSession;  
  33.     CHttpConnection *m_pConnection;  
  34.     CHttpFile *m_pFile;  
  35. };  
  36.   
  37. #endif // HTTPCLIENT_H  



HttpClient.cpp


[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. // HttpClient.cpp  
  2. #include "StdAfx.h"  
  3. #include "HttpClient.h"  
  4. #include "yazuoLog.h"  
  5.   
  6. #define  BUFFER_SIZE       1024  
  7.   
  8. #define  NORMAL_CONNECT             INTERNET_FLAG_KEEP_CONNECTION  
  9. #define  SECURE_CONNECT                NORMAL_CONNECT | INTERNET_FLAG_SECURE  
  10. #define  NORMAL_REQUEST             INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE   
  11. #define  SECURE_REQUEST             NORMAL_REQUEST | INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID  
  12.   
  13. CHttpClient::CHttpClient(LPCTSTR strAgent)  
  14. {  
  15.     m_pSession = new CInternetSession(strAgent);  
  16.     m_pConnection = NULL;  
  17.     m_pFile = NULL;  
  18. }  
  19.   
  20.   
  21. CHttpClient::~CHttpClient(void)  
  22. {  
  23.     Clear();  
  24.     if(NULL != m_pSession)  
  25.     {  
  26.         m_pSession->Close();  
  27.         delete m_pSession;  
  28.         m_pSession = NULL;  
  29.     }  
  30. }  
  31.   
  32. void CHttpClient::Clear()  
  33. {  
  34.     if(NULL != m_pFile)  
  35.     {  
  36.         m_pFile->Close();  
  37.         delete m_pFile;  
  38.         m_pFile = NULL;  
  39.     }  
  40.   
  41.     if(NULL != m_pConnection)  
  42.     {  
  43.         m_pConnection->Close();  
  44.         delete m_pConnection;  
  45.         m_pConnection = NULL;  
  46.     }  
  47. }  
  48.   
  49. int CHttpClient::ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)  
  50. {  
  51.     CString strServer;  
  52.     CString strObject;  
  53.     DWORD dwServiceType;  
  54.     INTERNET_PORT nPort;  
  55.     strResponse = "";  
  56.   
  57.     AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort);  
  58.   
  59.     if(AFX_INET_SERVICE_HTTP != dwServiceType && AFX_INET_SERVICE_HTTPS != dwServiceType)  
  60.     {  
  61.         return FAILURE;  
  62.     }  
  63.   
  64.     try  
  65.     {  
  66.         m_pConnection = m_pSession->GetHttpConnection(strServer,  
  67.             dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_CONNECT : SECURE_CONNECT,  
  68.             nPort);  
  69.         m_pFile = m_pConnection->OpenRequest(strMethod, strObject,   
  70.             NULL, 1, NULL, NULL,   
  71.             (dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_REQUEST : SECURE_REQUEST));  
  72.   
  73.         //DWORD dwFlags;  
  74.         //m_pFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);  
  75.         //dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;  
  76.         set web server option  
  77.         //m_pFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);  
  78.   
  79.         m_pFile->AddRequestHeaders("Accept: *,*/*");  
  80.         m_pFile->AddRequestHeaders("Accept-Language: zh-cn");  
  81.         m_pFile->AddRequestHeaders("Content-Type: application/x-www-form-urlencoded");  
  82.         m_pFile->AddRequestHeaders("Accept-Encoding: gzip, deflate");  
  83.   
  84.         m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : _tcslen(strPostData));  
  85.   
  86.         char szChars[BUFFER_SIZE + 1] = {0};  
  87.         string strRawResponse = "";  
  88.         UINT nReaded = 0;  
  89.         while ((nReaded = m_pFile->Read((void*)szChars, BUFFER_SIZE)) > 0)  
  90.         {  
  91.             szChars[nReaded] = '\0';  
  92.             strRawResponse += szChars;  
  93.             memset(szChars, 0, BUFFER_SIZE + 1);  
  94.         }  
  95.   
  96.         int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, strRawResponse.c_str(), -1, NULL, 0);  
  97.         WCHAR *pUnicode = new WCHAR[unicodeLen + 1];  
  98.         memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
  99.   
  100.         MultiByteToWideChar(CP_UTF8,0,strRawResponse.c_str(),-1, pUnicode,unicodeLen);  
  101.         CString cs(pUnicode);  
  102.         delete []pUnicode;   
  103.         pUnicode = NULL;  
  104.   
  105.         strResponse = cs;  
  106.   
  107.         Clear();  
  108.     }  
  109.     catch (CInternetException* e)  
  110.     {  
  111.         Clear();  
  112.         DWORD dwErrorCode = e->m_dwError;  
  113.         e->Delete();  
  114.   
  115.         DWORD dwError = GetLastError();  
  116.   
  117.         PRINT_LOG("dwError = %d", dwError, 0);  
  118.   
  119.         if (ERROR_INTERNET_TIMEOUT == dwErrorCode)  
  120.         {  
  121.             return OUTTIME;  
  122.         }  
  123.         else  
  124.         {  
  125.             return FAILURE;  
  126.         }  
  127.     }  
  128.     return SUCCESS;  
  129. }  
  130.   
  131. int CHttpClient::HttpGet(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)  
  132. {  
  133.     return ExecuteRequest("GET", strUrl, strPostData, strResponse);  
  134. }  
  135.   
  136. int CHttpClient::HttpPost(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)  
  137. {  
  138.     return ExecuteRequest("POST", strUrl, strPostData, strResponse);  
  139. }  


http://cn.waterlin.org/Microsoft/MFC-HTTP-request.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC使用HttpGet和HttpPost方法与服务器通信 的相关文章

  • jQuery Ajax 将数组发送到 ASP.NET MVC 控制器

    我在这里缺少一些东西 我有这个 jQuery JavaScript ajax type POST url update note order dataType json data orderedIds orderedIds unixTime
  • 与 UltraHD 兼容的 CHtmlView

    CHtmlView与 UltraHD 分辨率不兼容 实现 UltraHD 感知并不仅仅在于使用正确的 HTML CSS 打印预览机制失败并裁剪页面 许多个月前 微软承认这是一个问题 但没有解决它 我的应用程序大量使用CHtmlView用于显
  • MFC 是否提供了将文本放入剪贴板的快速方法?

    我们的代码库中的添加到剪贴板代码非常低级 分配全局内存等等 对于简单的情况 我只想将一些纯文本放在剪贴板上 是否有任何例程可以包装所有这些内容 一个例子是 CRichEditCtrl 具有 Copy 和 Cut 方法 可以自动将当前选择放入
  • 在 AngularJS 中发送 FormData 和其他字段

    我有一个表格有两个input text和一个upload 我必须将其发送到服务器 但在将文件与文本连接时遇到一些问题 服务器期望这个答案 title first input text second input file my file pd
  • HttpPost 适用于 Java 项目,但不适用于 Android 项目

    我为我的 Android 设备编写了一些代码 用于通过 HTTPS 登录网站并从结果页面中解析一些数据 一个HttpGet首先获取登录所需的一些信息 然后HttpPost执行实际的登录过程 下面的代码在 Eclipse 中的 Java 项目
  • 如何在VC++/MFC中替换字符串中两个子字符串之间的字符串?

    假设我有一个 CString 对象 strMain AAAABBCCCCCCDDBBCCCCCCCCDDDAA 我还有两个较小的字符串 例如 strSmall1 BB strSmall2 DD 现在 我想替换 strMain 中 strSm
  • 调用 HTTP_POST 时出现 Bad Request 错误?

    我有一个关于 SAP 功能模块 http post 的问题 我只想将 SAP 中的一条短消息 msg 发布到我之前安装的推送通知服务器 pushd Github Projekt 现在我不知道如何传递消息 我用测试符号测试了 FM CALL
  • MFC CMenu 工具提示未显示

    我尝试使用类似的东西来设置 CMenu 项的工具提示 如所述here https stackoverflow com questions 2400180 mfc how to add tooltip in cmenu items 但它只是显
  • MinGW支持MFC吗?

    我已经使用 MinGW 开发了 WinAPI 应用程序 没有出现任何问题 现在 我可以用 MFC 做同样的事情吗 我只是在这里猜测 但我认为您需要购买 Visual Studio 的副本才能获得使用 MFC 的许可证 MFC 也不因其对 C
  • 为什么 getSession() 在短时间内间隔的后续请求中不返回相同的会话?

    我正在发送一个 getJSON HTTP GET 请求两次 使用不同的数据 一次又一次 假设我们有 request1 和 request2 我可以在 FF 和 Chrome 的开发者工具中看到我有相同的cookie JSESSIONID F
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东
  • 如何通过MFC将应用程序设置保存到注册表中?

    我有一个由 MFC 项目向导创建的 MFC 应用程序 我想在注册表中保存 读取应用程序设置 所以问了这个question https stackoverflow com questions 1880275 good c registry w
  • 将文本数据作为表单中的文件发布

    是否可以从 html 表单中发布一些作为文件输入类型的字符串的 XML 数据 情况是我有一个像这样的表格 form action target php method post enctype multipart form data gt
  • 发送WM_SETTEXT时如何避免EN_CHANGE通知?

    我有一个 CEdit 派生控件 当基本数据为空时 该控件显示字符串 N A 我最近添加了代码 以在控件获得焦点时清空控件 SetWindowText 并在用户离开焦点时将其设置回 N A SetWindowText N A 控空 唯一的问题
  • 415 不支持的媒体类型; Angular2 到 API

    我是 Angular 2 的新手 我面临着一个无法找到解决方案的问题 当我尝试从 Angular 2 发布到 API 时 我得到 415 不支持的媒体类型 角度2代码 onSubmit value any console log value
  • 使用 Jquery 传递隐藏字段值

    我有一个正常的hidden Input field我在哪里生成random string 我需要将其附加到我尝试将数据发布到另一个页面的 URL 中 我已经做到了这一点并且效果很好 url Upload html field1 newval
  • MFC 中位图背景绘制的线程类型

    我有一个 MFC 文档 视图 C 图形应用程序 它将所有绘图都绘制到离屏位图 然后将其复制到 OnDraw 方法中提供的 CDC 指针 在过去的几天里 我一直在寻找将绘图组件放置在单独的工作线程中 这样它就不会停止 GUI 当我执行此操作时
  • 更改 GLUT 调用以与 MFC/C++ 一起使用

    我有一个使用 GLUT 进行 OpenGL 渲染的程序 现在我需要它位于 MFC 项目内部 以便它可以与另一个程序组件一起使用 我已经按照这个教程进行操作 http www codeguru com cpp g m opengl openf
  • 将 CURL 命令行转换为 VBA

    在 CURL 中 我可以使用这一行 curl data DataToBeSent https example com resource cgi 我正在努力将此类行转换为在 VBA 中使用 这是我到目前为止的尝试 Sub POST Metho
  • 如何在android中将多部分表单数据和图像上传到服务器?

    在 Android 代码中将多部分实体图像上传到服务器期间的状态代码 500 html形式 可以成功添加图片到服务器

随机推荐

  • SQL小结

    1 SQL模糊查询 like 效率低 xff0c 容易全盘扫描 查找Name中包含字符 39 M 39 的数据 select ename from table where ename like 39 M 39 查找Name中第二个字母为 3
  • golang中的flag模块小结

    1 flag常用函数 无论是c语言还是golang语言或是其他语言 xff0c 启动应用程序时都可以带一些参数 xff0c 然后系统根据传入的参数进行特点的工作 如 xff1a main mode online model bert ch
  • Redis批量操作详解及性能分析

    通过mget批量执行指令可以节约网络连接和数据传输开销 xff0c 在高并发场景下可以节约大量系统资源 本文中 xff0c 我们更进一步 xff0c 比较一下redis提供的几种批量执行指令的性能 1 为什么需要批量执行redis指令 众所
  • NDCG:推荐系统/搜索评价指标

    本文转载自 胖喵 博主 xff0c 详细请看https www cnblogs com by dream p 9403984 html 1 CG xff1a 累计增益 CG xff0c cumulative gain xff0c 只考虑到了
  • 特征共线性问题

    多重共线性是使用线性回归算法时经常要面对的一个问题 在其他算法中 xff0c 例如决策树或者朴素贝叶斯 xff0c 前者的建模过程时逐渐递进 xff0c 每次都只有一个变量参与 xff0c 这种机制含有抗多重共线性干扰的功能 xff1b 后
  • 常见回归和分类损失函数比较

    文章转自知乎作者wdmad xff0c 更多内容建议阅读原文 xff1a https zhuanlan zhihu com p 36431289 本博文属于阅读笔记 xff0c 融合了个人观点 1 损失函数 损失函数的一般表示为 L y f
  • 获取keras中间层输出、模型保存与加载

    1 获取keras中间层输出 model summary and plot import keras from keras models import Model from keras utils import plot model Doc
  • HashMap底层实现和原理

    本文是在阅读知乎老刘作品后的整理 内容基于JDK1 7进行分析 xff0c 1 8做的改动文章末尾进行讲解 1 基本要义 1 1 概述 Hashmap在Map派生中的位置 HashMap基于Map接口实现 xff0c 元素以键值对的方式存储
  • 大疆激光雷达Livox Avia开箱及测试

    大疆激光雷达Livox Avia 箱子 从左至右为 xff1a 大疆激光雷达Livox Avia xff0c 电源转接插座 xff0c 内六角形L型扳手 xff0c 镜头清洁布 xff0c 螺钉包 xff0c 说明书 xff0c 1 5米航
  • Go协程与协程池

    1 Golang协程 golang和其它语言最大区别莫过于goroutine xff0c 也就是go的协程 xff0c example如下 xff1a package main import 34 fmt 34 import 34 time
  • Go协程池设计思路(Task-Job-Worker)

    1 铺垫 xff1a Go 的接收器Receiver 在go语言中 xff0c 没有类的概念 xff0c 但是可以给类型 xff08 结构体 xff0c 自定义类型 xff09 定义方法 所谓方法就是定义了接受者的函数 接受者定义在func
  • 系统间通信1:阻塞与非阻塞式通信A

    版权声明 xff1a 本文引用https yinwj blog csdn net article details 48274255 从这篇博文开始 xff0c 我们将进入一个新文章系列 这个文章系列专门整理总结了目前系统间通信的主要原理 手
  • 系统间通信1:阻塞与非阻塞式通信B

    版权声明 xff1a 本文引用https yinwj blog csdn net article details 48274255 接上篇 xff1a 系统间通信1 xff1a 阻塞与非阻塞式通信A 4 3 NIO通信框架 目前流行的NIO
  • 系统间通信2:通信管理与远程方法调用RMI

    本文引用 https yinwj blog csdn net article details 49120813 RMI Remote Method Invocation xff0c 远程方法调用 RPC Remote Procedure C
  • 系统间通信3:RPC的基本概念

    本文引用 https yinwj blog csdn net article details 49453303 1 概述 经过了详细的信息格式 网络IO模型的讲解 xff0c 并且通过JAVA RMI的讲解进行了预热 从这篇文章开始我们将进
  • 系统间通信4:基本IO通信模型

    本文引用 https blog csdn net yinwenjie article details 48472237 目前常用的IO通信模型包括四种 xff1a 阻塞式同步IO 非阻塞式同步IO 多路复用IO和真正的异步IO 所有IO模式
  • 深入理解Golang中的Context包

    context Context是Go语言中独特的设计 xff0c 在其他编程语言中我们很少见到类似的概念 context Context深度支持Golang的高并发 1 Goroutine和Channel 在理解context包之前 xff
  • ubuntu —— 命令行访问网页

    span class hljs variable style margin 0px padding 0px span sudo apt get install w3m span class hljs variable style margi
  • VINS-Mono 加rgbd

    通过对比VINS Mono与其RGBD版本 xff0c 分析其改动思路 一 feature tracker feature tracker node cpp 头文件加入了ros的多传感器时间戳 include lt message filt
  • MFC使用HttpGet和HttpPost方法与服务器通信

    处理过程封装到CHttpClient类中 同时支持http和https HttpClient h cpp view plain copy HttpClient h ifndef HTTPCLIENT H define HTTPCLIENT