Обработка представлений с использованием Phoenix в качестве приложения RESTful API - PullRequest
0 голосов
/ 27 августа 2018

У меня проблемы с пониманием того, как правильно обращаться с представлениями Феникса. Допустим, клиент вызывает API «login_user». Мой контроллер обработает запрос, проверяя, разрешен ли пользователю доступ или нет. В ответ мне нужно отправить данные пользователя вызывающей стороне. Теперь, после логики входа контроллера, как правильно реагировать?

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-страницу.

1 Ответ

0 голосов
/ 27 августа 2018

Представления - это представление данных, которые вы хотите отправить в ответ. Итак, во-первых, вам нужно иметь некоторые данные, во-вторых, вы должны представить их так, как они должны быть представлены в каком-то API или HTML-странице.

Вы определенно не хотите входить в базу данных из представления, но если вы не пойдете туда, тогда граница будет более тонкой.

Тем не менее, generate_user_token выглядит как источник данных, а не как представитель данных. И кто знает, может быть, однажды кто-то изменит функцию, и он попадет в базу данных для генерации токена.

Чтобы избежать связанных с этим проблем, лучше располагать генераторы данных вне поля зрения. Поместите их в контроллер, затем отправьте результаты в представление.

Итак, я голосую за вариант 1.

...