windows C++-使用任务和 XML HTTP 请求进行连接(一)
本文会演示如何将 IXMLHTTPRequest2 和 IXMLHTTPRequest2Callback 接口与任务结合使用,以将 HTTP GET 和 POST 请求发送至通用 Windows 平台 (UWP) 应用中的 Web 服务。 通过将 IXMLHTTPRequest2 与任务组合在一起,你可以编写通过其他任务编写的代码。 例如,可以使用下载任务作为任务链的一部分。 工作取消时,下载任务也会响应。
还可以使用 C++ REST SDK 从使用 C++ 应用的 UWP 应用或从桌面 C++ 应用来执行 HTTP 请求。
本文档首先演示如何创建 HttpRequest 及其支持类。 然后,演示如何从使用 C++ 和 XAML 的 UWP 应用使用此类。
IXMLHTTPRequest2 和 IXMLHTTPRequest2Callback 是建议在 UWP 应用中使用的接口。 还可以调整此示例,以用于桌面应用程序。
先决条件
Visual Studio 2017 及更高版本中的 UWP 支持是可选的。 若要安装它,请从 Windows“开始”菜单打开 Visual Studio 安装程序,并选择正在使用的 Visual Studio 版本。 单击“修改”按钮,确保选中“UWP 开发”磁贴。 在“可选组件”下,确保选中“C++ UWP 工具”。 对于 Visual Studio 2017,请使用 v141;对于 Visual Studio 2019,请使用 v142。
定义 HttpRequest、HttpRequestBuffersCallback 和 HttpRequestStringCallback 类
当您使用 IXMLHTTPRequest2 接口通过 HTTP 创建 Web 请求时,可以实现 IXMLHTTPRequest2Callback 接口来接收服务器响应并对其他事件做出响应。 此示例定义了 HttpRequest 类来创建 Web 请求,并定义了 HttpRequestBuffersCallback 和 HttpRequestStringCallback 类来处理响应。 HttpRequestBuffersCallback 和 HttpRequestStringCallback 类支持 HttpRequest 类;在应用程序代码中您只能使用 HttpRequest 类。
GetAsync 类的 PostAsync 和 HttpRequest 方法可以使您分别启动 HTTP GET 和 POST 操作。 这些方法使用 HttpRequestStringCallback 类以便将服务器响应作为字符串读取。 SendAsync 和 ReadAsync 方法使您能够对区块中的大型内容进行流式处理。 这些方法均返回 concurrency::task 以表示操作。 GetAsync 和 PostAsync 方法会产生 task<std::wstring> 值,其中 wstring 部分表示服务器的响应。 SendAsync 和 ReadAsync 方法将产生 task<void> 值;当发送和读取操作完成后这些任务将会完成。
因为 IXMLHTTPRequest2 接口是异步操作的,本示例使用 concurrency::task_completion_event 来创建一个任务,该任务将在回调对象完成或取消下载操作后完成。 HttpRequest 类从此任务创建基于任务的延续以设置最终结果。 HttpRequest 类使用基于任务的延续来确保,即使在前面的任务产生错误或取消的情况下,延续任务也会运行。 有关基于任务的延续的详细信息,请参阅任务并行
若要支持取消,HttpRequest、HttpRequestBuffersCallback 和 HttpRequestStringCallback 类将使用取消标记。 HttpRequestBuffersCallback 和 HttpRequestStringCallback 类使用 concurrency::cancellation_token::register_callback 方法使任务完成事件能够响应取消。
定义 HttpRequest 类
1. 在主菜单中,选择“文件”>“新建”>“项目”。
2. 使用 C++“空白应用(通用 Windows)”模板来创建空白 XAML 应用项目。 此示例将项目命名为 UsingIXMLHTTPRequest2。
3. 在项目中添加一个名为 HttpRequest.h 的标头文件和一个名为 HttpRequest.cpp 的源文件。
4. 在 pch.h 中,添加此代码:
#include <ppltasks.h>
#include <string>
#include <sstream>
#include <wrl.h>
#include <msxml6.h>
5. 在 HttpRequest.h 中,添加此代码:
我们会创建两个类,分别应对不同的情况,第一个类定义如下:
#pragma once
#include "pch.h"inline void CheckHResult(HRESULT hResult)
{if (hResult == E_ABORT){concurrency::cancel_current_task();}else if (FAILED(hResult)){throw Platform::Exception::CreateException(hResult);}
}namespace Web
{namespace Details
{// 当响应需要部分缓冲区时,使用IXMLHTTPRequest2Callback的实现。
// 当只需要完整的响应时,请改用HttpRequestStringCallback。
class HttpRequestBuffersCallback : public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>,IXMLHTTPRequest2Callback,Microsoft::WRL::FtmBase>
{
public:HttpRequestBuffersCallback(IXMLHTTPRequest2* httpRequest, concurrency::cancellation_token ct = concurrency::cancellation_token::none()) :request(httpRequest), cancellationToken(ct), responseReceived(false), dataHResult(S_OK), statusCode(200){// Register a callback function that aborts the HTTP operation when // the cancellation token is canceled.if (cancellationToken != concurrency::cancellation_token::none()){registrationToken = cancellationToken.register_callback([this]() {if (request != nullptr) {request->Abort();}});}dataEvent = concurrency::task_completion_event<void>();}// Called when the HTTP request is being redirected to a new URL.IFACEMETHODIMP OnRedirect(IXMLHTTPRequest2*, PCWSTR) {return S_OK;}// Called when HTTP headers have been received and processed.IFACEMETHODIMP OnHeadersAvailable(IXMLHTTPRequest2*, DWORD statusCode, PCWSTR reasonPhrase){HRESULT hr = S_OK;// We must not propagate exceptions back to IXHR2.try{this->statusCode = statusCode;this->reasonPhrase = reasonPhrase;concurrency::critical_section::scoped_lock lock(dataEventLock);dataEvent.set();}catch (std::bad_alloc&){hr = E_OUTOFMEMORY;}return hr;}// Called when a portion of the entity body has been received.IFACEMETHODIMP OnDataAvailable(IXMLHTTPRequest2*, ISequentialStream* stream){HRESULT hr = S_OK;// We must not propagate exceptions back to IXHR2.try{// Store a reference on the stream so it can be accessed by the task.dataStream = stream;// The work must be done as fast as possible, and must not block this thread,// for example, waiting on another event object. Here we simply set an event// that can be processed by another thread.concurrency::critical_section::scoped_lock lock(dataEventLock);dataEvent.set();}catch (std::bad_alloc&){hr = E_OUTOFMEMORY;}return hr;}// Called when the entire entity response has been received.IFACEMETHODIMP OnResponseReceived(IXMLHTTPRequest2* xhr, ISequentialStream* responseStream){responseReceived = true;return OnDataAvailable(xhr, responseStream);}// Called when an error occurs during the HTTP request.IFACEMETHODIMP OnError(IXMLHTTPRequest2*, HRESULT hrError) {HRESULT hr = S_OK;// We must not propagate exceptions back to IXHR2.try{concurrency::critical_section::scoped_lock lock(dataEventLock);dataHResult = hrError;dataEvent.set();}catch (std::bad_alloc&){hr = E_OUTOFMEMORY;}return hr;}// Create a task that completes when data is available, in an exception-safe way.concurrency::task<void> CreateDataTask();HRESULT GetError() const{return dataHResult;}int GetStatusCode() const{return statusCode;}std::wstring const& GetReasonPhrase() const{return reasonPhrase;}bool IsResponseReceived() const{return responseReceived;}// Copy bytes from the sequential stream into the buffer provided until// we reach the end of one or the other.unsigned int ReadData(_Out_writes_(outputBufferSize) byte* outputBuffer,unsigned int outputBufferSize);private:~HttpRequestBuffersCallback(){// Unregister the callback.if (cancellationToken != concurrency::cancellation_token::none()){cancellationToken.deregister_callback(registrationToken);}}// Signals that the download operation was canceled.concurrency::cancellation_token cancellationToken;// Used to unregister the cancellation token callback.concurrency::cancellation_token_registration registrationToken;// The IXMLHTTPRequest2 that processes the HTTP request.Microsoft::WRL::ComPtr<IXMLHTTPRequest2> request;// Task completion event that is set when data is available or error is triggered.concurrency::task_completion_event<void> dataEvent;concurrency::critical_section dataEventLock;// We cannot store the error obtained from IXHR2 in the dataEvent since any value there is first-writer-wins,// whereas we want a subsequent error to override an initial success.HRESULT dataHResult;// Referenced pointer to the data stream.Microsoft::WRL::ComPtr<ISequentialStream> dataStream;// HTTP status code and reason returned by the server.int statusCode;std::wstring reasonPhrase;// Whether the response has been completely received.bool responseReceived;
};};
};
相关文章:
windows C++-使用任务和 XML HTTP 请求进行连接(一)
本文会演示如何将 IXMLHTTPRequest2 和 IXMLHTTPRequest2Callback 接口与任务结合使用,以将 HTTP GET 和 POST 请求发送至通用 Windows 平台 (UWP) 应用中的 Web 服务。 通过将 IXMLHTTPRequest2 与任务组合在一起,你可以编写通过其他任务编写的代码。 例…...
HTB:Oopsie[WriteUP]
目录 连接至HTB服务器并开启靶机 1.With what kind of tool can intercept web traffic? 2.What is the path to the directory on the webserver that returns a login page? 3.What can be modified in Firefox to get access to the upload page? 4.What is the acc…...
【JAVA高级】如何使用Redis加锁和解锁(一)、Lua脚本执行原理及流程
文章目录 加锁方法一:使用SETNX命令结合EXPIRE命令方法二:使用SET命令的扩展参数(NX和PX)方法三:使用Lua脚本 解锁方法一:简单删除key方法二:使用Lua脚本验证后删除key Lua脚本的执行原理&#…...
2024年使用宝塔面板轻松部署Java Web
以下是2024年最新图形化部署Java Web项目到CentOS系统的手把手教程: 一、准备工作 确保服务器环境:确保你的服务器已经安装了CentOS 7操作系统,并且已经安装了宝塔面板。如果还没有安装,可以参考之前的教程进行安装。下载Java W…...
闯关训练一:Linux基础
闯关任务:完成SSH连接与端口映射并运行hello_world.py 1.创建开发机 2.SSH连接 3. VS-Code 连接 选择 Linux 平台 ,输入密码 ,选择进入文件夹 4.端口映射 按照下文安装Docs pip install gradio 运行server.py import gradio as grdef …...
鸿蒙NEXT开发-ArkTS(基于最新api12稳定版)
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...
laravel延迟队列 取消未支付超时订单订单
1:生成待支付订单时,调用延迟队列 超过十五分钟未支付自动取消 use App\Jobs\endTask; use Illuminate\Support\Carbon; $resPost1 array("act" > "cy_order_cancel", "id" > $id); endTask::dispatch($resPos…...
解锁高效开发的秘密武器
在当今这个信息爆炸、技术日新月异的时代,编程工具的选择对于开发者来说至关重要。一个好的编程工具不仅能够简化代码编写,还能自动化任务、提升调试速度,甚至让团队协作更加顺畅。那么,哪款编程工具能让你的工作效率翻倍呢&#…...
【CSS】兼容处理
兼容前缀兼容查询 由于不同浏览器对CSS标准的支持程度不同,可能会导致在不同浏览器中出现样式差异。为了解决这个问题,需要采取一些措施来提高CSS的兼容性 兼容前缀 兼容前缀针对的浏览器-webkit-WebKit 内核浏览器,如:Safari 、…...
C语言线程
线程 多个进程中通过轮流使用CPU来完成自己的任务,如果多个进程的操作都一模一样那么CPU的开销就会很大,因为进程的地址都是私有的,如果CPU对相同的操作只执行一次,后面再遇到直接去获取即可,这样大大降低了CPU的开销…...
自闭症寄宿学校 vs. 日常教育:为孩子提供更多可能
在探索自闭症儿童的教育路径时,家长们往往面临一个重大的选择:是选择传统的日常教育环境,还是寻找专为自闭症儿童设计的寄宿学校?广州的星贝育园自闭症儿童寄宿制学校,以其独特的教育模式和全方位的关怀体系࿰…...
RxSwift系列(二)操作符
一、变换操作符:buffer、map、compactMap等 1.buffer buffer方法作用是缓冲组合,第一个参数是缓冲时间,第二个参数是缓冲个数,第三个参数是线程。缓存 Observable 中发出的新元素,当元素达到某个数量,或者…...
Gin框架简易搭建(3)--Grom与数据库
写在前面 项目地址 个人认为GORM 指南这个网站是相比较之下最为清晰的框架介绍 但是它在环境搭建阶段对于初学者而言不是很友好,尤其是使用mysql指令稍有不同,以及更新的方法和依赖问题都是很让人头疼的,而且这些报错并非逻辑上的…...
JavaScript模块化-CommonJS规范和ESM规范
1 ES6模块化 1.1 ES6基本介绍 ES6 模块是 ECMAScript 2015(ES6)引入的标准模块系统,广泛应用于浏览器环境下的前端开发。Node.js环境主要使用CommonJS规范。ESM使用import和export来实现模块化开发从而解决了以下问题: 全局作用…...
解决银河麒麟V10中的apt Lock异常
解决银河麒麟V10中的apt Lock异常 一、查找并杀掉apt进程二、删除锁文件三、重新尝试apt命令 💖The Begin💖点点关注,收藏不迷路💖 在使用银河麒麟V10的apt命令时,如果遇到lock异常,可以按以下步骤解决&…...
windows11环境安装lua及luarocks(踩坑篇)
一、lua安装及下载 官方地址: Lua Binaries Download 从这里就有坑了,下载后先解压win64_bin.zip,之后解压lib,用lib中的文件替换win64的,并把include文件夹复制过去,之后复制并重命名lua54,方…...
Glide基本用法及With方法源码解析
文章目录 引入优点 使用步骤导入依赖权限使用 其他用法占位符错误图片后备回调符圆角过渡动画大小调整gif缩略图 使用RequestOptions缓存机制设置缓存策略清理缓存 使用集成库OkHttpVolley with源码解析getRetrieverGlide.getinitializeGlide getRequestManagerRetriever Reque…...
html中的文本标签(含标签的实现案例)
目录 1.标题标签 2.标题标签的align属性 3.段落标签 4.水平线标签hr 5.换行标签br 6.文本样式标签font 编辑7.文本格式化标签 8.文本语义标签 1)时间time标签 2)文本高亮Mark标签 3)cite标签 9.特殊字符标签 10.图像标签img 附录ÿ…...
通信协议感悟
本文结合个人所学,简要讲述SPI,I2C,UART通信的特点,限制。 1.同步通信 UART,SPI,I2C三种串行通讯方式,SPI功能引脚为CS,CLK,MOSI,MISO;I2C功能引…...
IDEA几大常用AI插件
文章目录 前言列表GPT中文版TalkXBito AIIDEA自带的AI 前言 最近AI、GPT特别火,IDEA里面又有一堆插件支持GPT,所以做个专题比较一下各个GPT插件 列表 先看idea的plugins里支持哪些,搜索“GPT”之后得到的,我用下来感觉第一第二和…...
51单片机学习第六课---B站UP主江协科技
DS18B20 1、基本知识讲解 2、DS18B20读取温度值 main.c #include<regx52.h> #include"delay.h" #include"LCD1602.h" #include"key.h" #include"DS18B20.h"float T; void main () {LCD_Init();LCD_ShowString(1,1,"temp…...
sadTalker本地编译
SadTalker一款开源的可生成逼真的人像动画的工具。它利用深度学习技术,根据输入的图像和音频,生成具有生动表情和动作的视频。用户可以通过上传照片或使用预设的模型,轻松创建个性化的动画内容. 以上是官网的图, 下边是本地部署生成的,效果差…...
强化学习核心概念与公式总结
强化学习核心概念与公式总结 1. 核心概念 1.1 智能体(Agent)和环境(Environment) 智能体:学习和做决策的实体环境:智能体交互的外部系统1.2 状态(State) 描述环境在特定时刻的情况1.3 动作(Action) 智能体可以执行的操作1.4 奖励(Reward) 环境对智能体动作的即时反馈1.5 策…...
基础算法--双指针【概念+图解+题解+解释】
更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: 数据结构与算法_Stark、的博客-CSDN博客 其它专栏: 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 座右铭&a…...
国产化系统/鸿蒙开发足浴店收银源码-收缩左侧———未来之窗行业应用跨平台架构
一、左侧展开后 二、代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title></title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><style t…...
如何从硬盘恢复丢失/删除的视频
您是否想知道是否可以恢复已删除的视频? 幸运的是,您可以使用奇客数据恢复从硬盘驱动器、SD 卡和 USB 闪存驱动器恢复已删除的视频文件。 你有没有遇到过这样的情况:当你随机删除文件以释放空间时,你不小心按下了一些重要视频的…...
《Effective C++》第三版——设计与声明(1)
参考资料: 《Effective C》第三版 注意:《Effective C》不涉及任何 C11 的内容,因此其中的部分准则可能在 C11 出现后有更好的实现方式。 条款 18:让接口容易被正确使用,不易被误用 好的接口很容易被正确使用&…...
数值计算的程序设计问题举例
### 数值计算的程序设计问题 #### 1. 结构静力分析计算 **涉及领域**:工程力学、建筑工程 **主要问题**:线性代数方程组(Linear Algebraic Equations) **解释说明**: 在结构静力分析中,我们需要解决复杂的…...
Java之方法的使用
修饰符 返回值 方法名称(形式参数){ } 当无参数的时候形式参数中什么都不写。 列如求两个数相加 修饰符可有可无。 方法重载: 1.方法名相同 2.参数列表不同 3。返回值不影响重载...
sudo 命令:掌握系统权限控制,实现安全高效管理
一、命令简介 sudo 命令允许系统管理员授权普通用户执行特定命令,并以管理员身份运行这些命令,通常需要输入用户自己的密码。 sudo 全称是"substitute user do",意为“替用户做”,也就是“以另一个用户的身…...
seo批量建站/怎样创建自己的网站
回收宝给出的今年低配高价手机排名数据显示,国产手机四强的华为、OPPO、vivo的手机均上榜,仅有小米的手机未有入榜。回收宝给出的数据显示,今年低配高价手机前十名当中以三星Galaxy note20居于第一名,华为有四款手机入榜ÿ…...
建设网站方法/搜索引擎优化的主要工作有
题意: 给出科学计数法的形式,转化成常规的表示,要求保留所有的有效位数 思路:纯粹的字符串处理问题,注意边界条件即可。如1.23E02这种,转化后是123,既不需要补0,也不需要添加小数点。…...
企业网站的公司和产品信息的介绍与网络营销关系/深圳网站制作推广
题目:原题链接(中等) 标签:广度优先搜索、深度优先搜索 解法时间复杂度空间复杂度执行用时Ans 1 (Python)O(N84)O(N8^4)O(N84)O(N)O(N)O(N)36ms (79.65%)Ans 2 (Python)Ans 3 (Python) 解法一: class Solution:_CHA…...
顺德公司网站制作/广西南宁做网站的公司
在C#里面,属性的get 与 set 非常简单方便。 public class bird {public int age { get;set; } public bool isadult{get {return this.age > 1 ? true:false;}} }而在Python里面,属性可以直接获取或赋值。但是如果在获取或赋值时加一些逻辑判断&am…...
唐山网站建设自主开发/快速整站排名seo教程
点击下载 转载于:https://blog.51cto.com/19880614/933589...
网站建设公司比较/seo系统培训班
第五章 泛型 23、 请不要在新代码中使用原生态类型 声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者泛型接口。泛型类和接口统称为泛型。 每种泛型可以定义一种参数化的类型,格式为:先是类或者接口的名称,接…...