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 流中读取数据

    我正在尝试使用 NET WebRequest WebResponse 类来访问 Twitter 流 API 此处 http stream twitter com spritzer json 我需要能够打开连接并从打开的连接中增量读取数据 目
  • 对过期会话进行休息调用:HTTP 401 响应导致浏览器显示登录窗口

    我编写了一个 HTML 5 应用程序 它使用 AngularJS 并与在 Tomcat 上运行的 Java REST 后端进行交互 我使用 Spring Security 来处理登录和安全性 当用户进入网站时 他将被转发到登录页面 该页面创
  • 无法通过 HTTPS 调用 Web 服务

    我正在开发一个 Net 应用程序 它与 Web 服务通信以获取一些数据 Net 应用程序和 Web 服务之间的连接是通过 HTTPS 完成的 当我从 Net 应用程序调用 Web 服务时 我得到以下堆栈跟踪 System Net WebEx
  • 减少1000张图片的HTTP请求?

    我知道这个问题可能听起来有点疯狂 但我想也许有人会想出一个聪明的主意 假设您在一个 HTML 页面上有 1000 个缩略图 图像大小约为5 10 kb 有没有办法在单个请求中加载所有图像 以某种方式将所有图像压缩到一个文件中 或者您对该主题
  • 使用 Google OAuth2.0 时出现错误请求

    从 Salesforce 中使用 Google OAuth 时 我收到 400 错误请求 以下错误与无效的 grant type 有关 但如果您查看 使用刷新令牌 下的文档 您会发现它是正确的 https developers google
  • PhantomJS 无法打开 HTTPS 站点

    我使用以下基于 loadspeed js 示例的代码来打开一个 https 站点 该站点也需要 http 服务器身份验证 var page require webpage create system require system t add
  • 仅适用于安全页面的安全回形针 URL

    我正在尝试找到使回形针网址安全的最佳方法 但仅限于安全页面 例如 显示存储在 S3 中的图像的主页是http mydomain com http mydomain com图像网址是http s3 amazonaws com mydomain
  • 如何使用 node.js 请求模块使用我自己的证书进行 SSL 调用?

    我正在使用 node js 和此请求模块对另一台服务器进行 HTTP 调用 https github com mikeal request https github com mikeal request 效果很好 我现在需要修改此代码以使用
  • 使用 https 的 Java Jersey RESTful Web 服务

    我是 Java EE 的新手 正在开发一个 RESTful API 其中每个 API 调用用户都会发送编码的凭据 我的问题是如何通过默认的 http 实现 https 协议并确保我的连接安全 我正在使用 Jersey Restful Web
  • 如何使用 http 将 Android 中的文件从移动设备发送到服务器?

    在android中 如何使用http将文件 数据 从移动设备发送到服务器 很简单 您可以使用 Post 请求并将文件作为二进制 字节数组 提交 String url http yourserver File file new File En
  • 我应该使用多个 HttpClient 来进行批量异步 GET 请求吗?

    我有一个场景 我需要在尽可能短的时间内发出大量 GET 请求 想想大约 1000 个 我知道通常最好保留一个客户端并尽可能重用它 Create Single HTTP Client HttpClient client new HttpCli
  • 如何禁用 HTTP 的 HSTS 标头?

    我已将以下内容插入到我网站的 htaccess 中 以便能够访问HSTS预加载列表 https hstspreload appspot com
  • 在 iOS 中,http 204 响应返回空白页面,有办法阻止这种情况吗?

    以前可能有人问过这个问题 但我似乎找不到解决方案 所以如果是这种情况 我深表歉意 我正在开发一个使用express的简单节点应用程序 其中一个帖子路由返回 http 204 并发送它 下面是我的代码 router post id funct
  • 重复的“Access-Control-Allow-Origin: *”标头会破坏 CORS 吗?

    所以我们有一个提供 JSON 服务的 http 资源 它添加了一个 Access Control Allow Origin 旗帜 所以这可以用 CORS 加载 except 所以我被告知 有一些 IE9 怪癖 这意味着这在 IE9 中仍然不
  • ASP.NET 中 HTTP 缓存相关标头的有效含义

    我正在 ASP NET 2 0 中开发一个 Web 应用程序 其中涉及通过资源处理程序 ashx 提供图像 我刚刚实现了处理缓存标头和条件 GET 请求 这样我就不必为每个请求提供所有图像 但我不确定我是否完全理解浏览器缓存发生了什么 图像
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何
  • IIS 8 HTTPS/需要 SSL 导致超时错误

    尝试通过 IIS 8 通过 SSL 发布网站 但出现超时错误 任何帮助表示赞赏 采取的步骤 已验证该网站可以通过 HTTP 访问 http xxx xxx xxx xxx有效 此时使用 IP 地址 如果重要的话 IIS gt 服务器证书 g
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • Angular 2 - Http - 正确忽略空结果

    我有很多处理请求并简单返回 200 的 REST 端点 我注意到将结果映射为错误json 如果我尝试不进行任何类型的映射 我会看到浏览器警告它无法解析 XML 由于不返回任何内容是很常见的 我很好奇我应该如何处理响应 这是一个基本的代码示例

随机推荐

  • 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