connection->_response 是一个 HTTP 响应对象,通常基于 Boost.Beast 的 http::response 模板类。它包含以下主要部分: 1. 状态码(Status Code):表示请求的处理结果(如 200 表示成功,404 表示未找到)。 2. 头部字段(Headers):包含响应的元数据(如 Content-Type、Content-Length 等)。 3. 响应体(Body):实际返回给客户端的数据(如 JSON、HTML 等)。 以下是一个标准的 HTTP 响应示例及其对应的 Boost.Beast 实现。 1. 标准 HTTP 响应示例 http 复制 HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 29
Server: Boost.Beast
Connection: close
{"message": "Hello, World!"} 2. Boost.Beast 实现 以下代码展示了如何使用 Boost.Beast 构建上述 HTTP 响应: cpp 复制 #include <boost/beast.hpp>
#include <boost/asio.hpp>
#include <iostream>
namespace http = boost::beast::http;
// 创建一个 HTTP 响应对象
http::response<http::string_body> create_response() {
// 1. 创建响应对象
http::response<http::string_body> response;
// 2. 设置状态码和原因短语
response.result(http::status::ok); // 200 OK
response.reason("OK");
// 3. 设置头部字段
response.set(http::field::server, "Boost.Beast"); // Server 头部
response.set(http::field::content_type, "application/json"); // Content-Type 头部
response.set(http::field::connection, "close"); // Connection 头部
// 4. 设置响应体
response.body() = R"({"message": "Hello, World!"})";
// 5. 设置 Content-Length 头部
response.prepare_payload(); // 自动计算并设置 Content-Length
return response;
}
int main() {
// 创建响应
auto response = create_response();
// 打印响应内容
std::cout << "HTTP Response:\n";
std::cout << response << std::endl;
return 0;
} 3. 代码解析 (1) 状态码和原因短语 • response.result(http::status::ok):设置状态码为 200。 • response.reason("OK"):设置原因短语为 OK(通常与状态码匹配)。 (2) 头部字段 • Server:标识服务器软件(如 Boost.Beast)。 • Content-Type:指定响应体的格式(如 application/json)。 • Connection:控制连接行为(如 close 表示响应后关闭连接)。 • Content-Length:由 prepare_payload() 自动计算并设置。 (3) 响应体 • response.body():设置响应体的内容(如 JSON 字符串)。 (4) prepare_payload() • 自动计算响应体的大小,并设置 Content-Length 头部。 4. 输出结果 运行上述代码后,输出如下: http 复制 HTTP Response:
HTTP/1.1 200 OK
Server: Boost.Beast
Content-Type: application/json
Content-Length: 29
Connection: close
{"message": "Hello, World!"} 5. 扩展:动态设置响应 以下示例展示了如何根据请求动态设置响应: cpp 复制 http::response<http::string_body> create_dynamic_response(const std::string& name) {
http::response<http::string_body> response;
// 设置状态码
response.result(http::status::ok);
response.reason("OK");
// 设置头部字段
response.set(http::field::server, "Boost.Beast");
response.set(http::field::content_type, "application/json");
response.set(http::field::connection, "close");
// 动态生成响应体
response.body() = R"({"message": "Hello, )" + name + R"("})";
// 自动设置 Content-Length
response.prepare_payload();
return response;
} 调用示例: cpp 复制 auto response = create_dynamic_response("Alice");
std::cout << response << std::endl; 输出: http 复制 HTTP/1.1 200 OK
Server: Boost.Beast
Content-Type: application/json
Content-Length: 26
Connection: close
{"message": "Hello, Alice"} 6. 常见头部字段 以下是一些常用的 HTTP 响应头部字段: 字段名 说明 Content-Type 响应体的格式(如 application/json、text/html)。 Content-Length 响应体的大小(字节数)。 Server 服务器软件名称(如 Boost.Beast)。 Connection 连接行为(如 keep-alive 或 close)。 Cache-Control 缓存控制(如 no-cache)。 Location 重定向目标 URL(用于 3xx 状态码)。 Set-Cookie 设置客户端的 Cookie。 7. 总结 • connection->_response 包含状态码、头部字段和响应体。 • 标准响应:设置状态码、Content-Type、Content-Length 等头部字段,并填充响应体。 • 动态响应:根据请求内容动态生成响应体和头部字段。 • 推荐实践:使用 prepare_payload() 自动计算 Content-Length,避免手动设置错误