处理 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
我正在尝试对 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