当前位置: 首页 > 工具软件 > Cowboy > 使用案例 >

Cowboy 用户指南 (九) - Handlers

仲涵亮
2023-12-01

Handlers(处理程序)

处理程序是处理HTTP请求的Erlang模块。

普通的HTTP处理程序

Cowboy中最基本的处理程序实现了强制的init/2回调,操作请求,可选地发送响应,然后返回。

这个回调接收到Req对象和路由器配置中定义的初始状态。

一个不做任何事情的处理程序是这样的:

init(Req, State) ->
    {ok, Req, State}.

尽管没有发送应答,一个204 No Content响应将发送到客户端,因为Cowboy确保为每个请求发送响应。

我们需要使用Req对象来进行应答。

init(Req0, State) ->
    Req = cowboy_req:reply(200, #{
        <<"content-type">> => <<"text/plain">>
    }, <<"Hello World!">>, Req0),
    {ok, Req, State}.

当调用Cowboy:reply/4时,Cowboy将立即发送一个响应。

然后返回一个3元组。ok表示处理程序成功运行。我们也把修改后的请求Req返还给Cowboy。

元组的最后一个值是将在该处理程序的每个后续回调中使用的状态。普通HTTP处理程序只有一个额外的回调函数,它是可选的并且很少使用的terminate/3。

其他处理程序

init/2回调也可以用来通知Cowboy,这是一种不同的处理程序,并且Cowboy应该切换到它。为此,您只需返回您想要切换到的处理程序类型的模块名。

Cowboy有三种处理程序类型,你可以切换:cowboy_restcowboy_websocket 和 cowboy_loop。除此之外,您还可以定义自己的处理程序类型。

切换很简单。您只需返回想要使用的处理程序类型的名称,而不是返回ok。下面的代码片段切换到Websocket处理程序:

init(Req, State) ->
    {cowboy_websocket, Req, State}.

清理

所有的处理器类型都提供了可选的terminate/3回调函数

terminate(_Reason, _Req, _State) ->
    ok.

这个回调被严格保留给任何需要的清理。您不能从这个函数发送响应。没有其他返回值。

这个回调是可选的,因为它很少是必需的。清理应该在单独的进程中直接完成(通过监视处理程序进程来检测它何时退出)。

Cowboy不会为不同的请求重用进程。此调用返回后,进程将很快终止。

 类似资料: