1.15.C++项目:仿muduo库实现并发服务器之HttpRequest和HttpResponse模块的设计

news2025/1/10 20:32:57

文章目录

  • 一、HttpRequest模块
  • 二、HttpResponse模块
  • 三、实现思想
    • (一)功能
    • (二)意义
  • 四、代码

一、HttpRequest模块

在这里插入图片描述

二、HttpResponse模块

在这里插入图片描述

三、实现思想

(一)功能

  • HttpRequest模块
    存储HTTP请求信息
    接收到一个数据,按照HTTP请求格式进行解析,得到各个关键要素放到Request中
  • HttpResponse模块
    存储HTTP响应信息
    进行业务处理的同时,让使用者向Response中填充响应要素,完毕后,将其组织成HTTP响应格式的数据,发给客户端。

(二)意义

  • HttpRequest模块
    让HTTP请求的分析更加简单
  • HttpResponse模块
    让HTTP响应的过程变得简单

四、代码

  • HttpRequest模块
class HttpRequest {
    public:
        std::string _method;      //请求方法
        std::string _path;        //资源路径
        std::string _version;     //协议版本
        std::string _body;        //请求正文
        std::smatch _matches;     //资源路径的正则提取数据
        std::unordered_map<std::string, std::string> _headers;  //头部字段
        std::unordered_map<std::string, std::string> _params;   //查询字符串
    public:
        HttpRequest():_version("HTTP/1.1") {}
        void ReSet() {
            _method.clear();
            _path.clear();
            _version = "HTTP/1.1";
            _body.clear();
            std::smatch match;
            _matches.swap(match);
            _headers.clear();
            _params.clear();
        }
        //插入头部字段
        void SetHeader(const std::string &key, const std::string &val) {
            _headers.insert(std::make_pair(key, val));
        }
        //判断是否存在指定头部字段
        bool HasHeader(const std::string &key) const {
            auto it = _headers.find(key);
            if (it == _headers.end()) {
                return false;
            }
            return true;
        }
        //获取指定头部字段的值
        std::string GetHeader(const std::string &key) const {
            auto it = _headers.find(key);
            if (it == _headers.end()) {
                return "";
            }
            return it->second;
        }
        //插入查询字符串
        void SetParam(const std::string &key, const std::string &val) {
            _params.insert(std::make_pair(key, val));
        }
        //判断是否有某个指定的查询字符串
        bool HasParam(const std::string &key) const {
            auto it = _params.find(key);
            if (it == _params.end()) {
                return false;
            }
            return true;
        }
        //获取指定的查询字符串
        std::string GetParam(const std::string &key) const {
            auto it = _params.find(key);
            if (it == _params.end()) {
                return "";
            }
            return it->second;
        }
        //获取正文长度
        size_t ContentLength() const {
            // Content-Length: 1234\r\n
            bool ret = HasHeader("Content-Length");
            if (ret == false) {
                return 0;
            }
            std::string clen = GetHeader("Content-Length");
            return std::stol(clen);
        }
        //判断是否是短链接
        bool Close() const {
            // 没有Connection字段,或者有Connection但是值是close,则都是短链接,否则就是长连接
            if (HasHeader("Connection") == true && GetHeader("Connection") == "keep-alive") {
                return false;
            }
            return true;
        }
};
  • HttpResponse模块

class HttpResponse {
    public:
        int _statu;
        bool _redirect_flag;
        std::string _body;
        std::string _redirect_url;
        std::unordered_map<std::string, std::string> _headers;
    public:
        HttpResponse():_redirect_flag(false), _statu(200) {}
        HttpResponse(int statu):_redirect_flag(false), _statu(statu) {} 
        void ReSet() {
            _statu = 200;
            _redirect_flag = false;
            _body.clear();
            _redirect_url.clear();
            _headers.clear();
        }
        //插入头部字段
        void SetHeader(const std::string &key, const std::string &val) {
            _headers.insert(std::make_pair(key, val));
        }
        //判断是否存在指定头部字段
        bool HasHeader(const std::string &key) {
            auto it = _headers.find(key);
            if (it == _headers.end()) {
                return false;
            }
            return true;
        }
        //获取指定头部字段的值
        std::string GetHeader(const std::string &key) {
            auto it = _headers.find(key);
            if (it == _headers.end()) {
                return "";
            }
            return it->second;
        }
        void SetContent(const std::string &body,  const std::string &type = "text/html") {
            _body = body;
            SetHeader("Content-Type", type);
        }
        void SetRedirect(const std::string &url, int statu = 302) {
            _statu = statu;
            _redirect_flag = true;
            _redirect_url = url;
        }
        //判断是否是短链接
        bool Close() {
            // 没有Connection字段,或者有Connection但是值是close,则都是短链接,否则就是长连接
            if (HasHeader("Connection") == true && GetHeader("Connection") == "keep-alive") {
                return false;
            }
            return true;
        }
};

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

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

相关文章

基于若依和flowable6.7.2的ruoyi-nbcio流程管理系统正式发布

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 项目概要 本项目基于 RuoYi-Flowable-Plus 进行二次开发&#xff0c;从nbcio-boot(https://gitee.com/nb…

maven 常用知识速记

创建项目 maven archetype:generate依赖范围 有如下依赖示例&#xff1a; <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.7</version><scope>test</scope> </dependency>其中…

Unity中用序列化和反序列化来保存游戏进度

[System.Serializable]标记类 序列化 [System.Serializable]是一个C#语言中的属性&#xff0c;用于标记类&#xff0c;表示该类的实例可以被序列化和反序列化。序列化是指将对象转换为字节流的过程&#xff0c;以便可以将其保存到文件、数据库或通过网络传输。反序列化则是将字…

Davinci NvM Block配置

存储块的配置方法 在下图中的位置添加Block的时候&#xff0c;Davinci会在NVM模块和Fee模块同时添加Block&#xff0c;并进行关联。且Fee Block的数量由NvM Block的类型决定&#xff0c;当NvM Block是Native时&#xff0c;会生成一个Fee Block&#xff1b;当NvM Block是Redund…

ant design vue:自定义锚点样式

要做一个如下图的锚点&#xff0c;ant design vue的锚点样式比较简单&#xff0c;按照官网文档:affix"false" :showInkInFixed"true"&#xff0c;就可以显示小方块&#xff0c;但是我试了一下不管用&#xff0c;而且锚点组件不固定起来很不方便&#xff0c…

[大三上20231016]JavaEE SpringBoot

[大三上20231016]JavaEE SpringBoot 学习是个积累,踏踏实实去做,多去虚心请教,热爱兴趣很重要 课前提问: Spring框架中的核心组件是什么? IOC,AOP IOC: Inversion of Control即控制反转 AOP: Aspect Oriented Programming 面向切面编程 什么是IOS什么是DI? IOS(作用:…

《向量数据库指南》——选择向量数据库时需要考量的点Milvus Cloud

大禹智库:选择向量数据库时需要考量的点 性能 如上述,查询性能(查询的响应时间,系统的吞吐能力)是在选型向量数据库时的一个重要参考点,市面上现有的向量数据库的 Benchmark 有: ANN-Benchmark 是一种用于评估各种向量数据库和近似最近邻(ANN)算法性能的工具 VectorD…

如何快速集成讯飞星火 2.0 API ?

大家好&#xff0c;我是二哥呀。 之前带大家体验了两波科大讯飞的星火认知大模型&#xff0c;真没想到&#xff0c;反馈远超我的预期&#xff0c;大家普遍都说好&#xff0c;不仅注册方便&#xff0c;工作和学习的效率也得到了极大的提升。 今天继续给大家带来重磅体验&#…

SLAM从入门到精通(a*搜路算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前机器人常用的搜路算法主要有这么几种&#xff0c;迪杰斯特拉算法、a*算法、贪心算法。每一种算法都有自己的场景和优势&#xff0c;可以灵活选…

如何在Linux环境中远程访问企业级夜莺监控分析工具?

文章目录 前言1. Linux 部署Nightingale2. 本地访问测试3. Linux 安装cpolar4. 配置Nightingale公网访问地址5. 公网远程访问Nightingale管理界面6. 固定Nightingale公网地址 前言 夜莺监控是一款开源云原生观测分析工具&#xff0c;采用 All-in-One 的设计理念&#xff0c;集…

微信小程序2

一&#xff0c;视图层 1.什么视图层 框架的视图层由 WXML 与 WXSS 编写&#xff0c;由组件来进行展示。 将逻辑层的数据反映成视图&#xff0c;同时将视图层的事件发送给逻辑层。 WXML(WeiXin Markup language) 用于描述页面的结构。 WXS(WeiXin Script) 是小程序的一套脚本语…

深入理解强化学习——强化学习智能体的四要素:策略(Policy)

分类目录&#xff1a;《深入理解强化学习》总目录 相关文章&#xff1a; 强化学习智能体的四要素&#xff1a;策略&#xff08;Policy&#xff09; 强化学习智能体的四要素&#xff1a;收益信号&#xff08;Revenue Signal&#xff09; 强化学习智能体的四要素&#xff1a;价…

备忘录模式-撤销功能的实现

在idea写代码的过程中&#xff0c;会经常用到一个快捷键——“crtl z”,即撤销功能。“备忘录模式”则为撤销功能提供了一个设计方案。 1 备忘录模式 备忘录模式提供一种状态恢复机制。在不破坏封装的前提下&#xff0c;捕获对象内部状态并在该对象之外保存这个状态。可以在…

关于职业规划的学习经验总结

目录 前言 结构化思考 思考快与慢 积极主动 以终为始 要事第一 前言 每一年的年中或者年终都有一场很重要的活动就是述职,需要花费一定精力投入,那么述职是一种形式吗?当然不是。述职是一种组织的管理手段和机制,通过这种机制除了对战略方向和项目进度进行把控,还对…

chatgpt 4V 识图功能

1.获取图片的sig和file_id 2e0edc6e489ed13a3f32f0dd87527d77.jpg是本地图片的名字 头部认证信息自己F12 抓取 1.获取图片的sighttps://chat.openai.com/backend-api/filesAuthorization:Bearer eyJhbGc****************5V-lztYwLb9hr6LP7g Cookie: **********************…

set_data_check做等长线

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 常常会遇见2out的多个信号需要做等长&#xff0c;下面分享一个脚本。 set port1_coll [get_ports out[*]] set port2_coll [get_ports out[*]] foreach_in_collection temp1 $…

ChatGPT教你5分钟解锁国际象棋技能

国际象棋是一种很好玩的棋类游戏&#xff0c;走法和规则与中国象棋有所区别。如果想要快速入门&#xff0c;可以把ChatGPT当做私人教练&#xff0c;提出这些问题&#xff1a; ●作为零基础的初学者&#xff0c;学习国际象棋的最佳方法是什么&#xff1f;如何快速入门&#xff…

计算机保研推免面试复习大纲(数学+408)

目录 线性代数概率论高等数学信号与系统离散数学操作系统计算机网络计算机组成数据结构算法编译原理C杂项 线性代数 怎么求逆矩阵 逆矩阵&#xff1a; A A − 1 E AA^{-1}E AA−1E&#xff0c;伴随矩阵&#xff1a; A A ∗ A ∗ A ∣ A ∣ E AA^{*}A^{*}A|A|E AA∗A∗A∣A∣…

算法通关村第一关-链表白银经典问题笔记

大家好今天来写第一关的白银挑战-链表经典问题. 两个链表的第一个公共结点 这是一道经典的链表问题 : 输入两个无环的单向链表&#xff0c;找出它们的第一个公共结点&#xff0c;如果没有公共节点则返回空。 牛客NC66 : 剑指offer56 : 分析 : 屡试不爽的方法: 将常用数据…

第15章 SpringBoot

所有的流程逻辑原理都是针对2.3.2.RELEASE版本 15.1 谈谈你对微服务架构演进的理解 难度:★ 重点:★ 白话解析 还是串主线,在串主线的过程中发现问题,解决问题。主线的入口:随着业务的逻辑越来越复杂,架构再不断升级演进,先理解架构的演进。 这道题参考了:企业IT架构转…