C++封装的HTTP和HTTPS的接口

2023-05-16

记录下http和https的post方法 在C++中实现

来源无从考究了,这里记录一下

http 的post 方法

BOOL HttpPostToBusinessServer(LPCTSTR serverAddr, std::string urlParam, std::string &strHttpContent, LPDWORD statusCode);

BOOL HttpPostToBusinessServer(LPCTSTR serverAddr, std::string urlParam, std::string & strHttpContent, LPDWORD statusCode)
{
	URL_COMPONENTS  urlComponents;
	ZeroMemory(&urlComponents, sizeof(urlComponents));
	urlComponents.dwStructSize = sizeof(urlComponents);

	TCHAR hostName[256];
	urlComponents.lpszHostName = hostName;
	urlComponents.dwHostNameLength = 256;

	TCHAR path[1024];
	urlComponents.lpszUrlPath = path;
	urlComponents.dwUrlPathLength = 1024;

	
	if (WinHttpCrackUrl(serverAddr, lstrlen(serverAddr), 0, &urlComponents) == FALSE)
	{
		return FALSE;
	}

	HINTERNET hSession = NULL;
	HINTERNET hConnect = NULL;
	HINTERNET hRequest = NULL;
	BOOL bResults = FALSE;
	std::wstring httpHeader;
	std::wstring strUserIDParam;

	hSession = WinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
	if (!hSession)
	{
		goto failure;
	}

	hConnect = WinHttpConnect(hSession, urlComponents.lpszHostName, urlComponents.nPort, 0);
	if (!hConnect)
	{
		goto failure;
	}

	strUserIDParam = urlComponents.lpszUrlPath;
	hRequest = WinHttpOpenRequest(hConnect, L"POST", strUserIDParam.c_str(), L"HTTP/1.1", WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_REFRESH);
	if (!hRequest)
	{
		goto failure;
	}

	httpHeader = L"Content-type: application/json";
	WinHttpAddRequestHeaders(hRequest, httpHeader.c_str(), DWORD(httpHeader.length()), WINHTTP_ADDREQ_FLAG_ADD);
	if (!hRequest)
	{
		goto failure;
	}

	const void *ss = (const char *)urlParam.c_str();
	bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, const_cast<void *>(ss), urlParam.length(), urlParam.length(), 0);
	if (bResults)
	{
		bResults = WinHttpReceiveResponse(hRequest, NULL);
	}
	else
	{
		goto failure;
	}

	DWORD statusCodeSize = sizeof(DWORD);
	bResults = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, statusCode, &statusCodeSize, WINHTTP_NO_HEADER_INDEX);
	if (!bResults)
	{
		goto failure;
	}

	strHttpContent.clear();
	if (bResults)
	{
		DWORD dwSize = 0;
		DWORD dwDownloaded = 0;
		LPSTR pszOutBuffer;
		DWORD dwReadBytes = 0;

		do
		{
			dwSize = 0;
			if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
				goto failure;

			pszOutBuffer = new char[dwSize + 1];
			if (!pszOutBuffer)
			{
				dwSize = 0;
			}
			else
			{
				ZeroMemory(pszOutBuffer, dwSize + 1);

				if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded))
				{
					goto failure;
				}

				strHttpContent += pszOutBuffer;
				delete[] pszOutBuffer;
			}
		} while (dwSize > 0);
	}

	if (strHttpContent.empty())
	{
		goto failure;
	}
	else
	{
		if (hSession)
			WinHttpCloseHandle(hSession);
		if (hConnect)
			WinHttpCloseHandle(hConnect);
		if (hRequest)
			WinHttpCloseHandle(hRequest);
		return TRUE;
	}

failure:
	if (hSession)
		WinHttpCloseHandle(hSession);
	if (hConnect)
		WinHttpCloseHandle(hConnect);
	if (hRequest)
		WinHttpCloseHandle(hRequest);
	return FALSE;
}

https 的 post方法

BOOL HttpsPostToBusinessServer(LPCTSTR serverAddr, std::string urlParam, std::string & strHttpContent, LPDWORD statusCode)
{
	URL_COMPONENTS  urlComponents;
	ZeroMemory(&urlComponents, sizeof(urlComponents));
	urlComponents.dwStructSize = sizeof(urlComponents);

	TCHAR hostName[256];
	urlComponents.lpszHostName = hostName;
	urlComponents.dwHostNameLength = 256;

	TCHAR path[1024];
	urlComponents.lpszUrlPath = path;
	urlComponents.dwUrlPathLength = 1024;


	if (WinHttpCrackUrl(serverAddr, lstrlen(serverAddr), 0, &urlComponents) == FALSE)
	{
		return FALSE;
	}

	HINTERNET hSession = NULL;
	HINTERNET hConnect = NULL;
	HINTERNET hRequest = NULL;
	BOOL bResults = FALSE;
	std::wstring httpHeader;
	std::wstring strUserIDParam;

	hSession = WinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
	if (!hSession)
	{
		goto failure;
	}

	hConnect = WinHttpConnect(hSession, urlComponents.lpszHostName, urlComponents.nPort, 0);
	if (!hConnect)
	{
		goto failure;
	}

	strUserIDParam = urlComponents.lpszUrlPath;
	
	hRequest = WinHttpOpenRequest(hConnect, L"POST", strUserIDParam.c_str(), L"HTTP/1.1", WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE | WINHTTP_FLAG_REFRESH);
	if (!hRequest)
	{
		goto failure;
	}

	DWORD dwFlags;
	DWORD dwBuffLen = sizeof(dwFlags);
	WinHttpQueryOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS,
		(LPVOID)&dwFlags, &dwBuffLen);
	dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
	dwFlags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
	dwFlags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;

	WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));

	httpHeader = L"Content-type: application/json";
	WinHttpAddRequestHeaders(hRequest, httpHeader.c_str(), DWORD(httpHeader.length()), WINHTTP_ADDREQ_FLAG_ADD);
	if (!hRequest)
	{
		goto failure;
	}

	const void *ss = (const char *)urlParam.c_str();
	bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, const_cast<void *>(ss), urlParam.length(), urlParam.length(), 0);
	if (bResults)
	{
		bResults = WinHttpReceiveResponse(hRequest, NULL);
	}
	else
	{
		goto failure;
	}

	DWORD statusCodeSize = sizeof(DWORD);
	bResults = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, statusCode, &statusCodeSize, WINHTTP_NO_HEADER_INDEX);
	if (!bResults)
	{
		goto failure;
	}

	strHttpContent.clear();
	if (bResults)
	{
		DWORD dwSize = 0;
		DWORD dwDownloaded = 0;
		LPSTR pszOutBuffer;
		DWORD dwReadBytes = 0;

		do
		{
			dwSize = 0;
			if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
				goto failure;

			pszOutBuffer = new char[dwSize + 1];
			if (!pszOutBuffer)
			{
				dwSize = 0;
			}
			else
			{
				ZeroMemory(pszOutBuffer, dwSize + 1);

				if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded))
				{
					goto failure;
				}

				strHttpContent += pszOutBuffer;
				delete[] pszOutBuffer;
			}
		} while (dwSize > 0);
	}

	if (strHttpContent.empty())
	{
		goto failure;
	}
	else
	{
		if (hSession)
			WinHttpCloseHandle(hSession);
		if (hConnect)
			WinHttpCloseHandle(hConnect);
		if (hRequest)
			WinHttpCloseHandle(hRequest);
		return TRUE;
	}

failure:
	if (hSession)
		WinHttpCloseHandle(hSession);
	if (hConnect)
		WinHttpCloseHandle(hConnect);
	if (hRequest)
		WinHttpCloseHandle(hRequest);
	return FALSE;
}

 

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

C++封装的HTTP和HTTPS的接口 的相关文章

  • $http.get 和 method:'GET' 之间的区别

    我正在使用 Spring Data REST 并有一个 MySQL DB 来管理我的数据 我使用 AngularJS 编写了第一页 并希望从数据库中获取数据 为了获取我的数据 我知道有两种不同的方式 http get http myURL
  • Jsoup http 日志记录

    有没有办法记录http请求和响应 我们假设以下请求 Connection Response res Jsoup connect LOGIN URL HERE data user USER pass PASS method Connectio
  • .htaccess 路由到服务器上的子目录?性能/加载时间

    我想知道是否可以使用 htaccess 文件将我的域直接路由到服务器上的子目录 我从常规虚拟主机提供商处购买了虚拟主机软件包 其中我的domain com 连接到我的服务器的根目录 我想知道是否可以以某种方式将 htaccess 文件上传到
  • “双点”可以作为 URL 路径部分的一部分吗

    在 URL 中使用父目录双点是否有效且安全 如下例所示 http example com path to file jpg RFC3986 https www rfc editor org rfc rfc3986定义 URI 它描述了路径如
  • 是否有管理 __utma、__utmz 等 cookie 的标准?

    无论我登录 Facebook 还是 Twitter 我都会受到以下名称的 cookie 轰炸 utma utmb utmc utmv 它们的功能是什么 是否有一个标准来管理这些在服务器端的使用方式 这些 cookie 通常与谷歌分析 htt
  • 避免 IE 中因背景图像而出现“混合内容”警告的具体规则是什么?

    这与SSL 和 CSS 背景图像导致的混合内容 https stackoverflow com questions 1548551 ssl and mixed content due to css background images但这个问
  • HTTP 和 HTTPS iframe

    我正在创建一个小部件 我想允许其他人使用它 这iframe通过 HTTP 加载 但我想允许用户通过 HTTPS 登录 即通过 SSL 发送登录请求 同源策略中允许这样做吗 即 场景是用户可以将我的 JavaScript 集成到他们的网站 小
  • Python 使用 ssl.getpeercert() 从 URL 获取通用名称

    我正在尝试获取证书颁发者信息 通用名称 但链接中的代码不适用于某些 URL 如何在 python 中获取证书颁发者信息 https stackoverflow com questions 30862099 how can i get cer
  • 通过 https 负载均衡器的 WCF http 服务

    我有一个可以通过 http 端点访问的 WCF Web 服务 现在 该服务应通过 https 与负载均衡器一起发布 客户端是通过 svcutil exe 在 Net 中创建的 但 Java 客户端也需要 WSDL 我的理解是 Web 服务在
  • .NET 中有什么方法可以以编程方式侦听 HTTP 流量吗?

    我正在使用浏览器自动化来测试网站 但我需要验证来自浏览器的 HTTP 请求 即图像 外部脚本 XmlHttpRequest 对象 有没有一种方法可以以编程方式实例化代理以供浏览器使用以查看其发送的内容 我已经在使用 Fiddler 来监视流
  • Nuxt.js 使用 https 调用服务器端 API 的问题

    当我使用 HTTP 时 我遇到 nuxt 服务器端 API 调用问题S 在客户端 一切都很好 当我通过链接在客户端切换页面时 API 可以工作 但是当我按下 Ctrl f5 并且数据将在服务器端预取时 实际上没有 API 调用 也没有提供数
  • 如何在Delphi中下载一个非常简单的HTTPS页面?

    我尝试了在这里看到的代码 但它不适用于 HTTPS 我需要将此页面作为字符串下载 并在其上添加一些换行符 以便将信息按顺序放入 TMemo 中 怎么做 我尝试使用 Indy 但由于 SSL 问题而失败 我尝试了此页面的解决方案 如何将网页下
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • Angular2 中 Http 的 Promise 与 Observable? [复制]

    这个问题在这里已经有答案了 本质上 正如标题所说 是否有任何理由使用可观察的承诺 https stackoverflow com questions 37364973 angular 2 promise vs observable为了进行
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 将混合内容重定向到 HTTPS 的正确 htaccess 规则是什么

    当通过 HTTPS 访问网站时 是否有一种方法可以使用 htaccess 重定向条件和重定向来捕获通过 HTTP 调用的内容 如果通过 HTTPS 访问网站 http 内容将被重定向到 https 等效 url 本质上 当我的网站通过 HT
  • Apache + Symfony2 + HTTPS + Node.js + Socket.io:socket.emit 未触发

    我花了几个小时来解决这个问题 但毫无结果 编辑 找到解决方案 参见我的答案 项目背景 我正在构建一个项目Symfony2 这需要一个用于上传大文件的模块 我选择了Node js and Socket IO 我必须从头开始学习 所以我可能会错
  • Access-Control-Allow-Origin值跨站缓存

    我正在尝试编写一个 nginx 配置来处理 http 和 https 上的两个站点 只要客户端从不访问这两个站点 它似乎就可以工作 但如果它们这样做 就会出现缓存 跨站点问题 Allow cross origin location eot
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Python Requests 库重定向新 url

    我一直在浏览 Python 请求文档 但看不到我想要实现的任何功能 在我的脚本中我设置allow redirects True 我想知道该页面是否已重定向到其他内容 新的 URL 是什么 例如 如果起始 URL 为 www google c

随机推荐

  • linux使用curl加双引号进行转义

    amp 是个特殊符号 xff0c 如果在控制台使用curl curl http 127 0 0 1 8089 ceshi startTime 61 2018 10 24 02 49 35 amp amp endTime 61 2018 10
  • qt程序的CMakeLists.txt配置转为平台的qt的.pro项目工程文件

    参考这个 跨平台qt程序的CMakeLists txt配置转为平台的qt的 pro项目工程文件 谁能懂我2011的博客 CSDN博客 一些比较正规的跨平台qt项目没有 pro项目文件只有CMakeLists txt文件 xff0c 如果要编
  • 单片机堆栈是什么?它的原理和作用又是什么?

    什么是单片机堆栈 xff1f 在片内RAM中 xff0c 常常要指定一个专门的区域来存放某些特别的数据 它遵循顺序存取和后进先出 LIFO FILO 的原则 这个RAM区叫堆栈 它的作用 子程序调用和中断服务时CPU自动将当前PC值压栈保存
  • IMU(陀螺仪、加速度计)&Magnetometer(磁力计)校准方法和流程

    一 何为校准 xff1a 校准的目的是因为厂商在生产器件时 xff0c 由于工艺 技术等原因 xff0c 致使器件存在缺陷 xff0c 导致实际应用时 xff0c 存在误差 xff01 一般器件在出厂时 xff0c 都会做一些校准处理 xf
  • matlab运行RTKDEMO几个小函数

    一 matlab函数 xff1a 1 datenum 将时间点转换为0000年1月0日到现在的天数 xff01 其中起点为 xff1a 0000年1月0日 例如 xff1a K gt gt t0 61 datenum 2005 4 2 0
  • 糖儿飞教你学C++ Socket网络编程——8. 异步通信版的TCP通信程序

    项目3 3中实现的通信程序仍然有很多不足 xff0c 最明显的不足是 xff0c 通信双方不能自动接收对方消息 xff0c 需要单击 接收 按钮才能接收 另外的问题是 xff0c 在服务器端单击 创建服务器 按钮后 xff0c 如果没有客户
  • VINS-Mono

    文章目录 初始化框架缺点ORB SLAM的Local Map VINS的滑窗 逐次逼近式去畸变给后端提供的特征点信息光流追踪对极约束F去除外点 rejectWithF 特征点均匀化预积分系统初始化初始化时不校正bias a误差卡尔曼滤波误差
  • python-异常

    https docs python org 3 library exceptions html 异常 程序在运行过程中 xff0c 不可避免的出现一些错误 没有赋值的变量使用了不存在的索引除0 这些错误在程序中 xff0c 称为异常程序运行
  • STM32CubeMX串口USART中断发送接收数据

    本文代码使用 HAL 库 文章目录 前言一 中断控制二 USART中断使用1 中断优先级设置 xff1a 2 使能中断3 使能UART的发送 接收中断4 中断收发函数5 中断处理函数6 中断收发回调函数 三 串口中断实验串口中断发送数据点亮
  • 关于gcc、make和CMake的区别

    CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件转化为make所需要的m
  • gcc与g++的区别

    一 编译的四个阶段 预处理 xff1a 编译处理宏定义等宏命令 xff08 eg define xff09 生成后缀为 i 的文件 编译 xff1a 将预处理后的文件转换成汇编语言 生成后缀为 s 的文件 汇编 xff1a 由汇编生成的文件
  • 网络编程第一篇之Select模式

    网络编程第一篇之Select模式 今天总结下Select模式下网络编程模型 xff0c 首先我们要知道一个高级的技术 xff0c 绝对不是凭空产生的 xff0c 它一定是在原来的技术上由于满足不了需求 xff0c 然后经过不断的打磨 xff
  • 佛学八正道

    八正道包括正见 正思惟 正语 正业 正命 正精进 正念 正定 大毘婆娑论 说 xff1a 由正见故 xff0c 起正思惟 xff1b 由正思惟故 xff0c 得正语 xff1b 由正语故 xff0c 复得正业 xff1b 由正业故 xff0
  • C语言疑难点汇总解析

    1 大小端知识点 1 1 大小端定义 1 Little Endian就是低位字节排放在内存的低地址端 xff0c 高位字节排放在内存的高地址端 2 Big Endian就是高位字节排放在内存的低地址端 xff0c 低位字节排放在内存的高地址
  • 常见硬件接口汇总(未完待续)

    1 UART 通用异步收发器 xff0c 用于收发数据的串并转换 2 I2C 双线串行接口 3 I3C 4 SCI SIM卡接口 xff0c 接在APB总线上 xff0c 用于与外部读卡器通信 实际也是串并转换的通信方式 5 CSI 6 P
  • 芯片的ATE测试简介

    ATE xff1a Automatic Test Equipment xff0c 即自动测试设备 xff0c 它用于芯片大规模生产测试 xff0c 保障稳健 xff08 质量 成本和进度 xff09 的供应 ATE测试基本的覆盖理念 xff
  • Android发展历程

    发展历程 2003年10月 xff0c Andy Rubin等人创建Android公司 xff0c 并组建Android团队 2005年8月17日 xff0c Google低调收购了成立仅22个月的高科技企业Android及其团队 安迪鲁宾
  • Android系统源码目录详解

    关于源码的阅读 xff0c 你可以访问 xff1a http androidxref com 我们要先了解Android系统源码目录 xff0c 为后期源码学习打下基础 当然 xff0c 最好是将源码下载下来 下载源码可以使用清华大学开源软
  • 使用Iperf工具测试WiFi的吞吐量

    1 windows 上测试网路吞吐量工具 对于window测试网络吞吐量的工具 http download csdn net download leekwen 3427386 iperf windows版测试软件 针对wifi性能进行测试
  • C++封装的HTTP和HTTPS的接口

    记录下http和https的post方法 在C 43 43 中实现 来源无从考究了 xff0c 这里记录一下 http 的post 方法 BOOL HttpPostToBusinessServer LPCTSTR serverAddr st