首页 > 解决方案 > 使用 Phoenix 作为 RESTful API 应用程序处理视图

问题描述

我无法理解如何正确处理凤凰视图。假设客户端正在调用“login_user”api。我的控制器将处理请求,检查用户是否可以访问。作为回应,我需要将用户的数据发送给调用者。现在,在控制器的登录逻辑之后,正确的响应方式是什么?

1)获取控制器内部调用者所需的所有数据:

user_data = function_that_fetch_user_data()

conn
|> put_resp_header("content-type", "application/json")
|> put_status(:ok)
|> send_resp(Status.code(:ok), user_data)

2) 渲染视图

conn
|> put_resp_header("content-type", "application/json")
|> put_status(:ok)
|> render(login.json, user)

并在其中获取数据

defmodule CryptomonitorWeb.UserView do
  use MyAppWeb, :view

  def render("login.json", user) do
    token = generate_user_token(user.mail)
    %{
       token: token,
       email: user.mail,
       group: "operators"
     }
  end

end

直接在控制器中获取数据并构建我的响应对我来说更加清晰和干净,但我想知道处理 api 响应的“正确”方法是什么。我的应用程序通常只会将 json 返回给客户端,有时会呈现一些 html 页面。

标签: restapielixirphoenix-framework

解决方案


视图是您想要作为响应发送到的数据的表示。所以首先你需要有一些数据,其次你必须以它必须在某些 API 或 HTML 页面中呈现的方式呈现它。

你肯定不想从一个视图进入数据库,但如果你不去那里,那么边界就更微妙了。

尽管如此,generate_user_token它看起来还是一个数据发射器,而不是一个数据呈现器。谁知道呢,也许有一天有人会改变这个函数,所以它会访问一个数据库来生成令牌。

为避免相关麻烦,最好将数据生成器置于视图之外。将它们放入控制器,然后将结果发送到视图。

所以,我投票支持选项 1。


推荐阅读