Cowboy
Initialization
首先, init函数会被调用,所有的处理都会调用该函数。如果使用rest处理当前的请求,那么这个函数必须返回upgrade
[init({tcp, http}, Req, Opts) ->
{upgrade, protocol, cowboy_test}.
cowboy会转为REST协议来开始执行状态机,如果rest_init/2被定义,那么将从reset_init/2开始执行,
同理执行结束时会执行rest_terminate/2.
Methods
rest支持的http方法有Head, Get, Post, Patch, Put, Delete, Options 其他方法也会被接受,但是当前没还有特定的他们的回调函数。
Callbacks
所有的回调都是可选的,有些回调强制依赖于其他回调的返回值。
当request启动的时候,Cowboy调用reset_init/2函数如果她被定义了,req对象和处理选项opts作为参数。这个函数必须返回{ok,req,state},state是处理句柄的状态,所有的子请求的回调函数都会接受到。
- 在所有请求的最后,rest_terminate/2如果被定义都会被执行,这个函数不能发送reply,且必须返回ok.
其他所有的回调都是资源的回调,都有两个参数,req和state,并且返回三元组{value, req, state}
下面是一张详细表,如果回调函数没有定义,那么他们的默认值将会被使用到。
- 所有的回调都可以返回{halt, req,state} 来中断请求,然后rest_terminate/2会被调用。
除此之外,用户可以在content_types_accpted/2 和 content_types_provided/2中嵌入用户自定的回调函数。这些函数的名字没有限制,但是在每个回调函数的名字中增加前缀,例如, from_html和to_html,这样来指明第一个函数接收到的请求被指定为HTML,第二个表示服务端应该返回一个HTML。
Meta data (response body)
Cowboy将会在每个执行点处收集meta值,用户可以通过 cowboy_req:meta/{2,3}来进行索引。这些值如下表所示:
Meta key | Details
media_type | The content-type negotiated for the response entity.
language | The language negotiated for the response entity.
charset | The charset negotiated for the response entity.
Response headers
cowboy 会自动设置应答头,这些头信息如下:
Header name | Details
content-language | Languange used in the respnse body
content-type | Media type and charset of the response body
etag | Etag of the resource
expires | Expiration data of the resource
last-modified | Last modification data for the resource
location | Relative or absolute URL to the requested resource
vary | List of headers that may change the representation of resource