rest - 使用 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 页面。
解决方案
视图是您想要作为响应发送到的数据的表示。所以首先你需要有一些数据,其次你必须以它必须在某些 API 或 HTML 页面中呈现的方式呈现它。
你肯定不想从一个视图进入数据库,但如果你不去那里,那么边界就更微妙了。
尽管如此,generate_user_token
它看起来还是一个数据发射器,而不是一个数据呈现器。谁知道呢,也许有一天有人会改变这个函数,所以它会访问一个数据库来生成令牌。
为避免相关麻烦,最好将数据生成器置于视图之外。将它们放入控制器,然后将结果发送到视图。
所以,我投票支持选项 1。
推荐阅读
- c# - 您如何使用 linq 离开加入“非空”?
- c - 将值分配给 void 数组?
- javascript - 反应:将状态传递给 {this.props.children}
- elasticsearch - 为什么带有分析器的 shingle 令牌过滤器没有产生预期的结果?
- android - Rxjava:插入仅适用于单个但不适用于可完成
- python - 根据索引列表从数组中获取元素
- python - tensorflow_probability 分布应该如何用于多维空间?
- material-ui - MKDOCS 材质主题搜索功能不起作用
- database - Mongo DB:如何从一个集合中复制文档并将其作为字段添加到另一个集合中的相关文档?
- python - 在python中拆分大数据文件