C++使用WinHTTP访问http/https服务
环境: window10_x64 & vs2022
python版本: 3.9.13
日常开发中,会遇到c/c++作为客户端访问http/https服务的情况,今天整理下windows10环境下c/c++使用winhttp访问http/https服务的笔记,并提供相关资源下载。
我将从以下几个方面展开:
- http服务构建
- https证书生成及服务构建
- winhttp使用示例
- 资源下载
一、模拟http服务端
1、构建http服务
这里使用tornado来构建http服务。
示例代码(httpServer1.py):
#! /usr/bin/env python3
#-*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
import tornado.httpserver
import json,time,datetime
settings = {
"debug" : False ,
}
def trace(reqType,reqBody):
msg = str(datetime.datetime.now()) + " , [" + reqType + "] , " + str(reqBody)
print(msg)
class MainHandler(tornado.web.RequestHandler):
def get(self):
trace("get",self.request.arguments)
#query = self.get_query_argument("query")
#print("query : %s" % query)
self.set_header('content-type', 'application/json')
#self.write(json.dumps({"result" : "test message"}))
self.finish(json.dumps({"result" : "get message"}))
def put(self):
trace("put",self.request.body)
self.finish(json.dumps({"result" : "put message"})) def post(self):
#trace("post",self.request.arguments)
trace("post",self.request.body)
self.set_header('Content-type', 'application/json')
#self.set_header('Transfer-Encoding', 'chunked')
self.finish(json.dumps({"result" : "post message %d" % time.time()}))
if __name__ == "__main__":
port = 8093
print("listen on port %d"%port)
application = tornado.web.Application([
(r"/.*", MainHandler),
],**settings) application.listen(port) #http_server = tornado.httpserver.HTTPServer(application)
#http_server.bind(port,"0.0.0.0")
#http_server.start(num_processes=0) tornado.ioloop.IOLoop.instance().start()
2、服务运行效果
curl测试命令如下:
curl -v http://127.0.0.1:8093 && echo ""
运行效果如下:

二、模拟https服务端
构建https服务,需要使用证书,这里使用自签名证书来实现。
1、生成证书
生成自签名证书(genCertTest1.bat):
goto start
cat > openssl.cnf <<EOF
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no [req_distinguished_name]
C = CN
ST = ShangHai
L = ShangHai
O = MyCompany
OU = Mike_Zhang@live.com
CN = localhost [v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names [alt_names]
DNS.1 = localhost
DNS.2 = 127.0.0.1
IP.1 = 127.0.0.1
EOF
:start :: 生成包含SAN的证书
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes -config openssl.cnf -extensions v3_req
openssl.cnf文件内容如下:
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = CN
ST = ShangHai
L = ShangHai
O = MyCompany
OU = Mike_Zhang@live.com
CN = localhost
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = 127.0.0.1
IP.1 = 127.0.0.1
执行 genCertTest1.bat 脚本,会生产证书文件:

2、构建https服务
这里基于tornado来实现,添加ssl相关内容即可。
示例代码如下(httpsServer1.py):
#! /usr/bin/env python3
#-*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
import tornado.httpserver
import json,time,datetime
import ssl
settings = {
"debug" : False ,
}
def trace(reqType,reqBody):
msg = str(datetime.datetime.now()) + " , [" + reqType + "] , " + str(reqBody)
print(msg)
class MainHandler(tornado.web.RequestHandler):
def get(self):
trace("get",self.request.arguments)
#query = self.get_query_argument("query")
#print("query : %s" % query)
self.set_header('content-type', 'application/json')
#self.write(json.dumps({"result" : "test message"}))
self.finish(json.dumps({"result" : "get message"}))
def put(self):
trace("put",self.request.body)
self.finish(json.dumps({"result" : "put message"})) def post(self):
#trace("post",self.request.arguments)
trace("post",self.request.body)
self.set_header('Content-type', 'application/json')
self.finish(json.dumps({"result" : "post message %d" % time.time()}))
if __name__ == "__main__":
#ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_ctx.load_cert_chain(
certfile="server.crt",
keyfile="server.key"
)
ssl_ctx.options |= (
ssl.OP_NO_SSLv2 |
ssl.OP_NO_SSLv3 |
ssl.OP_NO_TLSv1 |
ssl.OP_NO_TLSv1_1 |
ssl.OP_NO_COMPRESSION
) # 设置现代加密套件
ssl_ctx.set_ciphers(
'ECDHE-ECDSA-AES256-GCM-SHA384:'
'ECDHE-RSA-AES256-GCM-SHA384:'
'ECDHE-ECDSA-CHACHA20-POLY1305:'
'ECDHE-RSA-CHACHA20-POLY1305:'
'DHE-RSA-AES256-GCM-SHA384'
) # 设置椭圆曲线
ssl_ctx.set_ecdh_curve('prime256v1') # 必需的安全设置 port = 8443
print("listen on port %d"%port)
app = tornado.web.Application([
(r"/.*", MainHandler),
],**settings) http_server = tornado.httpserver.HTTPServer(app, ssl_options=ssl_ctx)
#http_server.listen(port)
http_server.bind(port,"0.0.0.0")
http_server.start() tornado.ioloop.IOLoop.current().start()
3、服务运行效果
curl测试命令如下(忽略证书):
curl -vk https://127.0.0.1:8443 && echo ""
运行效果如下:

三、使用WinHTTP实现客户端
1、WinHTTP说明
Microsoft Windows HTTP 服务 (WinHTTP) 提供 HTTP 客户端应用程序编程接口 (API),以便通过 HTTP 协议将请求发送到其他 HTTP 服务器。
该服务提供 C/C++ 应用程序编程接口 (API) ,支持HTTPS协议。
文档地址:
https://learn.microsoft.com/zh-cn/windows/win32/winhttp/winhttp-start-page
c/c++接口文档地址:
https://learn.microsoft.com/zh-cn/windows/win32/winhttp/using-the-winhttp-c-c---api

2、使用示例
关键点:
1)使用 WinHttpConnect 函数创建连接;
2)使用WinHttpOpenRequest设置get/post方法、http/https协议等参数;
3)WinHttpAddRequestHeaders 设置http自定义请求头;
4)WinHttpSendRequest发送数据;
示例代码如下(winhttpTest1.cpp):

完整代码可从如下渠道获取:

四、资源获取

C++使用WinHTTP访问http/https服务的更多相关文章
- 使用poco 的NetSSL_OpenSSL 搭建https 服务端,使用C++客户端,java 客户端访问,python访问(python还没找到带证书访问的代码.)
V20161028 由于项目原因,需要用到https去做一些事情. 这儿做了一些相应的研究. 这个https 用起来也是折腾人,还是研究了一周多+之前的一些积累. 目录 1,java client 通 ...
- 国产化之银河麒麟.netcore3.1访问https服务的两个问题
背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版 ...
- 网络服务器之HTTPS服务
import ssl, socket, time if __name__ == "__main__": context = ssl.SSLContext(ssl.PROTOCOL_ ...
- 架设证书服务器 及 让IIS启用HTTPS服务(转)
无废话图文教程,教你一步一步搭建CA服务器,以及让IIS启用HTTPS服务. 一.架设证书服务器(CA服务) 1.在系统控制面板中,找到“添加/删除程序”,点击左侧的“添加/删除windows组件”, ...
- 为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务
昨天测试开发微信小程序,才发现微信也要求用HTTPS加密数据,想来是由于之前苹果的ATS审核政策的缘故吧,微信想在苹果上开放小程序必然也只能要求开发者必须使用HTTPS了,于是在服务器上测试安装Ngi ...
- .Net Core和jexus配置HTTPS服务
花了几天时间,看了好多篇博客,终于搞定了网站的HTTPS服务,借此写篇博客,来让有需要的朋友少走弯路. 一.环境介绍 1.Linux下在Docker容器中部署好了一个网站,该网站需要通过外部提供程序访 ...
- 用keytool制作证书并在tomcat配置https服务(二 )
用keytool制作证书并在tomcat配置https服务(一) 双向认证: 我们上边生成了服务端证书,并发送给客户端进行了验证. 双向认证是双向的,因此还差客户端证书. 1.为方便导入浏览器,生成p ...
- 用keytool制作证书并在tomcat配置https服务(一)
https分为单项认证和双向认证. 一般https页面上的访问都是单项认证,服务端发送数字证书给客户端,客户单方面验证.而服务端不做验证. 而双向认证,需要双方都有证书,然后发送给对方进行验证.一般用 ...
- 使用Let's Encrypt搭建永久免费的HTTPS服务
1.概述1.1 HTTPS概述HTTPS即HTTP + TLS,TLS 是传输层加密协议,它的前身是 SSL 协议.我们知道HTTP协议是基于TCP的.简而言之HTTPS就是在TCP的基础上套一层TL ...
- C#访问gsoap的服务--可用
问题来源: C++开发一个webservice,然后C#开发客户端,这样就需要C#的客户端访问gsoap的服务端.(大家都知道gsoap是C/C++开发webservice的最佳利器) 为什么不考虑直 ...
随机推荐
- FastAPI 核心安全功能与模板渲染的完整示:登录、CSRF、JWT、会话、认证和缓存功能
以下是一个整合 FastAPI 核心安全功能与模板渲染的完整示例,基于多个技术文档的最佳实践,包含登录.CSRF.JWT.会话.认证和缓存功能: from datetime import dateti ...
- CH182F7与LAN8720A对比
1.CH182F7简介 CH182F7是一款支持Auto-MDIX的工业级10/100M以太网PHY收发器.内部包括物理编码子层(PCS).物理介质接入层(PMA).双绞线物理介质相关子层(TP-PM ...
- gRPC+Proto 实现键盘记录器 —— 深度实战解析
在当今的分布式系统开发领域,RPC(Remote Procedure Call,远程过程调用) 技术犹如一颗璀璨的明星,凭借其强大的透明性和卓越的高性能,在微服务架构中占据着举足轻重的地位.本文将全方 ...
- 🎀在线设计平台-mastergo
简介 MasterGo是一款面向现代团队的专业在线UI/UX设计平台,它支持界面设计.交互原型制作.设计系统管理和团队协作等功能.这款工具旨在提升设计师的工作效率,并促进团队成员之间的高效沟通与合作. ...
- python处理ppt文件,转换成图片或者pdf文件(获取目录下所有文件信息、文件名称分割、文档操作)
把PPT每一页截图到公众号里推送可是个体力活,那就用python脚本去分解ppt,保存每一个为一张图片好了 需要用到"win32com.client"库 import win32c ...
- Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?
Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性? CMS(Concurrent Mark-Sweep)和 G1(Garbage-First)垃圾收集器是两种低延迟的垃圾回收器,它们通 ...
- Web前端入门第 40 问:CSS float 浮动布局应用场景
CSS float 浮动属性最早用于文字环绕图片效果,就像传统报纸上的印刷排版一样. CSS2 的规范推动了浮动用于其他元素,float 便被大范围应用于布局,当年常说的 div + css 布局,f ...
- 【记录】Python3|Windows下Python3.11.0的pybluez安装(用于处理蓝牙模块的数据)
参考: 官方安装文档:https://github.com/pybluez/pybluez/blob/master/docs/install.rst 仓库的issue447:https://githu ...
- linux与docker知识积累
0.在CentOS中,启动docker : sudo systemctl start docker 1.在 CentOS 中,要删除一个文件夹及其内容,可以使用 rm 命令的 -r 或 --recur ...
- C#快速排序算法实现及循环条件细节思考
C#快速排序算法实现及循环条件细节思考 快速排序是一种分治思想的递归排序算法,其基本思想为: 在每一步中,挑选一个主元(pivot)出来,比如第一个元素 然后遍历除主元外的剩下的元素,把所有小于主元的 ...