我有终点" /客户"和" / api / v1 / customers",分别在html和json中为客户列表。我是否必须创建2个不同的控制器,从而为它们创建操作?或者我可以从单个控制器和操作返回html或json,具体取决于请求的格式:html或json?请注意,对于" / api / v1 / customers"我需要通过Api Key进行身份验证。
答案 0 :(得分:1)
您可以为两个端点设置一个控制器和操作,但我会建议不要这样做。
你提到那些控制器需要做不同的事情,所以不要添加诸如“如果json然后检查api密钥”之类的东西,而是制作两个独立的控制器并提取获取所有客户的通用代码。
关于从http界面解开业务逻辑有一个很好的讨论:http://www.elixirconf.eu/elixirconf2016/lance-halvorsen获取客户列表可能不在你的控制器中,所以最后你会有两个这样的控制器:
defmodule MyApp.Api.CustomersController do
plug MaApp.ApiAuth #plug for checking api key
def index(conn, params) do
...
customers = ActualLogic.get_customers()
...
end
end
def MyApp.CustomersController do
plug MyApp.UserAuth #for example checks if user is logged in
def index(conn, params) do
...
customers = ActualLogic.get_customers()
...
end
end
最后你的控制器不执行任何逻辑,它调用别的东西来完成工作,动作只负责解决params,通过api密钥进行身份验证,会话cookie以及将最终结果转换为json / html等Web内容。