- 浏览: 581348 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
JamAndVariousAbalone:
存储方式的不同吧。gb_tree是平衡树,list是线性结构。 ...
gb_trees和lists的访问效率相差很大 -
genesislive:
eporf:analyse()写错了,应该改成eprof:an ...
Erlang程序的性能测试工具(1) -
vampirezh:
高手啊 求带 ! 请列出带徒标准
Erlang的未来(2008) -
aiquantong:
great!
rebar工具使用备忘录 (1) -
wccxiaoan:
basho的资源 都没办法打开,不过还是有帮助,谢谢。
关于webmachine
haogongju、人人IT网、59n南龙、360doc不要抄我的烂博客了,私人备忘用。
基于mochiweb,REST风格的erlang Web容器。流程图见docs目录下的http-headers-status-v3.png。
它适合构建符合REST风格的面向资源的web应用,不适合那种需要HTTP长连接的应用(例如websocket,这也和webmachine基于的web服务器mochiweb支持websocket较弱有关,如果websocket很重要,有mislin和cowboy这两个web服务器可用,这些web服务器的比较见这里,扯远了)。
不过,它也提供了流(stream)的数据传输,这类数据作为HTTP消息体(HTTP Body)进行传输,包括请求数据和响应数据(HTTP的请求body和响应body),对于比较大的数据可以裁成一节一节的数据流进行传输。见Webmachine Streamed Body
hello, webmachine
webmachine提供了new_webmachine.sh脚本用于生成我们的webmachine应用骨架(一个标准的erlang OTP应用程序骨架、负责依赖管理和编译的rebar及其rebar配置,,make脚本,以及一个启动脚本),目录结构如下:
.
├── deps/
│ ├── mochiweb
│ └── webmachine
├── ebin/
├── Makefile
├── priv/
│ ├── dispatch.conf
│ ├── log/
│ └── www/
├── README
├── rebar
├── rebar.config
├── src/
│ ├── mywebdemo.app.src
│ ├── mywebdemo_app.erl
│ ├── mywebdemo_sup.erl
│ ├── mywebdemo_resource.erl
│ └── mywebdemo.erl
└── start.sh
基于webmachine的web应用,用颜色标出开发相关部分,蓝色是这个web应用的erlang源代码,绿色为可执行脚本,红色为web应用的配置文件。深蓝色的是我们应用的web资源实现,理想情况下,不用修改其它erl模块,我们通过定义各种资源,并在dispatch.conf文件中设置好这些资源的映射实现我们的web应用。
所有的web请求日志都放在priv/log目录下,这些都是标准的http日志格式。
所有的静态文件都放在priv/www目录下,例如可以把我的web应用的favicon.ico放到这个目录下(这个简单的hello world应用现在还不能处理静态文件访问)
make之后用start.sh启动这个web应用,然后打开http://localhost:8000就可以看到hello world了
实际上这个骨架也可以用rebar生成,进入webmachine的目录后用rebar list-templates可以看到有一个wmskel的模版(就是WebMachine Skeleton的意思),在priv/templates目录下可以看到整个模版的内容,我们的web应用就是由此生成的。
基于webmachine的web应用
webmachine应用的结构如图所示:
当webmachine应用启动后其supervisor管理的进程树上挂着一个webmachine_router的genserver,这是负责对外(比如我们要开发的web应用)联络的接口。
我们要开发的web应用是通过一个典型的Erlang OTP应用实现:
一个OTP application及其app配置,
一个OTP supervisor,启动webmachine的工作在这个模块的init函数中进行:
启动后的web应用结构如果所示:
webmachine_mochiweb实际上是mochiweb_socket_server的注册名。
此外还包括一个控制模块mywebdemo,它有两个任务:
负责启动web应用依赖的其它应用(inets,crypto,mochiweb,webmachine);
最后启动这个application: mywebdemo。
此外这个模块还提供了stop功能
个人觉得mywebdemo这个模块有点像于C中main函数,在启动脚本start.sh中就直接使用这个模块启动我们的web应用。
不过我们这个由脚本自动生成的web应用骨架其实可以不必太过关注(不过HTTP服务的端口8000是写死在mywebdemo_sup模块中的)。
简单的理解是它负责将webmachine的HTTP处理逻辑嵌到mochiweb服务器中了。此后的HTTP请求都被webmachine接管过来,按照webmachine的逻辑(REST风格)进行处理,也就是docs目录下的那张大图(http-headers-status-v3.png)。
要关心的是如何处理资源。
实现REST风格的Web资源访问
自动生成的web应用骨架是不必修改的,需要做的是“添加”业务逻辑。
我们的web应用对外提供某种资源,对这些资源的处理也就是web应用的业务逻辑。每类资源的处理可以由一个erlang模块实现。
资源的映射、路由、或者dispatch
哪个请求对应哪个资源这种映射关系(也就是路由,或者说是dispatch)是在dispatch.conf文件中配置的。(当然也可以调用webmachine_router:add_route/1函数动态添加)
例如,自动生成的mywebdemo_resource模块是一个最简单的hello world文本资源。缺省的dispatch.conf是这个样子:
{[], mywebdemo_resource, []}.
这个tuple中的第一个元素是个list,对应着url中的路径,list中的元素是url路径中的token(也就是/隔开的字符串)。例如对于url:
http://localhost:8000/ab/c/c/dddd/e/f
对应的path tokens就是:
["ab", "c", "c", "dddd", "e", "f"]
对url的dispatch匹配规则:
list中的元素有三种类型:字符串,一个特殊的atom,'*'和其它普通atom
1. 字符串完全匹配
{["ab"], mywebdemo_resource, []}.
只有http://localhost:8000/ab/才能匹配mywebdemo_resource资源,
另外webmachine是区分大小写的,所以http://localhost:8000/Ab不会匹配这个资源。
2. 通配符匹配
如果
{["ab", '*'], mywebdemo_resource, []}.
现在这些url
http://localhost:8000/ab/c
http://localhost:8000/ab/cd
http://localhost:8000/ab/c/d
http://localhost:8000/ab/c/d/e
...
都能匹配资源了,注意'*'匹配了所有的末尾的path token(红色部分)。
对于这个dispatch
{["ab", "c", "d", '*'], mywebdemo_resource, []}.
只有这类url匹配了
http://localhost:8000/ab/c/d/e
当然'*'也可以在中间,例如这个dispatch:
{["ab", '*', "d", '*'], mywebdemo_resource, []}.
路径第一个token是ab,第3个是d的url都匹配这个资源。
'*'在中间与在末尾有一个很微妙的区别。如前所述,在末尾的'*'匹配一系列的path tokens,在中间的'*'只匹配一个path token。例如
{["ab", '*', "cd", '*'], mydemo_resource, []}.
对于这个url
http://localhost:8000/ab/c/pi/cd/ee/ff
中间的'*'是没法匹配"c" 和"pi"这两个path tokens的,当然最后的'*'没有这个限制。
3. 带名字绑定的统配
普通atom用在程序中,用于与路径token字符串建立映射。简单的讲这是个更高级的'*',它提供了路径的名字绑定:'*'是一种万能匹配,但是有时候我们想知道匹配的那部分path token怎么办,这时候名字绑定就可以用上了。举个例子,下面的atom是foo,对应的是ab之后紧跟的路径token,
{["ab", foo, "d", '*'], mywebdemo_resource, []}.
在程序中通过
V = wrq:path_info(foo, ReqData)
就可以得到url中foo对应的路径token,例如url是
http://localhost:8000/ab/werqwerqw/d/
那么V就是"werqwerqw"
资源的实现
mywebdemo_resource是资源的缺省实现模块,内容如下
更多见这里,比较枯燥。
对资源的访问
对资源的访问流程详见 http://wiki.basho.com/images/http-headers-status-v3.png
REST方式通过HTTP方法控制对资源的访问方式:创建(PUT),获取(GET)、修改(PUT/POST)还是删除(DELETE)资源。资源如果要支持以上方式就要自己提供相应的逻辑实现。
在REST之前,比较常见、也是比较直接的做法是,用户请求来之后,通过分析请求头的方法(即HTTP Method),调用对应的函数,(一个典型的例子如JEE的servlet,有对应的doGet,doPost等方法)。
但是webmachine不完全是通过HTTP Method分派处理的,它是通过content_types_provided和conttent_types_accepted提供对内容的处理方式。
前者指定对应的资源内容生成方式。也就是说根据HTTP客户请求的Accept消息头(HTTP Request Header)判断提供什么样的资源给用户。这种方式被称为Content negotiation
对应着资源的访问控制HTTP方法(GET)
后者通过HTTP客户请求的Content-Type消息头判断用户提供的数据是什么MIME类型的。
常用的对资源的访问控制HTTP方法(PUT/POST 等)都被分派到这个函数的处理上了。
DELETE方法倒是有对应的delete_resource
参考
http://wiki.basho.com/Webmachine-Quickstart.html
基于mochiweb,REST风格的erlang Web容器。流程图见docs目录下的http-headers-status-v3.png。
它适合构建符合REST风格的面向资源的web应用,不适合那种需要HTTP长连接的应用(例如websocket,这也和webmachine基于的web服务器mochiweb支持websocket较弱有关,如果websocket很重要,有mislin和cowboy这两个web服务器可用,这些web服务器的比较见这里,扯远了)。
不过,它也提供了流(stream)的数据传输,这类数据作为HTTP消息体(HTTP Body)进行传输,包括请求数据和响应数据(HTTP的请求body和响应body),对于比较大的数据可以裁成一节一节的数据流进行传输。见Webmachine Streamed Body
hello, webmachine
webmachine提供了new_webmachine.sh脚本用于生成我们的webmachine应用骨架(一个标准的erlang OTP应用程序骨架、负责依赖管理和编译的rebar及其rebar配置,,make脚本,以及一个启动脚本),目录结构如下:
mywebdemo$ tree -L 2
.
├── deps/
│ ├── mochiweb
│ └── webmachine
├── ebin/
├── Makefile
├── priv/
│ ├── dispatch.conf
│ ├── log/
│ └── www/
├── README
├── rebar
├── rebar.config
├── src/
│ ├── mywebdemo.app.src
│ ├── mywebdemo_app.erl
│ ├── mywebdemo_sup.erl
│ ├── mywebdemo_resource.erl
│ └── mywebdemo.erl
└── start.sh
基于webmachine的web应用,用颜色标出开发相关部分,蓝色是这个web应用的erlang源代码,绿色为可执行脚本,红色为web应用的配置文件。深蓝色的是我们应用的web资源实现,理想情况下,不用修改其它erl模块,我们通过定义各种资源,并在dispatch.conf文件中设置好这些资源的映射实现我们的web应用。
所有的web请求日志都放在priv/log目录下,这些都是标准的http日志格式。
所有的静态文件都放在priv/www目录下,例如可以把我的web应用的favicon.ico放到这个目录下(这个简单的hello world应用现在还不能处理静态文件访问)
make之后用start.sh启动这个web应用,然后打开http://localhost:8000就可以看到hello world了
实际上这个骨架也可以用rebar生成,进入webmachine的目录后用rebar list-templates可以看到有一个wmskel的模版(就是WebMachine Skeleton的意思),在priv/templates目录下可以看到整个模版的内容,我们的web应用就是由此生成的。
基于webmachine的web应用
webmachine应用的结构如图所示:
当webmachine应用启动后其supervisor管理的进程树上挂着一个webmachine_router的genserver,这是负责对外(比如我们要开发的web应用)联络的接口。
我们要开发的web应用是通过一个典型的Erlang OTP应用实现:
一个OTP application及其app配置,
一个OTP supervisor,启动webmachine的工作在这个模块的init函数中进行:
启动后的web应用结构如果所示:
webmachine_mochiweb实际上是mochiweb_socket_server的注册名。
此外还包括一个控制模块mywebdemo,它有两个任务:
负责启动web应用依赖的其它应用(inets,crypto,mochiweb,webmachine);
最后启动这个application: mywebdemo。
此外这个模块还提供了stop功能
个人觉得mywebdemo这个模块有点像于C中main函数,在启动脚本start.sh中就直接使用这个模块启动我们的web应用。
不过我们这个由脚本自动生成的web应用骨架其实可以不必太过关注(不过HTTP服务的端口8000是写死在mywebdemo_sup模块中的)。
简单的理解是它负责将webmachine的HTTP处理逻辑嵌到mochiweb服务器中了。此后的HTTP请求都被webmachine接管过来,按照webmachine的逻辑(REST风格)进行处理,也就是docs目录下的那张大图(http-headers-status-v3.png)。
要关心的是如何处理资源。
实现REST风格的Web资源访问
自动生成的web应用骨架是不必修改的,需要做的是“添加”业务逻辑。
我们的web应用对外提供某种资源,对这些资源的处理也就是web应用的业务逻辑。每类资源的处理可以由一个erlang模块实现。
资源的映射、路由、或者dispatch
哪个请求对应哪个资源这种映射关系(也就是路由,或者说是dispatch)是在dispatch.conf文件中配置的。(当然也可以调用webmachine_router:add_route/1函数动态添加)
例如,自动生成的mywebdemo_resource模块是一个最简单的hello world文本资源。缺省的dispatch.conf是这个样子:
{[], mywebdemo_resource, []}.
这个tuple中的第一个元素是个list,对应着url中的路径,list中的元素是url路径中的token(也就是/隔开的字符串)。例如对于url:
http://localhost:8000/ab/c/c/dddd/e/f
对应的path tokens就是:
["ab", "c", "c", "dddd", "e", "f"]
对url的dispatch匹配规则:
list中的元素有三种类型:字符串,一个特殊的atom,'*'和其它普通atom
1. 字符串完全匹配
{["ab"], mywebdemo_resource, []}.
只有http://localhost:8000/ab/才能匹配mywebdemo_resource资源,
另外webmachine是区分大小写的,所以http://localhost:8000/Ab不会匹配这个资源。
2. 通配符匹配
如果
{["ab", '*'], mywebdemo_resource, []}.
现在这些url
http://localhost:8000/ab/c
http://localhost:8000/ab/cd
http://localhost:8000/ab/c/d
http://localhost:8000/ab/c/d/e
...
都能匹配资源了,注意'*'匹配了所有的末尾的path token(红色部分)。
对于这个dispatch
{["ab", "c", "d", '*'], mywebdemo_resource, []}.
只有这类url匹配了
http://localhost:8000/ab/c/d/e
当然'*'也可以在中间,例如这个dispatch:
{["ab", '*', "d", '*'], mywebdemo_resource, []}.
路径第一个token是ab,第3个是d的url都匹配这个资源。
'*'在中间与在末尾有一个很微妙的区别。如前所述,在末尾的'*'匹配一系列的path tokens,在中间的'*'只匹配一个path token。例如
{["ab", '*', "cd", '*'], mydemo_resource, []}.
对于这个url
http://localhost:8000/ab/c/pi/cd/ee/ff
中间的'*'是没法匹配"c" 和"pi"这两个path tokens的,当然最后的'*'没有这个限制。
3. 带名字绑定的统配
普通atom用在程序中,用于与路径token字符串建立映射。简单的讲这是个更高级的'*',它提供了路径的名字绑定:'*'是一种万能匹配,但是有时候我们想知道匹配的那部分path token怎么办,这时候名字绑定就可以用上了。举个例子,下面的atom是foo,对应的是ab之后紧跟的路径token,
{["ab", foo, "d", '*'], mywebdemo_resource, []}.
在程序中通过
V = wrq:path_info(foo, ReqData)
就可以得到url中foo对应的路径token,例如url是
http://localhost:8000/ab/werqwerqw/d/
那么V就是"werqwerqw"
资源的实现
mywebdemo_resource是资源的缺省实现模块,内容如下
-module(mywebdemo_resource). -export([init/1, to_html/2]). -include_lib("webmachine/include/webmachine.hrl"). init([]) -> {ok, undefined}. to_html(ReqData, State) -> {"<html><body>Hello, new world</body></html>", ReqData, State}.
更多见这里,比较枯燥。
对资源的访问
对资源的访问流程详见 http://wiki.basho.com/images/http-headers-status-v3.png
REST方式通过HTTP方法控制对资源的访问方式:创建(PUT),获取(GET)、修改(PUT/POST)还是删除(DELETE)资源。资源如果要支持以上方式就要自己提供相应的逻辑实现。
在REST之前,比较常见、也是比较直接的做法是,用户请求来之后,通过分析请求头的方法(即HTTP Method),调用对应的函数,(一个典型的例子如JEE的servlet,有对应的doGet,doPost等方法)。
但是webmachine不完全是通过HTTP Method分派处理的,它是通过content_types_provided和conttent_types_accepted提供对内容的处理方式。
前者指定对应的资源内容生成方式。也就是说根据HTTP客户请求的Accept消息头(HTTP Request Header)判断提供什么样的资源给用户。这种方式被称为Content negotiation
对应着资源的访问控制HTTP方法(GET)
后者通过HTTP客户请求的Content-Type消息头判断用户提供的数据是什么MIME类型的。
常用的对资源的访问控制HTTP方法(PUT/POST 等)都被分派到这个函数的处理上了。
DELETE方法倒是有对应的delete_resource
参考
http://wiki.basho.com/Webmachine-Quickstart.html
发表评论
-
静态链接与动态链接
2014-09-06 03:24 1556基于gmp开发第三方库,后者以动态链接库(静态库?)对方式发布 ... -
在macbook上安装linux
2014-06-12 10:29 22841. 安装最新的rEFInd > 0.8.2 http: ... -
NIF与OS线程
2013-08-31 01:29 1113NIF的OS线程编程模型可以参考The Art of Mult ... -
关于nif
2013-08-19 10:28 5150一、NIF的误用问题 使用NIF是很危险的,一不小心它就会搞 ... -
遇到的riak性能问题
2013-07-23 10:59 24281。 遇到一个奇怪的性能问题,多个进程中用riakc_pb_ ... -
dialyzer使用备忘
2013-07-04 12:36 1642一、构建PLT文件: 新构建 dialyzer --build ... -
手工从源码制作一个riak安装包
2013-06-22 18:47 1660riak的Makefile文件提供了各个平台上的安装包的生成脚 ... -
folsom_metrics使用备忘
2013-06-07 15:41 1482folsom是一个通用的统计度量工具。使用很简单,关键是搞清它 ... -
git 库永久删除大文件
2013-01-08 11:49 4713无意中把一个装有很多大文件数据的文件夹(./my1202260 ... -
Riak Core与folsom
2012-09-01 11:54 1506folsom是Riak从1.2开始引入。 -
关于Erlang/OTP的application参数配置
2012-08-26 23:27 9147Erlang/OTP中将完成特定功能的一组模块组织起来,称之 ... -
rebar工具使用备忘录 (5)
2012-08-23 18:17 1505haogongju、人人IT网、59n南龙、360doc、as ... -
lager的使用
2012-08-23 15:06 10562haogongju、人人IT网、59n南龙、360doc不要抄 ... -
rebar工具使用备忘录 (4)
2012-08-22 19:20 5619haogongju、人人IT网、59n南龙、360doc、as ... -
rebar工具使用备忘录 (3)
2012-08-22 19:18 1316haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (9) cheatsheet
2012-08-12 12:58 1682haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (8)
2012-08-11 18:52 1260haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (7)
2012-08-10 18:15 1356haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (6) HTTP接口
2012-08-09 16:16 1546haogongju,人人IT网,360do ... -
对Riak Core的探索 (5) 业务逻辑的实现:数据如何处理
2012-08-07 18:18 1660业务逻辑的实现:数据 ...
相关推荐
本篇将围绕“创建WebMachine应用程序”这一主题,深入讲解WebMachine的核心概念、工作原理以及如何使用它来构建一个简单的Web应用。 首先,WebMachine并不是一个完整的Web框架,而是专注于处理HTTP请求和响应的库。...
Webmachine 是一个应用层,为 mochiweb 提供 HTTP 语义的特性,定义一个简单而清晰的连接应用的方式。 标签:Webmachine Web框架
### sheehy_factory-webmachine:理解Webmachine的运行机制与应用 #### 一、Webmachine简介 根据文档标题“sheehy_factory-webmachine”及描述,“本文档描述了webmachine的运行机制,提供了简单流畅API帮助”。这...
webmachine-Ruby的端口 ,信息被写入在二郎。 这两个项目的目标都是以声明的方式向您的应用程序公开HTTP协议的有趣部分。 这意味着您不必担心直接处理请求所涉及的过程,而可以描述与组成应用程序的资源有关的事实...
webmachine, 基于REST的构建web应用程序的 webmachine这个项目从 Basho 开始,是Riak的创建者和维护者。 由于webmachine对更广泛的Erlang社区的重要性,形成了一个新的组织。 请与 @seancribbs 联系。概述 ...
2. **内容协商**:自动处理客户端关于资源格式(如JSON、XML)的请求,根据HTTP头自动选择合适的内容类型进行响应。 3. **URL路由**:提供灵活的URL路由机制,允许开发者定义复杂的URL模式匹配规则。 4. **错误...
oauth2_webmachine 这是使用 Webmachine 的 OAuth 2 服务器的示例实现。 它旨在用作其他实现的参考或起点。 不要在生产环境中使用它,因为它没有经过适当的测试或审计。 作者对因使用此实现而导致的任何损坏或问题...
由于Webmachine对于更广泛的Erlang社区的重要性,因此成立了一个新的组织。 请联系以参与。 概述 Webmachine是一个应用程序层,它在mochiweb提供的出色的按位和HTTP语法管理的基础上增加了HTTP语义意识,并提供了...
new_webmachine.sh 脚本创建的简单应用程序的基本直接端口从 Erlang 到 LFE。 当前的例外: 需要实现lfewm_sup:upgrade函数 必须手动实现lfewm_resource:ping 否则它似乎工作正常。 像其他任何东西一样构建...
飞艇:氦气+ Webmachine =飞艇。 用于构建声明性RESTful Web应用程序的工具包
- **默认行为**:Webmachine实现了一些默认行为,应用需要实现一组特定函数,这些函数将在框架内部被调用。 - **好莱坞原则**:框架调用应用提供的函数,而不是反之。 - **函数签名**:所有函数具有相同的签名`f(Req...
Webcrank.hs是一个基于Haskell编程语言的HTTP应用程序和服务开发框架,它受到了Webmachine设计哲学的启发。Webmachine的理念是通过提供一个明确的状态机模型,使开发者能够更简单地理解和处理HTTP协议的复杂性。...
Ruby-HAL服务器基于Webmachine和ROAR的示例HAL Server,受到我一天对访问的启发。 提供一个基本模板,用于设置结合和超文本应用程序语言(HAL)的简单应用程序,以在Ruby中构建真正的RESTful系统。 ROAR(Ruby中的...
Bishop是Clojure的的库。 Bishop提供的工具可以使您的Web服务轻松而直接地将视为一流的应用程序协议。 该库处理诸如内容协商和可预测的缓存行为之类的事情,使您可以集中精力构建一个干净且一致的API,无论它符合或...
先决条件如果您使用的是 Mac,或使用: brew install erlang然后安装 。安装用git clone git://github.com/6/heroku-erlang-example.git克隆这个 repo cd进去,然后: makeforeman start这将在本地启动 web 服务器...
- **参数化**:学习如何在Webmachine中使用参数化来增强应用的灵活性。 以上章节覆盖了从基础概念到高级特性的详细介绍,不仅适合初学者快速入门,也适合有一定经验的开发者深入研究各个框架的特点和技术细节。...
This book covers seven web frameworks that are influencing modern web applications and changing web development: Sinatra, CanJS, AngularJS, Ring, Webmachine, Yesod, Immutant. Each of these web ...
Ewebmachine是使用basho基于Webmachine的完全干净的DSL和插件集成的完全重写。 此版本与以前的版本(仅是围绕Webmachine的薄包装器)不向后兼容,请使用分支1.0-legacy来使用旧版本。 有关更多详细说明,请参见。 ...
Sinatra、CanJS、AngularJS,Ring、Webmachine、Yesod和lmmutant共计7种Web开发框架
kindle 七周七Web Sinatra、CanJS、AngularJS,Ring、Webmachine、Yesod和lmmutant共计7种Web开发框架