Skip to content

Creating HTTP Service

zyxwvu Shi edited this page Jul 7, 2019 · 3 revisions

理解 HTTP Service

HTTP Service 是 xyhttpd 中对业务逻辑的抽象,所有 HTTP Service 的基类都是抽象接口类 http_service,其定义如下:

class http_service {
public:
    virtual void serve(shared_ptr<http_transaction> tx) = 0;
};

通过继承 http_service 并实现 serve 方法,便可实现自定义 HTTP Service。HTTP Service 的生命周期与请求无关,因此 HTTP Service 是可以有状态的,在子类中定义变量,即可保存一些状态信息或者缓存一些资源。

serve 方法

每当有新的 HTTP 请求到达 xyhttpd 时,serve 方法会被调用,其参数 tx 则是本次请求所对应的 HTTP 事务对象。每个 HTTP 请求对应一个 HTTP 事务,事务对象保存了请求的信息(tx->request)、底层 HTTP 连接对象(tx->connection)、客户端提交的数据(tx->postdata),以及创建响应对象用的方法(tx->make_response)、向客户端发送数据的方法(tx->write),和几个常用的 HTTP 响应方法(serve_file、forward_to、redirect_to、display_error)。

每个 HTTP Service 对于到达的请求,都可以选择拦截并处理以及忽略两种操作。如果请求没有被任何 HTTP Service 处理,xyhttpd 框架内部将会产生一个 404 响应。这一特性可结合 http_service_chain 使用,以便组合多个 HTTP Service,实现更加复杂的请求处理逻辑。一个 http_service_chain 也是一个 http_service,其 serve 方法不直接处理请求。但是,一个 http_service_chain 对象可以持有一系列其它 HTTP Service 的引用,http_service_chain 会逐个尝试调用这些 HTTP Service,直到请求被某个 HTTP Service 处理。

比如包含一个 local_file_service 和一个 proxy_pass_service 的 http_chain_service。首先,请求会交由 local_file_service 处理,local_file_service 会尝试在网站主目录下寻找请求的静态文件,如果找到,则处理请求,发送静态文件;如果未找到,则直接返回。如果请求的静态文件不存在,http_service_chain 会继续调用后面的 proxy_pass_service,反向代理发送到后端业务服务器。这种组合可以用来为后端的其他服务分担压力,提高系统吞吐量。

Clone this wiki locally