我正在使用HTTPoison
和Poison
解码对视图的json响应。我成功解码了响应主体,但我很难将其纳入视图。我收到此错误:cannot encode maps inside lists when the map has 0 or more than 1 elements
以下是我在控制器中所做的事情:
url = "https://api.sportradar.us/nba/trial/v4/en/games/2016/11/06/schedule.json?api_key={api_key}"
case HTTPoison.get(url) do
{:ok, %{status_code: 200, body: body}} ->
decoded_json = Poison.decode!(body)
redirect(conn, to: schedule_path(conn, :index, decoded_json))
{:ok, %{status_code: 404}} ->
end
我可以将响应传递给重定向吗?我觉得这是错误的做法吗?
答案 0 :(得分:2)
您的控制器可能应该呈现您想要的数据/视图,而不是使用您的数据重定向到另一个控制器。
重定向通常用于执行操作之后,例如成功的POST请求和对请求中的数据执行某些操作,您将被重定向到另一个页面。它们通常不用于将数据从一种控制器方法发送到另一种控制器方法。
我不知道你想要完成什么,所以我的榜样只能和我的假设一样好。但是,这是一种方法,可能比你想做的更有意义。我希望它至少可以帮助你朝着更好的方向前进:
defmodule MyAppWeb.MyController do
use MyAppWeb, :controller
alias MyApp.MyScheduleThing
action_fallback MyAppWeb.FallbackController
def index(conn, %{"date" => date} = params) do
with {:ok, schedule} <- MyScheduleThing.get_schedule(date) do
render(conn, "schedule.html", schedule: schedule)
end
end
end
你的模块用于做任何事情
defmodule MyApp.MyScheduleThing do
@moduledoc """
A module in another file to do your HTTP fetching.
"""
@doc "Do your thing"
def get_schedule(date) do
url = url_from_date(date)
case HTTPoison.get(url) do
{:ok, %{status_code: 200, body: body}} ->
{:ok, Poison.decode!(body)}
{:ok, %{status_code: 404}} ->
{:error, :not_found}
{:error, _err} ->
{:error, :internal_server_error}
end
end
defp url_from_date(date) do
"https://api.sportradar.us/nba/trial/v4/en/games/#{date}/schedule"
end
end
:internal_server_error
返回可能不是您想要的,因此请将其视为我在不知道您的应用或意图的情况下放置的占位符。
当{:error, :not_found}
语句不匹配时,with
实际上会导致它命中回退控制器。 The default one matches on that。您可以在自己的后备控制器中添加更多方法以满足您的需求。
这些都不是你真正想要的(正如我所说,我不知道你在做什么),但至少应该帮助你更好地控制你。