自从用 grape 开发过 API,从此爱不释手,从开坑 maru 到现在也一年多了,从 elixir 0.11 一路跟过来,也遇到了很多问题。现在 elixir 渐渐成熟,elixir 的 web 项目也越来越多,借此推广下这个框架 :D
学习 elixir 的人应该都知道 phoenix ,毫无疑问 phoenix
是个非常棒的 elixir web 框架,但就像 ruby 中有 rails
并没有影响 sinatra
和 grape
这种新框架的出现。maru
也是基于 plug 开发的框架,可以无缝拉入 phoenix
作为 restful server。
maru 的灵感来源是 grape,甚至大多数的地方在语法层面上保持一致,如果熟悉 grape
是非常容易上手的,这里简单介绍一下 maru 的 DSL
以下路由方案对应了 '/users/:id' 这个 url 的 get
, post
和 delete
方法:
resource :users do
route_param :id do
get do
%{user: XXX} |> json
end
post do
%{result: :success} |> json
end
delete do
%{result: :success} |> json
end
end
end
同时 resource
是可以嵌套的,也支持 get
、post
等宏的路径参数,例如:
resources :level1 do
resource :level2 do
get do
XXX
end
end
end
get "/users/:id" do
XXX
end
参数的用法同样类似 grape
,但根据 elixir 的语言改变了一些名称,比如说 grape
里的 Hash 改成了 Map,Symble 改成了 Atom 等。
params do
requires :age, type: Integer, values: 18..65
requires :sex, type: Atom, values: [:male, :female], default: :female
group :name, type: Map do
requires :first_name
requires :last_name
end
optional :intro, type: String, regexp: ~r/^[a-z]+$/
optional :avatar, type: File
optional :avatar_url, type: String
exactly_one_of [:avatar, :avatar_url]
end
post do
IO.inspect params
end
elixir
{:maru, github: "falood/maru"}
get do "It Works!" |> text end end
3. endpoint.ex 里 加一行
```elixir
plug Maru.Plugs.Forword, at: "/api", to: MyAPP.API
这样就把 /api
下的请求 forward 到 maru 了,其它的请求继续走 phoenix,这里有个示例。
PS. 目前 hex 里的最新版是 0.2.7,forword
的特性已经进入 master 分支,会在 hex 0.2.8 中发布。
更多的特性就不在这里写了,非常欢迎喜欢 grape
的童鞋试用 maru ,也非常欢迎拍砖或贡献代码。
PS. 希望 github 上的 issue 和 commit 都使用英文。不是为了装 B,虽然我自己英文也比较烂,但中文的 commit 过多,会导致无法与国外的牛人交流,望理解。