假设我们有一个简单的 HTTP 服务器,它使用 HttpConnection
类来处理客户端的 HTTP 请求。在这个服务器中,我们的业务逻辑通过 LogicSystem
实现。以下是一些实例。
示例请求
- 有效的 GET 请求:客户端发送一个 GET 请求,目标是
/api/data
。 - 无效的 GET 请求:客户端尝试访问不存在的资源,例如 GET 请求到
/api/invalid
.
1. 处理有效的 GET 请求
请求模拟
客户端发送请求:
GET /api/data HTTP/1.1
Host: example.com
服务器处理
当 HttpConnection::HandleReq
被调用时,逻辑如下:
-
版本设置:
_response.version(_request.version());
假设请求版本是
HTTP/1.1
,响应的版本也将被设置为HTTP/1.1
。 -
设置为短连接:
_response.keep_alive(false);
这里设定响应不保持连接,服务器在完成请求后将会关闭连接。
-
检查请求方法:
if (_request.method() == http::verb::get) {
该请求的 HTTP 方法是 GET,因此进入到处理逻辑。
-
处理业务逻辑:
bool success = LogicSystem::GetInstance()->HandleGet(_request.target(), shared_from_this());
HandleGet
方法被调用来处理 GET 请求,目标 URL 为/api/data
。假设业务逻辑正确处理了这个请求,success
将为true
。 -
设置响应:
_response.result(http::status::ok); _response.set(http::field::server, "GateServer");
由于请求成功,响应状态被设置为 200(OK)。同时,服务器头信息被设置为
GateServer
。 -
发送响应:
WriteResponse();
最后,调用
WriteResponse()
方法将响应返回给客户端,对应的 HTTP 响应可能会是这样的:HTTP/1.1 200 OK Server: GateServer Content-Type: application/json { "data": "This is the requested data." }
2. 处理无效的 GET 请求
请求模拟
客户端发送请求:
GET /api/invalid HTTP/1.1
Host: example.com
服务器处理
当 HttpConnection::HandleReq
被调用时,逻辑如下:
-
版本和连接设置:
和前面的请求相同,首先设置版本和短连接。 -
检查请求方法:
if (_request.method() == http::verb::get) {
因为请求 HTTP 方法是 GET,所以流程继续。
-
处理业务逻辑:
bool success = LogicSystem::GetInstance()->HandleGet(_request.target(), shared_from_this());
HandleGet
被调用,目标 URL 为/api/invalid
。假设在业务逻辑中未能找到该资源,success
将为false
。 -
设置响应:
if (!success) { _response.result(http::status::not_found); _response.set(http::field::content_type, "text/plain"); beast::ostream(_response.body()) << "url not found\r\n"; WriteResponse(); return; }
因为请求的地址无效,设置响应状态为 404(未找到),并在响应体中写入信息
"url not found"
。 -
发送响应:
调用WriteResponse()
返回给客户端,对应的 HTTP 响应可能会是这样的:HTTP/1.1 404 Not Found Content-Type: text/plain url not found