2016-07-08 18 views
0

我正在學習Elixir和Phoenix,我正在構建一個需要查詢Github的API的項目。在鳳凰端點呼叫REST後返回JSON

這是執行調用

defmodule Github do 

    use HTTPoison.Base 

    def process_url(url) do 
    "https://api.github.com/" <> url 
    end 

    def process_response_body(body) do 
    body 
    |> Poison.decode! 
    |> Enum.map(fn({k, v}) -> {String.to_atom(k), v} end) 

    end 

end 

,這是回答一個GET控制器上的 「/ API/github上/搜索」

defmodule MyApp.GithubController do 

    use MyApp.Web, :controller 
    require Github 

    def search(conn, _params) do 
    json conn, search_repositories 
    end 

    def search_repositories() do 

    url = "search/repositories?q=language:javascript&sort=stars&order=desc" 
    Github.get! url 
    end 

end 

我得到一個錯誤頁面模塊來自菲尼克斯頂部

無法編碼值:{:total_count,2389278}

因此,一些在工作,其實我打電話GitHub的API,但由於某些原因,我錯過了一步,我已經按照這裏的例子https://github.com/edgurgel/httpoison#wrapping-httpoisonbase

任何幫助/提示是高度讚賞!

回答

2

不知道你的預期結果是什麼,但我想你只是想從你的控制器返回從Github作爲JSON的完整響應。只需讓Poison處理解碼,不需要進一步處理。

def process_response_body(body) do 
    body 
    |> Poison.decode! 
end 

你缺少的一塊是事實,得到!不返回JSON,但可以在第一次使用的例子可以看出這裏https://github.com/edgurgel/httpoison

該結構包含你的身體處理,頭和狀態碼%HTTPoison.Response結構。你可以使用模式匹配來提取你的json並返回它:

def search_repositories() do 
    url = "search/repositories?q=language:javascript&sort=stars&order=desc" 
    %HTTPoison.Response{:body => json, :headers => headers, :status_code => code} = Github.get! url 
    IO.inspect headers 
    IO.inspect code 
    json 
end