Оператор case при обработке вызова HTTPoison

Я пытаюсь использовать те же вызовы HTTPoison для вызова API, который возвращает либо несколько элементов, либо один элемент. Ответ для нескольких элементов помещает их в свойство «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_response_body, как я могу проверить свойство items в ответе JSON, и если оно не существует, обработать его по-другому?


person humdinger    schedule 04.07.2016    source источник


Ответы (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
person Paweł Obrok    schedule 05.07.2016
comment
Ясно спасибо! Я попробую. Все еще новичок в Эликсире. - person humdinger; 05.07.2016