c++muduo库--HttpRequest类
HttpRequest
HttpRequest 类是 HTTP 服务器中用于封装和管理 HTTP 请求信息的核心数据结构,它封装了 HTTP 请求的所有关键要素(如请求方法、路径、头部字段等),并提供了一系列方法用于便捷地操作这些数据。
核心成员变量(存储请求信息)
HTTP 请求类成员变量说明
| 变量名 | 类型 | 作用说明 |
|---|---|---|
_method | std::string | 存储 HTTP 请求方法(如 GET、POST、PUT、DELETE 等),标识客户端对服务器的操作意图 |
_path | std::string | 存储请求的资源路径(如 /index.html、/api/user),表示客户端要访问的服务器资源位置 |
_version | std::string | 存储 HTTP 协议版本(如 HTTP/1.1、HTTP/1.0),默认初始化为 HTTP/1.1(主流版本) |
_body | std::string | 存储请求正文(如 POST 请求中的表单数据、JSON 数据),仅在有正文的请求中有效(GET 通常无正文) |
_matches | std::smatch | 存储通过正则表达式从 _path 中提取的匹配数据(如路由 /user/123 中的 123 作为用户 ID) |
_headers | std::unordered_map<std::string, std::string> | 存储请求头部字段(键值对),如 Host: www.example.com、Content-Type: application/json |
_params | std::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() 重置对象,用于解析下一个请求。
