Elixir 处理HTTPoison调用时的Case语句

Elixir 处理HTTPoison调用时的Case语句,elixir,phoenix-framework,elixir-poison,Elixir,Phoenix Framework,Elixir Poison,我尝试对返回多个项目或单个项目的API调用使用相同的HTTPoison调用。对多个项的响应将它们抛出到“items”属性中,而单个项仅返回作为JSON字符串的项信息 这是我的密码: def process_url(method, id \\ 0) do if id > 0 do "http://api.call.com/#{method}/#{id}?key=API_KEY" else "http://api.call.com/#{method}

我尝试对返回多个项目或单个项目的API调用使用相同的HTTPoison调用。对多个项的响应将它们抛出到“items”属性中,而单个项仅返回作为JSON字符串的项信息

这是我的密码:

  def process_url(method, id \\ 0) do
    if id > 0 do
      "http://api.call.com/#{method}/#{id}?key=API_KEY"
    else
      "http://api.call.com/#{method}?key=API_KEY"
    end
  end

  def process_response_body(body) do
    body
    |> Poison.decode!(as: %{"items" => [%Item{}]})
    |> Map.fetch!("items")
  end

在process\u response\u body中,如何让它检查JSON响应中的items属性,如果它不存在,则以不同的方式处理它?

我只需解码结果并编写一个多头函数将其打包到对象中。比如:

def process_response_body(body) do
  body
  |> Poison.decode!
  |> unpack
end

def unpack(%{"items" => items}) do
  Enum.map(items, &struct(Item, &1))
end
def unpack(%{"item" => item}), do: struct(Item, item)
或与案例一起:

body
|> Poison.decode!
|> case do
  %{"items" => items} -> Enum.map(items, &struct(Item, &1))
  %{"item" => item} -> struct(Item, item)
end

我明白了,谢谢!我要试一试。对长生不老药来说还是新鲜事。