2016-07-04 5 views
1

여러 항목 또는 단일 항목을 반환하는 API 호출에 대해 동일한 HTTPoison 호출을 사용하려고합니다. 여러 항목에 대한 응답은 항목을 "items"속성으로 던지고, 단일 항목은 항목 정보를 JSON 문자열로 반환합니다. 여기 HTTPoison 호출을 처리 할 때 case 문

내 코드입니다 :

process_response_body에서
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 

, 어떻게 그것을 다른 프로세스를 JSON 응답의 항목 속성을 확인하고 존재하지 않는 경우 수 있을까요?

답변

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 
+0

내가보고, 감사합니다! 나는 그 기회를 줄 것이다. 아직 엘릭서를 처음 보았습니다. – humdinger