当前位置: 首页 > news >正文

c++muduo库--HttpRequest类

HttpRequest

HttpRequest 类是 HTTP 服务器中用于封装和管理 HTTP 请求信息的核心数据结构,它封装了 HTTP 请求的所有关键要素(如请求方法、路径、头部字段等),并提供了一系列方法用于便捷地操作这些数据。

核心成员变量(存储请求信息)

HTTP 请求类成员变量说明

变量名类型作用说明
_methodstd::string存储 HTTP 请求方法(如 GET、POST、PUT、DELETE 等),标识客户端对服务器的操作意图
_pathstd::string存储请求的资源路径(如 /index.html、/api/user),表示客户端要访问的服务器资源位置
_versionstd::string存储 HTTP 协议版本(如 HTTP/1.1、HTTP/1.0),默认初始化为 HTTP/1.1(主流版本)
_bodystd::string存储请求正文(如 POST 请求中的表单数据、JSON 数据),仅在有正文的请求中有效(GET 通常无正文)
_matchesstd::smatch存储通过正则表达式从 _path 中提取的匹配数据(如路由 /user/123 中的 123 作为用户 ID)
_headersstd::unordered_map<std::string, std::string>存储请求头部字段(键值对),如 Host: www.example.com、Content-Type: application/json
_paramsstd::unordered_map<std::string, std::string>存储 URL 查询参数(如 ?id=1&name=test 中的 id=1 和 name=test)

构造函数与重置方法

构造函数 HttpRequest()

HttpRequest() : _version("HTTP/1.1") {}

作用:初始化对象时,将 _version 默认设置为 HTTP/1.1(当前最常用的 HTTP 版本),其他成员变量通过默认构造函数初始化。

ReSet() 方法

void ReSet()
{_method.clear();          // 清空请求方法_path.clear();            // 清空资源路径_version = "HTTP/1.1";    // 重置协议版本为默认值_body.clear();            // 清空请求正文std::smatch match;_matches.swap(match);     // 清空正则匹配结果(通过交换释放原数据)_headers.clear();         // 清空头部字段_params.clear();          // 清空查询参数
}

作用:将 HttpRequest 对象重置为初始状态,用于对象复用(如长连接中处理多个请求时,避免重复创建对象的开销)。

请求头部字段操作(_headers 相关)

SetHeader():插入头部字段

void SetHeader(const std::string &key, const std::string &val)
{_headers.insert(std::make_pair(key, val));
}

作用:向 _headers 中添加一个头部字段(键值对)。
示例:解析请求时,将 Host: example.com 存入 _headers,调用 SetHeader(“Host”, “example.com”)。

HasHeader():判断是否存在指定头部

bool HasHeader(const std::string &key) const
{auto it = _headers.find(key);return it != _headers.end(); // 存在返回true,否则false
}

作用:检查请求中是否包含某个头部字段。

示例:判断是否有 Content-Length 头部(用于确定是否有请求正文):HasHeader(“Content-Length”)。

GetHeader():获取指定头部的值

std::string GetHeader(const std::string &key) const
{auto it = _headers.find(key);return it != _headers.end() ? it->second : ""; // 存在返回值,否则返回空字符串
}

作用:获取指定头部字段的值。

示例:获取请求正文类型:GetHeader(“Content-Type”)(可能返回 application/json)。

查询参数操作(_params 相关)

SetParam():插入查询参数

void SetParam(const std::string &key, const std::string &val)
{_params.insert(std::make_pair(key, val));
}

作用:向 _params 中添加一个查询参数(键值对)。

示例:解析 URL /?id=1&name=test 时,调用 SetParam(“id”, “1”) 和 SetParam(“name”, “test”)。

HasParam():判断是否存在指定查询参数

bool HasParam(const std::string &key) const
{auto it = _params.find(key);return it != _params.end();
}

作用:检查 URL 中是否包含某个查询参数。

示例:判断是否有 id 参数:HasParam(“id”)。

GetParam():获取指定查询参数的值

std::string GetParam(const std::string &key) const
{auto it = _params.find(key);return it != _params.end() ? it->second : "";
}

作用:获取指定查询参数的值。

示例:获取 id 参数的值:GetParam(“id”)(可能返回 “1”)。

辅助方法(请求属性判断)

ContentLength():获取请求正文长度

size_t ContentLength() const
{if (!HasHeader("Content-Length")) {return 0; // 无Content-Length头部,正文长度为0}std::string clen = GetHeader("Content-Length");return std::stol(clen); // 将字符串转为整数(字节数)
}

作用:通过 Content-Length 头部获取请求正文的长度(单位:字节),用于准确读取正文数据(如 POST 请求的表单内容)。

示例:若头部为 Content-Length: 100,则返回 100,表示正文有 100 字节。

Close():判断是否为短连接

bool Close() const
{// 若Connection为keep-alive,则是长连接;否则为短连接if (HasHeader("Connection") && GetHeader("Connection") == "keep-alive") {return false; // 长连接:不关闭连接}return true; // 短连接:处理完请求后关闭连接
}

作用:根据 Connection 头部判断连接类型:

长连接(Connection: keep-alive):处理完当前请求后不关闭 TCP 连接,可复用连接处理后续请求(HTTP/1.1 默认)。

短连接(无 Connection 头部或 Connection: close):处理完请求后关闭 TCP 连接。

使用场景与工作流程

接收请求:

服务器从套接字读取原始 HTTP 数据(如 GET /index.html?name=test HTTP/1.1\r\nHost: …)。

解析请求:

解析请求行,提取 _method(GET)、_path(/index.html)、_version(HTTP/1.1)。

解析 URL 查询参数(name=test),通过 SetParam 存入 _params。

解析请求头部,通过 SetHeader 将字段(如 Host、Connection)存入 _headers。

若有正文(如 POST 数据),根据 ContentLength() 读取正文内容,存入 _body。

业务处理:

服务器通过 GetHeader、GetParam 等方法获取请求信息,执行对应逻辑(如返回静态文件、处理 API 请求)。

复用对象:

若为长连接,处理完请求后调用 ReSet() 重置对象,用于解析下一个请求。

http://www.dtcms.com/a/557454.html

相关文章:

  • 分析网站的关键词唐山做网站公司哪家好
  • 基于MATLAB的雷达信号传播路径损耗仿真
  • cfu相关镜像
  • 关于网站建设的一些事韩雪冬网站设计
  • 如果做网站有做教育行业的招聘网站吗
  • 56.合并区间
  • 卡尔曼滤波算法原理详解:核心公式、C 语言代码实现及电机控制 / 目标追踪应用
  • 互联网创业项目整合网站创建一个公司需要什么
  • 便宜的网站设计企业重庆医院门户网站建设
  • 做网站要会那些ps公司核名查询官网
  • YAML 配置文件格式
  • Linux网络--网络基础概念
  • 网站没有内容 能做优化吗新网站关键词怎么优化
  • Arbess实践指南(1) - 使用Arbess+gitee+sourcefare实现Java项目自动化部署及代码扫描
  • 《系统规划与管理师教程(第2版)》方法篇-第7章 网络环境规划 知识点总结
  • 萧县哪有做网站的制作网站民治
  • 力扣2517. 礼盒的最大甜蜜度
  • 哪个网站可以直接做ppt简单网页模板
  • 福州网站建设托管个人网站设计成品下载
  • Android WebView 从入门到最佳实践
  • 青岛公路建设集团有限公司网站好乐买网站推广方式
  • 自定义字段/动态字段的实现方法汇总
  • Python---数据容器(Dict 字典)
  • zabbix实现监控Hadoop、Docker、SSL证书过期时间应用的保姆级实操流程
  • 怎么在网站空间上传文件西地那非口崩片
  • Linux 容器安装 conda 和 pip
  • 中国建设银行企业门户网站wordpress theme 企业
  • k8s问答题(1)
  • 怎么用dw做带登陆的网站北京新网数码信息技术有限公司
  • MySQL 5.7 安装Audit 审计日志插件