Erlang cowboy 处理简单的HTTP请求
Erlang cowboy 处理简单的HTTP请求
原文出自:
处理请求的最简单的方式是写一个简单的HTTP处理器。它的模型参照Erlang/OTP的gen_server,但是做了简化,Cowboy按次序调用了3个回调函数。
Initialization
第一个回调,init/3,所有处理器都有这个函数,用于区分处理器类型,简单的HTTP处理器仅仅返回ok。
init(_Type, Req, _Opts) ->
{ok, Req, no_state}.
这个函数接收用于处理请求的传输和协议模块的名字。可以快速处理请求。例如当采用TCP而不是SSL访问的时,下面的处理器会崩溃:
init({ssl, _}, Req, _Opts) ->
{ok, Req, no_state}.
这个函数还可以接收与前面路由部分设置有关联的选项。如果你的处理器没有使用选项,推荐使用匹配[],这样可以快速诊断设置错误:
init(_Type, Req, []) ->
{ok, Req, no_state}.
如果用户没有设置,你不用验证选项。如果用户设置了选项,并且存在设置错误,你可以令它崩溃。例如,要求的lang选项不存在的话,下面的代码会崩溃:
init(_Type, Req, Opts) ->
{_, _Lang} = lists:keyfind(lang, 1, Opts),
{ok, Req, no_state}.
如果用户不想给出出错的原因,你可以返回一个有意义的错误给用户。既然这时返回给用户了,就不用继续处理器的代码了,因此使用shutdown返回值尽早结束调用:
init(_Type, Req, Opts) ->
case lists:keyfind(lang, 1, Opts) of
false ->
{ok, Req2} = cowboy_req:reply(500, [
{<<"content-type">>, <<"text/plain">>}
], "Missing option 'lang'.", Req),
{shutdown, Req2, no_state};
_ ->
{ok, Req, no_state}
end.
一旦选项验证通过,我们就可以安全地使用它们。就可以传递给其余的处理器。这也是返回值元组的第3个元素state所要表达的。
我们建议在此创造一个state record。这个record会让处理器的代码更清晰,也可以更好地利用Dialyzer进行类型检查。
-record(state, {
lang :: en | fr
%% More fields here.
}).
init(_Type, Req, Opts) ->
{_, Lang} = lists:keyfind(lang, 1, Opts),
{ok, Req, #state{lang=Lang}}.
Handling the request
第2个回调函数, handle/2,是特定于简单HTTP处理器的。你将要在此处理请求的。一个什么都不做的占位的处理器如下:
handle(Req, State) ->
{ok, Req, State}.
上面函数没有返回值。为取得请求的信息或发送响应,应该在这里使用Req对象。Req 对象自成一章。下面的处理器发送一个相当原始的响应:
handle(Req, State) ->
{ok, Req2} = cowboy_req:reply(200, [
{<<"content-type">>, <<"text/plain">>}
], <<"Hello World!">>, Req),
{ok, Req2, State}.
Cleaning up
第3个回调函数也是最后一个, terminate/3, 一般什么留空:
terminate(_Reason, Req, State) ->
ok.
这个回调严格用于必要的清理。不能在这个函数里发送响应。没有其他的返回值。
如果你使用进程字典,计时器,监控器或者正在接收消息,你可以使用这个函数进行清理,由于Cowboy可能为下一个活动的请求重用这个进程。
在你的处理器中,发生这些的机会是很渺茫的。通常在Erlang代码里不鼓励使用进程字典。如果想要使用计时器,监控器或接收消息,不如使用loop处理器——一种不同类型的处理器专门满足这种需要。
这个函数一直可用,所以你应该使用它。它一直被调用。
Erlang cowboy 处理简单的HTTP请求的更多相关文章
- Erlang cowboy 架构
Erlang cowboy Architecture架构 Erlang cowboy参考: http://ninenines.eu/docs/en/cowboy/1.0/guide/ 本章Archit ...
- Erlang cowboy routing 路由
Erlang cowboy routing 路由 本文译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/routing/ Routing 默认情况下,C ...
- Erlang cowboy 入门参考之现代Web的发展历史
Erlang cowboy 入门参考之现代Web发展史 原文: http://ninenines.eu/docs/en/cowboy/1.0/guide/modern_web/ 让我回顾一下web技术 ...
- Erlang cowboy websocket 服务器
Erlang cowboy websocket 服务器 原文见于: http://marcelog.github.io/articles/erlang_websocket_server_cowboy_ ...
- Erlang cowboy 入门参考
Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/gettin ...
- Erlang cowboy 处理不规范的client
Erlang cowboy 处理不规范的client Cowboy 1.0 參考 本章: Dealing with broken clients 存在很多HTTP协议的实现版本号. 很多广泛使用的cl ...
- Erlang cowboy 处理不规范的客户端
Erlang cowboy 处理不规范的客户端 Cowboy 1.0 参考 本章: Dealing with broken clients 存在许多HTTP协议的实现版本.许多广泛使用的客户端,如浏览 ...
- Erlang cowboy http request生命周期
Erlang cowboy http request生命周期 翻译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/http_req_life/ requ ...
- Xamarin.Android之封装个简单的网络请求类
一.前言 回忆到上篇 <Xamarin.Android再体验之简单的登录Demo> 做登录时,用的是GET的请求,还用的是同步, 于是现在将其简单的改写,做了个简单的封装,包含基于Http ...
随机推荐
- not in 前面/后面存在null值时的处理
表声明 order_header表中有ship_method列: ship_method_map表中ship_method为主键列. 需求 找出order_header表中所有ship_method不 ...
- 什么时候App委托会收到App进程被结束的消息
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们在Xcode建立的新项目后,在AppDelegate类会发 ...
- The Ultimate Guide To iPhone Resolutions
备忘:http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutionshttp://appicontemplate.com/
- iterm2 快捷键
最近开始使用mac,用iterm2的终端,有些快捷键纪录下. 标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 或者 command + 左 ...
- SpringMVC源码分析--容器初始化(五)DispatcherServlet
上一篇博客SpringMVC源码分析--容器初始化(四)FrameworkServlet我们已经了解到了SpringMVC容器的初始化,SpringMVC对容器初始化后会进行一系列的其他属性的初始化操 ...
- iOS中 最新微信支付/最全的微信支付教程详解 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博! 亲们, 首先让我们来看一下微信支付的流程吧. 1. 注册微信开放平台,创建应用获取appid,appSecret, ...
- MTK机器原始OTA更新方法
在源码中编译完成后会生成各类.img的文件,这时候make otapackage生成ota包 一般ota包在源码工程的out/target/...目录下 一.通过线刷模式 将生成OTA包拷贝到Wind ...
- 用SpriteBuilder简化"耕牛遍地走"的动画效果(一)
这又是一个使用SpriteBuilder带来便捷的例子 原文地址在: http://www.raywenderlich.com/32045/how-to-use-animations-and-spri ...
- CUDA学习,使用shared memory实现Reverse Array
- 动态创建VIEW
很多人都应该知道 global temporary table 的用法,这里也提出一个动态VIEW的用法,在实际过程中有着很好的独特之处 具体如下: /***************创建PACKAGE ...