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

这篇具有很好参考价值的文章主要介绍了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 body
    const 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头部。文章来源地址https://www.toymoban.com/news/detail-767663.html

到了这里,关于C++异步网络库workflow入门教程(1)HTTP任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++入门教程,C++基础教程(第一部分:从C到C++)七

    由C语言发展而来的一种面向对象的编程语言。 本章讲述 C++ 语言的简史,以及 C++ 语言中与面向对象关系不大、C语言中没有的特性。这些特性能够增加编程的便利性,提高程序的可扩充性。 inline 可以只在函数定义处添加,也可以只在函数声明处添加,也可以同时添加

    2024年02月02日
    浏览(45)
  • C++入门(保姆级教程)

    目录 一、C++ 二、命名空间 2.1 C语言中的命名冲突  2.2 C++中命名空间 2.2.1 命名空间的定义 2.2.2 命名空间的特性 2.2.3 命名空间的使用 2.2.4 补充知识 2.2.4 C++库的命名空间 三、C++中的输入输出 四、缺省参数 4.1  定义 4.2 缺省参数的分类 4.2.1 全缺省参数 4.2.2 半缺省参数

    2024年02月07日
    浏览(48)
  • c++教程1快速入门

    欢迎来到令人兴奋的C++编程世界。本章将演示如何创建简单的C++程序,以及如何在程序中存储数据。 C++简介 安装编译器 编写第一个程序 编译和运行程序 创建变量 使用变量数组 使用向量数组 声明常量 C++是C编程语言的扩展,早在1972年由Dennis Ritchie首次在UNIX操作系统上实现

    2024年02月04日
    浏览(45)
  • C++引用10分钟入门教程

    我们知道,参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。 对于像 char、bool、int、float 等基本类型的数据,它们占用的内存往往只有几个字节,对它们进行内存拷贝非常快速。而数组、结构体、

    2024年01月19日
    浏览(44)
  • C++ opencv操作入门教程

    OpenCV是一个功能强大的计算机视觉库,广泛应用于图像和视频处理领域。它提供了许多图像和视频处理的函数和工具,包括加载、保存、缩放、旋转、裁剪、滤波、特征检测、跟踪、分割等等。本文将介绍一些常见的OpenCV函数及其作用,适合初学者入门。 cv::Mat:代表一个n维

    2024年02月16日
    浏览(44)
  • c++小学生入门教程(三)

    1、辗转相除法 两个正整数m,n的最大公约数  因为m与n和r都相关,所以求m和n的最大公约数等价于n和r的最大公约数      辗转相除法:欧几里得      ①求 m除以n的余数r r=m%n     ②当r!=0时,执行第③步,当r=0时,n就是最大公约数     ③让m=n,n=r,再求m除以n的余数r (新的m

    2024年02月06日
    浏览(49)
  • c++超详细基础教程(快速入门)

    ❤作者:那些年丶我们逃过的课 ❤博客主页:那些年丶我们逃过的课的博客_CSDN博客-c++题目,c++学习记录,c++小游戏领域博主 ❤码云gitee:我的码云 - Gitee.com ❤期待你的关注,如果觉得还可以的话,可以点赞评论支持一下,每个评论我都会回访的🎉 教程简介 c++初步了解 c++简

    2024年04月15日
    浏览(92)
  • C++入门教程||C++while循环

    C++ 中  while  循环的语法: 在这里, statement(s)  可以是一个单独的语句,也可以是几个语句组成的代码块。 condition  可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。 当条件为假时,程序流将继续执行紧接着循环的下一条语句。 在这里, while  循

    2024年02月08日
    浏览(66)
  • 【C++入门篇】保姆级教程篇【上】

      目录 一、第一个C++程序 二、C++命名空间         1)什么是命名空间?         2)命名空间的使用         3) std库与namespace展开         4)命名空间的嵌套使用  三、输入输出方式 四、缺省参数         1)什么是缺省参数?         2)多个缺省值的缺省参数 五、

    2024年02月08日
    浏览(52)
  • [转载]C++ 入门教程(41课时) - 阿里云大学

    本教程是专门为初学者打造的,帮助他们理解与 C++ 编程语言相关的基础到高级的概念。 在您开始练习本教程中所给出的各种实例之前,您需要对计算机程序和计算机程序设计语言有基本的了解。 运行结果: 你可以用 \\\"n\\\" 代替以上代码里的 \\\"endl\\\"。 C++ 是一种静态类型的、编

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包