C++封装的HTTP和HTTPS的接口
记录下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;
}
C++封装的HTTP和HTTPS的接口相关推荐
- php如何实现用户报警,php封装实现钉钉机器人报警接口的示例代码
php封装实现钉钉机器人报警接口的示例代码,的是,机器人,接口,本文,消息 php封装实现钉钉机器人报警接口的示例代码 易采站长站,站长之家为您整理了php封装实现钉钉机器人报警接口的示例代码的相关内 ...
- 微信公众号开发 公众号接口开发 封装统一的GET/POST请求接口
10万+IT人都在关注,史上最全面的微信开发实战教程:包含公众号,小程序,微信支付等开发案例 欢迎关注笔者个人博客:http://blogs.chenyunkeji.com/ 在微信公众号/小程序开发 ...
- 单页面axios_Axios封装之取消重复请求和接口缓存
在平时的单页面项目里,大家肯定接触过axios库,一个易用.简洁且高效,使用Promise管理异步,告别传统callback方式的http库. 最近有个项目里接口调取的频率比较高,接口队列长,然后等待 ...
- 解决:ngxin做http强制跳转https,接口的POST请求变成GET
解决:ngxin做http强制跳转https,接口的POST请求变成GET 域名配置了http强制跳转htpps后发现app发起post请求会出现405错误. 所以怀疑是http强制跳转https出现 ...
- SSL证书配置(https访问接口, 单向认证和双向认证)
拿到SSL证书后, 如何才能解锁更多玩法? 一. SpringBoots项目配置https访问接口(直接配置) SSL协议 配置步骤 1. 获取证书/ 生成证书 2. 放置证书 3. 配置项目 pro ...
- Python 封装对外可以调用的API接口
安装库并引用 pip install flask from flask import Flask, jsonify, request, Response 编写API接口 封装成有参请求 本接口的功能是 ...
- Java SE(六)之面向对象(封装,继承,多态,接口)
文章目录 类和对象 1. 创建一个类 2. 创建一个对象 3. 访问变量和方法 4. some tips 封装 修饰符 1. 访问控制修饰符 2. 非访问修饰符 (1)static (2)final ...
- 如何讲清楚 Java 面向对象的问题与知识?(类与对象,封装,继承,多态,接口,内部类...)
二 Java面向对象 类和对象 1.1 什么是面向过程?什么又是面向对象? 面向过程--步骤化 面向过程就是分析出实现需求所需要的步骤,通过函数(方法)一步一步实现这些步骤,接着依次调用即可 面向对象 ...
- python写的小程序怎么封装_Promise实现微信小程序接口封装过程
Promise实现微信小程序接口封装过程 发布时间:2020-06-15 13:40:43 来源:亿速云 阅读:419 作者:鸽子 相信很多开发者都遇到过回调地狱的问题.由于微信小程序的API基本都是 ...
最新文章
- VVC专利池最新进展:MC-IF正在召集专利拥有者
- 让人吐血的文章,要被气死了
- POJ1604 UVA568 UVALive5499 Just the Facts【模除+打表】
- [Selenium+Java] Selenium Framework: Keyword Driven Hybrid
- 如何在PHP中获得有用的错误消息?
- Python实现自己的分布式区块链视频教程-张敏-专题视频课程
- 东芝打印机共享怎么设置_东芝 e-studio181怎么设置网络打印机
- nand2tetris 布尔函数和和门逻辑路线图
- 强监管焕新外卖行业,美团、饿了么如何应对?
- java+上传整个文件夹的所有文件
- 怎么提取伴奏?只要三招即可快速搞定,附带详细教程
- 拼出爱心图案的c语言,抖音爱心图片拼图9格照片怎么弄 高格调拼图已被霸屏
- 大数据(分布式计算框架+分布式存储)
- audio muted属性绑定无效 vue
- VScode Shortcuts for Mac
- swiper h5学习
- Python爬虫项目:爬取JSON数据存储Excel表格与存储图片
- 河北省计算机专业本科院校排名,河北本科院校排名:河北大学仅排第二,第一是一所双非院校...
- VMware设置任务栏图标显示与隐藏
- 基于java的springboot家政服务预约系统毕业设计springboot开题报告