天天看點

[翻譯][erlang]cowboy handler子產品的使用

Cowboy是基于Erlang實作的一個輕量級、快速、子產品化的http web伺服器。

Handlers,用于處理HTTP請求的程式處理子產品。

Cowboy裡面的handler最基礎的事情就是實作 <code>init/2</code> 回調函數,處理請求,發送用戶端響應(可選),最後傳回。 Cowboy根據 <code>router configuration</code> (路由配置)接收請求并初始化State。 下面是一個不做任何處理的handler:

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

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

當調用了 <code>cowboy:req/4</code>, Cowboy會馬上傳回一個用戶端響應。

最後我們傳回一個三元組。<code>ok</code> 表示handler允許成功,然後傳回處理過後的 <code>Req</code> 給Cowboy。 三元組的最後一個元素是一個貫穿在handler所有回調一個state。正常的HTTP handlers一般隻附加一個回調函數,<code>terminate/2</code>是一個很少使用的可選的回調函數。

<code>init/2</code> 回調函數也可以用來告訴cowboy,這是一個不同類型的handler,Cowboy應該做一些其他處理。為了友善使用,如果傳回handler類型的子產品名稱,就可以切換handler處理子產品。

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

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

也可以切換到一個自定義的handler子產品:

如何使用自定義的handler類型可以檢視<code>Sub protocols</code> 章節(https://ninenines.eu/docs/en/cowboy/2.0/guide/sub_protocols)。

除了Websocket handlers,其它所有類型都提供可選回調函數<code>terminate/3</code>:

這個回調函數是為了cleanup保留下來的。該函數不能發送響應給用戶端。也沒有其他傳回值(隻能傳回<code>ok</code>)。

<code>terminate/3</code>之是以是可選是因為其極少會用到。Cleanup應該在各自的程序中直接處理。(通過監控handler程序來知道其何時退出)

Cowboy不會在不同的請求重複使用程序(應該是http短連結設計引起的)。程序在傳回之後很快就會被銷毀。

英文官方原文:

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

本文轉自 Ron Ngai 部落格園部落格,原文連結: http://www.cnblogs.com/rond/p/6095149.html ,如需轉載請自行聯系原作者