[翻译][erlang]cowboy handler模块的使用

关于Cowboy

Cowboy是基于Erlang实现的一个轻量级、快速、模块化的http web服务器。web


Handlers,用于处理HTTP请求的程序处理模块。服务器

Plain HTTP Handlers(常规Handlers)

Cowboy里面的handler最基础的事情就是实现 init/2 回调函数,处理请求,发送客户端响应(可选),最后返回。 Cowboy根据 router configuration (路由配置)接收请求并初始化State。 下面是一个不作任何处理的handler:websocket

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

Cowboy为了保证每个相应都能有客户端响应,尽管上面例子没有发送客户端返回,客户端仍然会收到一个 204 No Content 的响应。socket

下面是一个有返回响应的例子:ide

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

当调用了 cowboy:req/4, Cowboy会立刻返回一个客户端响应。模块化

最后咱们返回一个三元组。ok 表示handler容许成功,而后返回处理事后的 Req 给Cowboy。 三元组的最后一个元素是一个贯穿在handler全部回调一个state。常规的HTTP handlers通常只附加一个回调函数,terminate/2是一个不多使用的可选的回调函数。函数

Other Handlers(其它Handlers)

init/2 回调函数也能够用来告诉cowboy,这是一个不一样类型的handler,Cowboy应该作一些其余处理。为了方便使用,若是返回handler类型的模块名称,就能够切换handler处理模块。oop

Cowboy提供了三种可选handler类型:cowboy_reset, Cowboy_websocke和cowboy_loop。另外也能够本身定义handler类型。ui

切换很是简单,用handler类型替换掉返回的 ok 就能够了。下面是一个切换为 Websocket handler 的代码片断。spa

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

也能够切换到一个自定义的handler模块:

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

如何使用自定义的handler类型能够查看Sub protocols 章节(https://ninenines.eu/docs/en/cowboy/2.0/guide/sub_protocols)。

Cleaning up

除了Websocket handlers,其它全部类型都提供可选回调函数terminate/3

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

这个回调函数是为了cleanup保留下来的。该函数不能发送响应给客户端。也没有其余返回值(只能返回ok)。

terminate/3之因此是可选是由于其极少会用到。Cleanup应该在各自的进程中直接处理。(经过监控handler进程来知道其什么时候退出)

Cowboy不会在不一样的请求重复使用进程(应该是http短连接设计引发的)。进程在返回以后很快就会被销毁。

Others

英文官方原文:

https://ninenines.eu/docs/en/cowboy/2.0/guide/handlers/#_plain_http_handlers

相关文章
相关标签/搜索