【问题标题】:Case statement when processing HTTPoison call处理 HTTPoison 调用时的 case 语句
【发布时间】:2016-07-05 08:57:32
【问题描述】:

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

【问题讨论】:

    标签: elixir phoenix-framework elixir-poison


    【解决方案1】:

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

    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
    

    【讨论】:

    • 我明白了,谢谢!我会试一试。 Elixir 还是新手。
    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多