Erlang cowboy routing 路由
Erlang cowboy routing 路由
本文译自:
http://ninenines.eu/docs/en/cowboy/1.0/guide/routing/
Routing
默认情况下,Cowboy 什么都不做。
所谓路由(routing),就是把URL请求映射到Erlang处理模块。一旦Cowboy收到一个请求,它会按指定的规则匹配请求的host和path,如果匹配成功,关联的模块代码就被执行。路由规则按每个host指定,Cowboy首先匹配host,然后匹配path,...
路由表在使用前需要先编译。
Structure
路由表的结构如下:
Routes = [Host1, Host2, ... HostN].
表中的每一项是一个host,host包含路径列表(pathlist),host的结构如下:
Host1 = {HostMatch, PathsList}. Host2 = {HostMatch, Constraints, PathsList}.
类似的,pathlist的结构如下:
PathsList = [Path1, Path2, ... PathN].
每个path包含可选的匹配条件,处理器,和选项,定义如下:
Path1 = {PathMatch, Handler, Opts}. Path2 = {PathMatch, Constraints, Handler, Opts}.
下面看看可选的匹配条件的语法match syntax。
Match syntax
匹配语法用于关联路径到各自的处理模块handler。
匹配语法同样适用于host和path,差别不大。实际上,段的分隔符不同,host从最后一个段向第一个段匹配。下面在遇到的时候会详细说明host和path的匹配不同之处。
除了本节最后我会说明的一些特殊情况,最简单的匹配值就是host和path,通过string()
或 binary()指定。
PathMatch1 = "/". PathMatch2 = "/path/to/resource". HostMatch1 = "cowboy.example.org".
可见,所有的路径都是以斜杠"/"开头。下面2种写法是等效的:
PathMatch2 = "/path/to/resource". PathMatch3 = "/path/to/resource/".
Host结尾和开头有没有一个点"."都可以,下面3个都是等价的:
HostMatch1 = "cowboy.example.org". HostMatch2 = "cowboy.example.org.". HostMatch3 = ".cowboy.example.org".
从host和path中提取的段值会保存在Req对象里以待后用。我们称其为绑定(从URL提取段值存储于指定变量的过程)。
绑定的语法很简单。以冒号":"开头的名称都是绑定变量名,值就是段:
PathMatch = "/hats/:name/prices". HostMatch = ":subdomain.example.org".
对于上面的例子,URL http://test.example.org/hats/wild_cowboy_legendary/prices
绑定之后得到的变量是:
subdomain
=test
name=wild_cowboy_legendary
变量subdomain和name随后用
cowboy_req:binding/{2,3}
函数取得,绑定的变量名必须是atom类型。
一种特殊的绑定变量名是冒号加下划线":_"。匹配的段值会忽略。这种方式在匹配多域名时很有用。
HostMatch = "ninenines.:_".
还可以匹配可选的段。方括号内的都是可选的匹配。
PathMatch = "/hats/[page/:number]". HostMatch = "[www.]ninenines.eu".
还可以嵌套:
PathMatch = "/hats/[page/[:number]]".
还可以用[...]匹配host和path其余的部分。在host中匹配前面的部分,在path中匹配后面的部分。匹配的结果可以有0,1或多个段。用cowboy_req:host_info/1
和cowboy_req:path_info/1
分布取得这些段值,以列表形式返回。
PathMatch = "/hats/[...]". HostMatch = "[...]ninenines.eu".
如果同一个绑定变量名出现2次,只有当它们的值一致时,匹配才算成功。这源自于Erlang模式匹配的方式。
PathMatch = "/hats/:name/:name".
当相同变量出现在可选段的匹配中,只有当可选的段存在,并且2个值一致时:
This is also true when an optional segment is present. In this case the two values must be identical only if the segment is available.
PathMatch = "/hats/:name/[:name]".
如果一个绑定变量在host和path中都存在,那么他们的值必须一致才算成功:
PathMatch = "/:user/[...]". HostMatch = ":user.github.com".
最后是2个特殊匹配。原子'_'用于匹配任何host和path。
PathMatch = '_'. HostMatch = '_'.
host的匹配"*"匹配通配符path,通常与OPTIONS方法一起使用。
HostMatch = "*".
Constraints
当匹配结束,绑定的结果就要经过一组条件测试。条件测试仅当绑定被定义。运行的次序就是你定义他们的次序。匹配最终成功仅当满足所有条件。
条件是2个或3个元素的元组形式,第一个元素是绑定的变量名称,第二个元素是条件名称,第三个元素是可选的参数,存放条件的参数。下面条件的定义:
- {Name, int}
- {Name, function, fun ((Value) -> true | {true, NewValue} | false)}
int 条件会检查绑定变量Name存放的值是一个整数字串(Name="123"),如果是,转换值到整数(Name=123)。
function条件传递绑定的值到一个用户定义的函数,
它会取得这个绑定的变量的值作为它的唯一参数,并且必须返回是否满足条件。也可以在函数中修改这个值,因此这个值可以返回任何类型。
注意,条件函数应该是简单不能出错:Note that constraint functions SHOULD be pure and MUST NOT crash.
Compilation
本章定义的结构在传递给Cowboy使用前需要编译。这样会提高速度。编译使用:
cowboy_router:compile/1
.
Dispatch = cowboy_router:compile([ %% {HostMatch, list({PathMatch, Handler, Opts})} {'_', [{'_', my_handler, []}]} ]), %% Name, NbAcceptors, TransOpts, ProtoOpts cowboy:start_http(my_http_listener, 100, [{port, 8080}], [{env, [{dispatch, Dispatch}]}] ).
如果给定的结构不正确,函数会返回{error, badarg}
。
动态替换
使用 cowboy:set_env/3
函数更新路由策略。所有新的连接在新策略上打开:
cowboy:set_env(my_http_listener, dispatch, cowboy_router:compile(Dispatch)).
注意到,我们在调用set_env更新路由之前先编译了路由:cowboy_router:compile(Dispatch)。
Erlang cowboy routing 路由的更多相关文章
- Erlang cowboy 处理简单的HTTP请求
Erlang cowboy 处理简单的HTTP请求 原文出自: Handling plain HTTP requests 处理请求的最简单的方式是写一个简单的HTTP处理器.它的模型参照Erlang/ ...
- Erlang cowboy http request生命周期
Erlang cowboy http request生命周期 翻译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/http_req_life/ requ ...
- Erlang cowboy 入门参考
Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/gettin ...
- .NET/ASP.NET Routing路由(深入解析路由系统架构原理)
阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...
- .NET/ASP.NET Routing路由(深入解析路由系统架构原理)http://wangqingpei557.blog.51cto.com/1009349/1312422
阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...
- NET/ASP.NET Routing路由(深入解析路由系统架构原理)(转载)
NET/ASP.NET Routing路由(深入解析路由系统架构原理) 阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模 ...
- Microsoft.AspNetCore.Routing路由
Microsoft.AspNetCore.Routing路由 这篇随笔讲讲路由功能,主要内容在项目Microsoft.AspNetCore.Routing中,可以在GitHub上找到,Routing项 ...
- Erlang cowboy 处理不规范的client
Erlang cowboy 处理不规范的client Cowboy 1.0 參考 本章: Dealing with broken clients 存在很多HTTP协议的实现版本号. 很多广泛使用的cl ...
- Routing路由
Routing路由 新版Routing功能介绍 在ASP.NET 5和MVC6中,Routing功能被全部重写了,虽然用法有些类似,但和之前的Routing原理完全不太一样了,该Routing框架不仅 ...
随机推荐
- EBS开发之环境迁移
(一)环境迁移说明 1.1 迁移 由于EBS系统开发复杂,一般项目实施都是使用三套或者三套以上的系统,一套作为开发使用系统,一套作为集成测试系统,一套就是企业用的正式环境系统,在项目实施过程中对一 ...
- AsnycTask的内部的实现机制
AsnycTask的内部的实现机制 写在前面 我们为什么要用AsnycTask. 在Android程序开始运行的时候会单独启动一个进程,默认情况下所有 这个程序操作都在这个进程中进行.一个Androi ...
- Java HashMap并发死循环
在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环.这个事情我4. ...
- Struts 1之DispatchAction
DispatchAction是struts 1 的内置通用分发器 import org.apache.struts.actions.DispatchAction; public class UserA ...
- Android必知必会-获取View坐标和长宽的时机
如果移动端访问不佳,请访问–>Github版 背景 最近要实现一个功能,用到了一些属性动画,需要获取一些View的坐标信息,设计图如下: 这里我使用的是DialogFragment来实现的,可以 ...
- 关于查找iOS中App路径时所要注意的一个问题
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...
- FFmpeg源代码简单分析:avcodec_close()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- 剑指Offer——二分查找算法
剑指Offer--二分查找算法 前言 本片博文主要讲解查找算法的相关知识.重点介绍二分查找. 二分查找算法是在有序数组中用到的较为频繁的一种查找算法,在未接触二分查找算法时,最通用的一种做法是,对数组 ...
- SSH深度历险(二) Jboss+EJB的第一个实例
学习感悟:每次学习新的知识,都会通过第一个小的实例入手,获得成就感,经典的Hello Workd实例奠定了我们成功的大门哈,这些经典的实例虽小但是五脏俱全呢,很好的理解了,Ejb的核心. 今天主要以这 ...
- UNIX网络编程——经常使用的套接字选项
1.设置/获取套接字选项 int setsockopt(int socket, int level, int option_name, const void *option_value, sockle ...