Cowboy是基於Erlang實現的一個輕量級、快速、模塊化的http web服務器。web
Handlers,用於處理HTTP請求的程序處理模塊。服務器
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
是一個不多使用的可選的回調函數。函數
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)。
除了Websocket handlers,其它全部類型都提供可選回調函數terminate/3
:
terminate(_Reason, _Req, _State) ->
ok.
這個回調函數是爲了cleanup保留下來的。該函數不能發送響應給客戶端。也沒有其餘返回值(只能返回ok
)。
terminate/3
之因此是可選是由於其極少會用到。Cleanup應該在各自的進程中直接處理。(經過監控handler進程來知道其什麼時候退出)
Cowboy不會在不一樣的請求重複使用進程(應該是http短連接設計引發的)。進程在返回以後很快就會被銷燬。
英文官方原文:
https://ninenines.eu/docs/en/cowboy/2.0/guide/handlers/#_plain_http_handlers