C++异步网络库workflow入门教程(1)HTTP任务

如果觉得小弟写的可以,请给一个点赞+关注支持

workFlow c++异步网络库编译教程与简介

创建并启动http任务

示例

#include <workflow/WFFacilities.h>
int main(){WFHttpTask * httpTask = WFTaskFactory::create_http_task("http://baidu.com",0,0,0);protocol::HttpRequest *req =  httpTask->get_req();req->add_header_pair("Accept","*/*");req->add_header_pair("User-Agent","myHttpTask");req->set_header_pair("Connection","close");httpTask->start();pause();
}

创建任务方法原型

在workflow中所有的客户端任务都放在WFTaskFactory工厂类中,

  • url:请求的http url
  • redirect_max:表示最大重定向次数。如果在请求过程中遇到重定向,该参数指定了最多允许重定向的次数。
  • retry_max:表示最大重试次数。如果请求失败,该参数指定了最多可以重试的次数。
  • callback:这是一个回调函数的指针,用于处理请求的响应。原型为using http_callback_t = std::function<void (WFHttpTask *)>;说白了,就是一个参数为Task本身,没有返回值的函数。这个callback可以传NULL,表示无需callback。我们一切任务的callback都是这个风格。
#include "workflow/WFTaskFactory.h"
class WFTaskFactory
{
public:static WFHttpTask *create_http_task(const std::string& url,int redirect_max,int retry_max,http_callback_t callback);
}

代码解析

  1. 需要说明的是,所有工厂函数不会返回失败,所以不用担心task为空指针,哪怕是url不合法。一切错误都在callback再处理。
  2. httpTask->get_req()函数得到任务的request,默认是GET方法,HTTP/1.1长连接。框架会自动加上request_uri,Host等。
  3. 框架会在发送前根据需要自动加上Content-Length或Connection这些http header。用户也可以通过add_header_pair()方法添加自己的header。
  4. 关于http消息的更多接口,可以在HttpMessage.h中查看。
  5. httpTask->start()启动任务,非阻塞,并且不会失败。之后callback必然会在被调用。因为异步的原因,start()以后显然不能再用httpTask指针了。
  6. 为了让示例尽量简单,start()之后调用pause()防止程序退出,用户需要Ctrl-C结束程序。

处理http抓取结果

示例代码

首先,先看一眼示例代码

#include <workflow/WFFacilities.h>
#include <workflow/HttpMessage.h>
#include <workflow/HttpUtil.h>void callback(WFHttpTask *httpTask){//在回调函数中,可以获取任务的所有信息的protocol::HttpRequest *req =  httpTask->get_req();protocol::HttpResponse *resp = httpTask->get_resp();int state = httpTask->get_state();int error = httpTask->get_error();switch (state){case WFT_STATE_SYS_ERROR:fprintf(stderr,"system error: %s\n", strerror(error));break;case WFT_STATE_DNS_ERROR:fprintf(stderr,"dns error: %s\n", gai_strerror(error));break;case WFT_STATE_SUCCESS:break;}if(state != WFT_STATE_SUCCESS){fprintf(stderr,"Failed\n");return;}else{fprintf(stderr,"Success!\n");}fprintf(stderr,"request\r\n %s %s %s\r\n", req->get_method(),req->get_request_uri(),req->get_http_version());//使用迭代器来遍历首部字段std::string name;std::string value;protocol::HttpHeaderCursor reqCursor(req);while(reqCursor.next(name,value)){fprintf(stderr,"%s:%s\r\n",name.c_str(),value.c_str());}fprintf(stderr,"\r\n");fprintf(stderr,"response\r\n %s %s %s\r\n", resp->get_http_version(),resp->get_status_code(),resp->get_reason_phrase());protocol::HttpHeaderCursor respCursor(resp);while(respCursor.next(name,value)){fprintf(stderr,"%s:%s\r\n",name.c_str(),value.c_str());}fprintf(stderr,"\r\n");//print response bodyconst void *body;size_t size;resp->get_parsed_body(&body,&size);//get_parsed_body方法会修改指针变量body的指向fwrite(body,1,size,stderr);                                   
}
//异步+回调
int main(){signal(SIGINT,sigHandler);WFHttpTask * httpTask = WFTaskFactory::create_http_task("http://baidu.com",0,0,callback);protocol::HttpRequest *req =  httpTask->get_req();req->add_header_pair("Accept","*/*");req->add_header_pair("User-Agent","myHttpTask");req->set_header_pair("Connection","close");httpTask->start();pause();
}

代码解析

  • 在这个callback里,httpTask就是我们通过工厂产生的httpTask。
  • httpTask->get_req()得到任务的request,是HttpMessage类的派生。
    • req->get_method():获取请求方法,这里返回GET
    • req->get_request_uri() :请求url,这里返回http://baidu.com
    • req->get_http_version():http版本,默认HTTP1.1
  • httpTask->get_resp()得到任务的response,这个和request区别不大,都是HttpMessage的派生。
    • resp->get_parsed_body(&body,&size)获取http响应体,通过传入void*的地址,也就是传入二级指针以及size参数地址,内部修改void*指针的指向以及size值,将其指向内部隐藏的响应体和大小,
    • 这个调用得到的是原始的http body,不解码chunk编码。如需解码chunk编码,可使用HttpUtil.h里的
  • httpTask->get_state()httpTask->get_error()分别获得任务的运行状态和错误码。
    • WFT_STATE_SUCCESS表示运行正常,没有异常
    • WFT_STATE_DNS_ERROR表示出现dns错误,一般是url写错了
    • WFT_STATE_SYS_ERROR表示出现系统错误,
  • 通过HttpHeaderCursor对象,对requestresponseheader进行扫描。获取响应头,在HttpUtil.h可以看到Cursor的定义。
class HttpHeaderCursor
{
public:HttpHeaderCursor(const HttpMessage *message);...void rewind();...bool next(std::string& name, std::string& value);bool find(const std::string& name, std::string& value);...
};

相信这个cursor在使用上应该不会有什么疑惑。

HttpChunkCursor。 另外需要说明的是,find()接口会修改cursor内部的指针,即使用过find()过后如果仍然想对header进行遍历,需要通过rewind()接口回到cursor头部。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python码上行动系列丛书(由北京大学出版社出版)

前言 Python码上行动系列丛书火热来袭&#x1f4a5;&#x1f4a5;&#x1f4a5; 三册在手&#xff0c;Python全掌握&#xff01;无论是初学者还是进阶玩家&#xff0c;我们都有你想要的&#xff01; 让ChatGPT带你轻松入门Python编程&#xff0c;享受编程带来的乐趣&#xff0…

【数据结构】——二叉树功能

前言&#xff1a;我们前面已经了解了二叉树的一些概念&#xff0c;那么我们今天就来了解下二叉树的遍历实现和一些性质。 二叉树的遍历方式有三种&#xff1a;前序&#xff0c;中序&#xff0c;后序。 前序&#xff1a;先根节点&#xff0c;再左子树&#xff0c;最后右子树。 中…

Linux——MySQL数据库系统()

一、访问MySQL数据库 MySQL数据库系统也是一个典型的C/S(客户端/服务器&#xff09;架构的应用&#xff0c;要访问MySQL数据库需要使用专门的客户端软件。在Linux系统中&#xff0c;最简单、易用的MySQL客户端软件是其自带的mysql命令工具。 1、登录到MySQL服务器经过安装后的初…

Leetcode—783.二叉搜索树节点最小距离【简单】

2023每日刷题&#xff08;五十八&#xff09; Leetcode—783.二叉搜索树节点最小距离 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ void dfs(struct TreeNode* roo…

在接触新的游戏引擎的时候,如何能快速地熟悉并开发出一款新游戏?

引言 大家好&#xff0c;今天分享点个人经验。 有一定编程经验或者游戏开发经验的小伙伴&#xff0c;在接触新的游戏引擎的时候&#xff0c;如何能快速地熟悉并开发出一款新游戏&#xff1f; 利用现成开发框架。 1.什么是开发框架&#xff1f; 开发框架&#xff0c;顾名思…

微信抖音快手QQ小程序 - 预支付接口参数out_trade_no长度限制 - jsapi统一下单接口

报错 微信小程序&#xff1a; {"code":0,"show":1,"msg":"输入源“/body/xml/out_trade_no”映射到值字段“商户订单号”字符串规则校验失败&#xff0c;字节数 35&#xff0c;大于最大值 32","data":{"from":&q…

【goland如果使用xorm执行mysql的存储过程】

goland如果使用xorm执行mysql的存储过程 需求背景 存在用户表和用户邀请关系表&#xff0c;当用户A邀请用户B&#xff0c;则B用户为A用户直接邀请的人&#xff1b;B用户邀请了C用户&#xff0c;则C用户就是A用户的间接邀请人。 如何查询当前用户间接邀请的注册用户有那些&am…

ROS2 学习08 导航Nav2:简介、安装、测试效果、错误处理

1、简介 在ROS2中自动导航使用Nav2来实现。 Nav2 使用几个独立的模块化服务&#xff0c;通过 ROS 2接口&#xff08;例如动作服务器或服务&#xff09;与行为树 (BT) 通信。 Nav2 输入包括&#xff1a;TF转换、一个地图源、一个行为树 (BT) XML 文件和相关的传感器数据源; Nav…

每日学习打卡

文章目录 12月份学习&#xff1a;牛客网刷题 12月份学习&#xff1a;牛客网刷题 12/11 周一12/12 周二12/13 周三12/14 周四12/15 周五牛客网1_非技术快速入门&#xff1a;26-39 ✅牛客网1_非技术快速入门&#xff1a;复习1-39 ✅牛客网2_SQL基础进阶&#xff1a;1-18牛客网2_…

C语言好题分享七(三数之和)

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 三数之和 题目来源LeetCode&#xff1a;刷题传送门 题目&#xff1a;给你一个整数数组 nums &#xff0c;判断…

EasyRecovery2024专业版下载安装步骤图文详细教程

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…

2-分布式存储之glusterfs

任务背景 实现了远程的存储共享(NAS或SAN)后, 公司业务发展迅速, 存储空间还需要增大。使用NAS或SAN都不方便扩容&#xff0c;NAS可以增加新的挂载目录, SAN可以增加新的硬盘&#xff0c;但我们希望直接在原来挂载的业务目录上实现在线扩容&#xff0c;数据体量越来越大, 这个…

ChatGLM3-6B和langchain知识库阿里云部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ChatGLM3-6B部署搭建环境部署GLM3 二、Chatglm2-6blangchain部署本地知识库三、Tips四、总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&am…

ffmpeg从视频文件中截取一段视频

处理 ffmpeg -i ./【直播】2023-10-08\ 二〇二三澳洲淨宗學院護國息災三時繫念法會.mp4 -ss 02:43:12 -to 03:03:00 -vcodec copy -acodec copy 阿弥陀佛.mp4参考解释&#xff1a; -i:输入的源文件&#xff1b;-ss hh:mm:ss -to hh:mm:ss:从源视频的某个时间点到某个时间点&a…

7个Js async/await高级用法

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 7个Js async/await高级用法 JavaScript的异步编程已经从回调(Callback)演进到Promise&#xff0c;再到如今广泛使用的async/await语法。后者不仅让异步…

被央视报道过的AIGC产品-贝塔创作(BetaCreator)使用指南

产品地址&#xff1a;betacreator.com 真人图 人台图 商品图 商品变色 建议使用浅色服装进行变色&#xff0c;效果更好 如果没有浅色服装&#xff0c;可以先把服装颜色变为白色

视频剪辑必备的6个免费素材网站

视频剪辑需要用到很多音效、视频、图片等素材&#xff0c;下面我就分享几个剪辑必备的免费视频素材网站&#xff0c;赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但除了设计类素材之外还有很多视频、…

2697. 字典序最小回文串

我的解法&#xff1a; 将字符串反转开始比较。 C class Solution { public:string makeSmallestPalindrome(string s) {string a s, b s;reverse(b.begin(), b.end());int n s.size();for (int i 0; i < n; i) {if (a[i] ! b[i]) {a[i] b[i] min(a[i], b[i]);a[n - …

python学习:浅拷贝与深拷贝详解

copy 一、 & is二、浅拷贝 & 深拷贝(一)、浅拷贝(二)、深拷贝 三、问题 一、’ ’ & ‘is’ ’ 和is是python对象比较常用的两种方式,简单来说,‘ ‘操作符比较对象之间的值是否相等,如 a b 而’is’操作符比较的是对象的身份标识是否相等,即它们是否是同一个…

Linux系统解决“Key was rejected by service”

Linux系统下加载驱动模块出现如上错误提示的原因为&#xff1a;此驱动未经过签名。 方法一、关闭Secure Boot 如果是物理机&#xff0c;需要开机进入BIOS&#xff0c;找到“Secure Boot”的选项&#xff0c;然后关闭。 如果是虚拟机&#xff0c;可以打开虚拟设置&#xff0c…