使用Windows API发送HTTP请求
先看一个简单的GET示例
#include <Windows.h>
#include <winhttp.h>
#include <stdio.h>
int main()
{
HINTERNET sessionHandle = WinHttpOpen(L"WinHttp Example", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, );
if (sessionHandle)
{
HINTERNET connectionHandle = WinHttpConnect(sessionHandle, L"example.com", INTERNET_DEFAULT_HTTP_PORT, );
if (connectionHandle)
{
HINTERNET requestHandle = WinHttpOpenRequest(connectionHandle, L"GET", L"", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, );
if (requestHandle)
{
BOOL success = WinHttpSendRequest(requestHandle, WINHTTP_NO_ADDITIONAL_HEADERS, , WINHTTP_NO_REQUEST_DATA, , , );
if (success)
{
success = WinHttpReceiveResponse(requestHandle, NULL);
if (success)
{
DWORD dwSize;
do
{
dwSize = ;
LPSTR pszOutBuffer;
DWORD dwDownloaded = ;
if (!WinHttpQueryDataAvailable(requestHandle, &dwSize))
{
printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError());
break;
}
// No more available data.
if (!dwSize)
break;
// Allocate space for the buffer.
pszOutBuffer = new char[dwSize + ];
if (!pszOutBuffer)
{
printf("Out of memory\n");
break;
}
// Read the Data.
ZeroMemory(pszOutBuffer, dwSize + );
if (!WinHttpReadData(requestHandle, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded))
{
printf("Error %u in WinHttpReadData.\n", GetLastError());
}
else
{
printf("%s", pszOutBuffer);
}
// Free the memory allocated to the buffer.
delete[] pszOutBuffer;
// This condition should never be reached since WinHttpQueryDataAvailable
// reported that there are bits to read.
if (!dwDownloaded)
break;
} while (dwSize > );
}
else
{
// Report any errors.
printf("Error %d has occurred.\n", GetLastError());
}
}
else
{
printf("Request failed\n");
}
WinHttpCloseHandle(requestHandle);
}
else
{
printf("Invalid request handle\n");
}
WinHttpCloseHandle(connectionHandle);
}
else
{
printf("Invalid connection handle\n");
}
WinHttpCloseHandle(sessionHandle);
}
else
{
printf("Invalid WinHTTP-session handle\n");
}
system("pause");
return ;
}
有没有一种要崩溃的节奏
仅从example.com获取网页代码,就要写约90行的代码
更麻烦的不是代码量的问题,而是这些API暴露了太多的细节(当然,暴露细节的好处是不限制开发员的思想,根据需求灵活编码)。很多时候,我们并不需要考虑那么多的细节
试着封装成C++类的形式,然而我放弃了,真的太麻烦了
还是用libcurl或cpr之类的库吧
参考链接:WinHttpReadData function | Microsoft Docs
使用Windows API发送HTTP请求的更多相关文章
- 如何使用fiddller跟踪windows进程发送的请求20140911
总结点:如何使用fiddller跟踪windows进程发送的请求 案例如下: 需求:运维工具提出需求,对每个插件的配置文件,同步到运维中心时先加密,然后传输到运维中心解密,存储到数据库 测试分析:这个 ...
- C# 使用 Windows API 发送文件到打印机
最近需要做一个打印的功能,于是在网上找到了这么一个方法. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public cl ...
- Java学习笔记--通过java.net.URLConnection发送HTTP请求
http://www.cnblogs.com/nick-huang/p/3859353.html 使用Java API发送 get请求或post请求的步骤: 1. 通过统一资源定位器(java.net ...
- 【转】用C#调用Windows API向指定窗口发送
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
- 用C#调用Windows API向指定窗口发送按键消息 z
用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.Interop ...
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
腾讯云图片鉴黄集成到C# 官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...
- 用C#调用Windows API向指定窗口发送按键消息
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
- 编写爬虫(spider)的预备知识:用java发送HTTP请求
使用原生API来发送http请求,而不是使用apache的库,原因在于这个第三方库变化实在太快了,每个版本都有不小的变化.对于程序员来说,使用它反而会有很多麻烦,比如自己曾经写过的代码将无法复用. 原 ...
- java发送post请求,使用multipart/form-data的方式传递参数,可实现服务器间文件上传功能(转)
废话少说,直接上代码: /** * 测试上传图片 * */ public static void testUploadImage(){ String url = "http://xxxtes ...
随机推荐
- C++ 代码静态分析工具cppcheck【转】
转自:http://blog.csdn.net/chen19870707/article/details/42393217 权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] c ...
- ATT汇编与Intel汇编的区别,摘自《深入分析linux内核源码》一书
2.6.1 AT&T与Intel汇编语言的比较 我们知道,Linux是Unix家族的一员,尽管Linux的历史不长,但与其相关的很多事情都发源于Unix.就Linux所使用的386汇编语言而言 ...
- ASP 500错误解决方法
最有效的解决方法: 经 c:\windows\temp 目录增加everyone写权限. 环境: windows2008
- Tomcat是怎么工作的(1) -- 开篇
这是一个系列文章的第一篇. 标题还是费了点脑子才确定的,起什么名字比较好呢.Tomcat工作原理?深入浅出Tomcat运行机制?从零开始研究Tomcat?Tomcat是怎么运行起来的?Tomcat是如 ...
- 重复造轮子之RSA算法(一) 大素数生成
出于无聊, 打算从头实现一遍RSA算法 第一步, 大素数生成 Java的BigInteger里, 有个现成的方法 public static BigInteger probablePrime(int ...
- python笔记4:高级特性
4 高级特性 4.1 切片 [:] *注:-- list和tuple,字符串都支持切片 4.2 迭代 Iteration for ... in 及 for ... in if 两个变量迭代时, 例1 ...
- [原创][FPGA][IP-Core]altlvds_tx & altlvds_rx
1. 概述 Alter公司的QuartusII软件提供了LVDS发送和接收的IP核供我们使用,其在本质上可以理解为并行-串行数据的转换器.其在官方文档(见附件)上也这样说过.其中的应用场景有告诉AD/ ...
- ArrayList和LinkedList学习
摘要 ArrayList和LinkedList是对List接口的不同数据结构的实现.它们都是线程不安全的,线程不安全往往出现在数组的扩容.数据添加的时候. 一.ArrayList和LinkedList ...
- PyTorch学习笔记之n-gram模型实现
import torch import torch.nn as nn from torch.autograd import Variable import torch.nn.functional as ...
- 100 Most Influential Books According to Stack Overflow
Please read this blog post to see why this is here. This data was created on 02/13/2012 20:00:00 All ...