使用c++ winhttp实现post请求
winhttp是windows网络库,要测试自己写的post请求是否有效,首先得在postman上面建立一个可用的接口。我的如下。
代码思路如下:
1、首先使用WinHttpCrackUrl拆解链接,后面会使用到拆解出来的信息。
2、再使用WinHttpOpen初始化
3、WinHttpSetTimeouts设置超时,这一步可有可无。
4、WinHttpConnect链接到目标,这里就需要使用拆解出来的信息了
5、WinHttpOpenRequest创建一个http请求
6、WinHttpAddRequestHeaders这里添加请求头,需要注意的是请求头类型需要和postman中的头相对应。
7、WinHttpSendRequest发送请求
8、WinHttpReceiveResponse收取回答
9、WinHttpQueryDataAvailable、WinHttpReadData查询读取回复
整个winhttp的post请求就是这么简单
注:const wchar_t *wzUrl 表示链接地址
std::string &cstrRecv 表示获取到的回复
DWORD dwMaxSize回复的最大长度
std::string data表示发送参数
bool PostWebData ( const wchar_t *wzUrl , std::string &cstrRecv , DWORD dwMaxSize, std::string data)
{
cstrRecv.clear();
HINTERNET hSession = NULL , hConnect = NULL , hRequest = NULL;
PVOID pTempBuf = NULL;
DWORD dwDownloaded = 0 , dwTotalDownloaded = 0;
DWORD dwSize = 0;
DWORD dwTotal = 0;
DWORD dwFlag = 0;
URL_COMPONENTS urlComp = {0};
urlComp.dwStructSize = sizeof(urlComp);
urlComp.dwSchemeLength = -1;
urlComp.dwHostNameLength = -1;
urlComp.dwUrlPathLength = -1;
urlComp.dwExtraInfoLength = -1;
std::string sendData = data;
const void* ss = (const char*)sendData.c_str();
if ( !WinHttpCrackUrl(wzUrl , wcslen(wzUrl) , 0 , &urlComp) )
return false;
hSession = WinHttpOpen ( L"User-Agent" ,
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY ,
WINHTTP_NO_PROXY_NAME ,
WINHTTP_NO_PROXY_BYPASS ,
0 );
if ( hSession == NULL )
{
return false;
}
WinHttpSetTimeouts( hSession, 20000 , 20000 , 0 , 0 );
std::wstring wstrHostName = urlComp.lpszHostName;
wstrHostName = wstrHostName.substr ( 0 , urlComp.dwHostNameLength );
hConnect = WinHttpConnect ( hSession , wstrHostName.c_str() , urlComp.nPort , 0 );
if ( hConnect == NULL )
{
goto Failed1;
}
if ( urlComp.nPort == INTERNET_DEFAULT_HTTPS_PORT )
{
dwFlag = WINHTTP_FLAG_SECURE;
}
else
{
dwFlag = 0;
}
hRequest = WinHttpOpenRequest ( hConnect ,
L"POST" ,
urlComp.lpszUrlPath ,
L"HTTP/1.1" ,
WINHTTP_NO_REFERER ,
WINHTTP_DEFAULT_ACCEPT_TYPES ,
dwFlag );
if ( hRequest == NULL )
{
goto Failed2;
}
LPCWSTR header = L"Content-type: application/x-www-form-urlencoded\r\n";
SIZE_T len = lstrlenW(header);
WinHttpAddRequestHeaders(hRequest,header,DWORD(len), WINHTTP_ADDREQ_FLAG_ADD);
if(!hRequest)
goto Failed3;
if ( !WinHttpSendRequest(hRequest, 0, 0,const_cast<void *>(ss),sendData.length(), sendData.length(), 0 ) )
{
goto Failed3;
}
if ( !WinHttpReceiveResponse(hRequest , NULL) )
{
goto Failed3;
}
do
{
dwSize = 0;
if ( !WinHttpQueryDataAvailable(hRequest, &dwSize) )
{
goto Failed3;
}
if ( dwSize == 0 )
break;
dwTotal += dwSize;
if ( dwTotal >= dwMaxSize )
{
goto Failed3;
}
pTempBuf = calloc ( 1 , dwSize + 16 );
if ( pTempBuf == NULL )
{
goto Failed3;
}
if ( !WinHttpReadData(hRequest , (PVOID)((UINT64)pTempBuf) , dwSize , &dwDownloaded) )
{
free ( pTempBuf );
goto Failed3;
}
if ( dwDownloaded == 0 )
{
free ( pTempBuf );
break;
}
cstrRecv += (char*)pTempBuf;
free ( pTempBuf );
dwTotalDownloaded += dwDownloaded;
} while (dwSize > 0);
WinHttpCloseHandle ( hRequest );
WinHttpCloseHandle ( hConnect );
WinHttpCloseHandle ( hSession );
return true;
Failed3:
WinHttpCloseHandle ( hRequest );
Failed2:
WinHttpCloseHandle ( hConnect );
Failed1:
WinHttpCloseHandle ( hSession );
return false;
}
使用c++ winhttp实现post请求相关推荐
- C++编程笔记:使用WinHTTP实现HTTP访问(解决接收UTF8数据乱码问题)
实现HTTP访问的流程包括以下几步: 1, 首先我们打开一个Session获得一个HINTERNET session句柄: 2, 然后我们使用这个session句柄与服务器连接得到一个HINTER ...
- WinInet 和 WinHttp 有何区别?
自制工具 翰华Box:https://hanhuabox.lanzous.com/b00zjq9uf 翰华Box - 开发日志:https://blog.csdn.net/qq_41517936/ ...
- C++ winhttp 实现文件下载器
本篇内容讲述 C++ winHttp 实现下载器的简单 demo,使用了 WinHttpOpen.WinHttpConnect.WinHttpOpenRequest.WinHttpSendReques ...
- Fiddler大师之路系列(一)
江湖传言,Fiddler是捕获客户端与服务器之间的所有HTTP(S) 请求的利器,但是在具体使用过程中,发现使用Fiddler进行抓包时有一部分请求总是没到,多方苦寻之下发现客户端使用WinINET这 ...
- VB6 调用HttpsAPI请求(WinHttp.WinHttpRequest)
VB6客户端中如何访问Https的API请求呢? 使用WinHttp组件里的WinHttpRequest对象可以解决我们的问题. 1.引用"Microsoft WinHTTP Service ...
- qt中使用winhttp发送服务端请求
2019独角兽企业重金招聘Python工程师标准>>> /** * @brief HttpClient::HttpRequest * 发送服务器请求 * @param url * @ ...
- VisualFreeBasic通过WinHttp.dll实现Http/Https请求
VisualFreeBasic中自带了Http请求的操作,自带了三个函数Http_Get.Http_Post.Http_Upload. 'GET方法获取网页 'URL:字符串,目标域名或者IP地址+, ...
- winhttp 请求头加上Accept-Encoding: deflate, gzip后该如何解压,不加会出现不可识别的乱码
hRequest = OpenRequest(hConnect, L"GET" ..... //自动判断gzip,如果压缩了,就会自动解压 DWORD dwOption = ...
- 实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现
在<使用WinHttp接口实现HTTP协议Get.Post和文件上传功能>一文中,我已经比较详细地讲解了如何使用WinHttp接口实现各种协议.在最近的代码梳理中,我觉得Post和文件上传 ...
- 使用WinHttp接口实现HTTP协议Get、Post和文件上传功能
我实现了一个最新版本的接口,详见<实现HTTP协议Get.Post和文件上传功能--使用WinHttp接口实现>.还有基于libcurl实现的版本<实现HTTP协议Get.Post和 ...
最新文章
- 作为一名合格的前端开发工程师需要会哪些
- java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...
- Android源码解析(一)动画篇-- Animator属性动画系统
- flutter 图片转base64_京东技术中台的Flutter实践之路
- mpvue 微信小程序_使用Vue.js开发微信小程序:开源框架mpvue解析
- js中实现页面跳转(返回前一页、后一页)
- 计算机网络讨论4,计算机网络实验四
- 大数据和BI商业智能有何区别?有何相关?
- linux启用dcb步骤,Linux DCB体系——简短概述
- Echart报错: Map china not exists. You can download map file on
- 线性反馈移位寄存器LFSR和循环冗余码CRC
- “同心鼓”运动在理想状态下的最佳策略研究
- 小米6连接WIFI后无法联网,线刷教程
- Android触摸屏校对,android实现触摸屏校准
- 带遮挡效果的轮廓线(描边)在3D实时渲染中的一种实现
- C语言学生成绩信息管理系统课程设计报告
- 无线调试——免除数据线的干扰
- 最短路(Finding Shortest Path)
- 【SQL】LATERAL VIEW 的用法
- ArTalk | 兆芯安超云:打造国产桌面云新势力