处理 HTTPoison 调用时的 case 语句

Case statement when processing HTTPoison call

我正在尝试对 API 调用使用相同的 HTTPoison 调用 returns 多个项目或单个项目。多个项目的响应将它们放入 "items" 属性,而单个项目只是 returns 项目信息作为 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 响应中的项目 属性,如果不存在,则进行不同的处理?

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

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