[翻譯][erlang]cowboy handler模塊的使用


關於Cowboy

Cowboy是基於Erlang實現的一個輕量級、快速、模塊化的http web服務器。


Handlers,用於處理HTTP請求的程序處理模塊。

Plain HTTP Handlers(常規Handlers)

Cowboy里面的handler最基礎的事情就是實現 init/2 回調函數,處理請求,發送客戶端響應(可選),最后返回。 Cowboy根據 router configuration (路由配置)接收請求並初始化State。 下面是一個不做任何處理的handler:

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

Cowboy為了保證每一個相應都能有客戶端響應,盡管上面例子沒有發送客戶端返回,客戶端仍然會收到一個 204 No Content 的響應。

下面是一個有返回響應的例子:

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處理模塊。

Cowboy提供了三種可選handler類型:cowboy_reset, Cowboy_websocke和cowboy_loop。另外也可以自己定義handler類型。

切換非常簡單,用handler類型替換掉返回的 ok 就可以了。下面是一個切換為 Websocket handler 的代碼片段。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM