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_rest, cowboy_websocket 和 cowboy_loop。除此之外,您还可以定义自己的处理程序类型。
切换很简单。您只需返回想要使用的处理程序类型的名称,而不是返回ok。下面的代码片段切换到Websocket处理程序:
init(Req, State) ->
{cowboy_websocket, Req, State}.
清理
所有的处理器类型都提供了可选的terminate/3回调函数
terminate(_Reason, _Req, _State) ->
ok.
这个回调被严格保留给任何需要的清理。您不能从这个函数发送响应。没有其他返回值。
这个回调是可选的,因为它很少是必需的。清理应该在单独的进程中直接完成(通过监视处理程序进程来检测它何时退出)。
Cowboy不会为不同的请求重用进程。此调用返回后,进程将很快终止。