处理HTTPoison调用时的case语句

时间:2016-07-04 20:52:30

标签: elixir phoenix-framework elixir-poison

我尝试使用相同的HTTPoison调用进行API调用,该调用返回多个项目或单个项目。对多个项目的响应将它们投入到"项目"属性,而单个项只返回项信息作为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_response_body中,如何检查JSON响应中的items属性,如果它不存在,请以不同方式处理它?<​​/ p>

1 个答案:

答案 0 :(得分:2)

我只是解码结果并编写一个多头函数将它打包到你的对象中。类似的东西:

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