【问题标题】:Handle views using Phoenix as a RESTful API app使用 Phoenix 作为 RESTful API 应用程序处理视图
【发布时间】:2018-08-28 00:11:50
【问题描述】:

我无法理解如何正确处理凤凰视图。 假设客户端正在调用“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 页面。

【问题讨论】:

    标签: rest api elixir phoenix-framework


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 但是选项一根本没有使用视图。它只是直接获取、组织数据并将数据发送给调用者,而无需通过视图
    • 所以这是关于使用send_resprender。我投票给render 并使用视图,因为它在需要时可以更好地扩展。
    猜你喜欢
    • 2023-03-14
    • 2020-11-10
    • 2018-03-04
    • 1970-01-01
    • 2019-12-29
    • 2012-10-16
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多