记录下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的接口相关推荐

  1. php如何实现用户报警,php封装实现钉钉机器人报警接口的示例代码

    php封装实现钉钉机器人报警接口的示例代码,的是,机器人,接口,本文,消息 php封装实现钉钉机器人报警接口的示例代码 易采站长站,站长之家为您整理了php封装实现钉钉机器人报警接口的示例代码的相关内 ...

  2. 微信公众号开发 公众号接口开发 封装统一的GET/POST请求接口

    10万+IT人都在关注,史上最全面的微信开发实战教程:包含公众号,小程序,微信支付等开发案例 欢迎关注笔者个人博客:http://blogs.chenyunkeji.com/ 在微信公众号/小程序开发 ...

  3. 单页面axios_Axios封装之取消重复请求和接口缓存

    在平时的单页面项目里,大家肯定接触过axios库,一个易用.简洁且高效,使用Promise管理异步,告别传统callback方式的http库. 最近有个项目里接口调取的频率比较高,接口队列长,然后等待 ...

  4. 解决:ngxin做http强制跳转https,接口的POST请求变成GET

    解决:ngxin做http强制跳转https,接口的POST请求变成GET 域名配置了http强制跳转htpps后发现app发起post请求会出现405错误. 所以怀疑是http强制跳转https出现 ...

  5. SSL证书配置(https访问接口, 单向认证和双向认证)

    拿到SSL证书后, 如何才能解锁更多玩法? 一. SpringBoots项目配置https访问接口(直接配置) SSL协议 配置步骤 1. 获取证书/ 生成证书 2. 放置证书 3. 配置项目 pro ...

  6. Python 封装对外可以调用的API接口

    安装库并引用 pip install flask from flask import Flask, jsonify, request, Response 编写API接口 封装成有参请求 本接口的功能是 ...

  7. Java SE(六)之面向对象(封装,继承,多态,接口)

    文章目录 类和对象 1. 创建一个类 2. 创建一个对象 3. 访问变量和方法 4. some tips 封装 修饰符 1. 访问控制修饰符 2. 非访问修饰符 (1)static (2)final ...

  8. 如何讲清楚 Java 面向对象的问题与知识?(类与对象,封装,继承,多态,接口,内部类...)

    二 Java面向对象 类和对象 1.1 什么是面向过程?什么又是面向对象? 面向过程--步骤化 面向过程就是分析出实现需求所需要的步骤,通过函数(方法)一步一步实现这些步骤,接着依次调用即可 面向对象 ...

  9. python写的小程序怎么封装_Promise实现微信小程序接口封装过程

    Promise实现微信小程序接口封装过程 发布时间:2020-06-15 13:40:43 来源:亿速云 阅读:419 作者:鸽子 相信很多开发者都遇到过回调地狱的问题.由于微信小程序的API基本都是 ...

最新文章

  1. VVC专利池最新进展:MC-IF正在召集专利拥有者
  2. 让人吐血的文章,要被气死了
  3. POJ1604 UVA568 UVALive5499 Just the Facts【模除+打表】
  4. [Selenium+Java] Selenium Framework: Keyword Driven Hybrid
  5. 如何在PHP中获得有用的错误消息?
  6. Python实现自己的分布式区块链视频教程-张敏-专题视频课程
  7. 东芝打印机共享怎么设置_东芝 e-studio181怎么设置网络打印机
  8. nand2tetris 布尔函数和和门逻辑路线图
  9. 强监管焕新外卖行业,美团、饿了么如何应对?
  10. java+上传整个文件夹的所有文件
  11. 怎么提取伴奏?只要三招即可快速搞定,附带详细教程
  12. 拼出爱心图案的c语言,抖音爱心图片拼图9格照片怎么弄 高格调拼图已被霸屏
  13. 大数据(分布式计算框架+分布式存储)
  14. audio muted属性绑定无效 vue
  15. VScode Shortcuts for Mac
  16. swiper h5学习
  17. Python爬虫项目:爬取JSON数据存储Excel表格与存储图片
  18. 河北省计算机专业本科院校排名,河北本科院校排名:河北大学仅排第二,第一是一所双非院校...
  19. VMware设置任务栏图标显示与隐藏
  20. 基于java的springboot家政服务预约系统毕业设计springboot开题报告

热门文章

  1. echarts折线图节点改变颜色
  2. DSPE-PEG2K/PEG3.4K/PEG5K-PTP(序列;KTLLPTP)磷脂-聚乙二醇-PTP多肽
  3. 数据结构—最小生成树
  4. Android联系人号码中横线的去除
  5. NLP04:LSTM原理详解及文本生成
  6. 绿色创意2.0 探访阿里千岛湖数据中心
  7. 隐私计算FATE-模型训练
  8. 卖「概念」卖到资产上亿?
  9. CentOS7安装配置SpaceVim
  10. 从零开始搭建ROS移动机器人系列之(一)预备知识及总体框架