我正在学习Elixir和Phoenix,我正在构建一个需要查询Github API的副项目。
这是执行调用的模块
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
这是在“/ api / github / search”上回答GET的控制器
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
非常感谢任何帮助/提示!
答案 0 :(得分:2)
不确定您的预期结果是什么,但我假设您只想从控制器返回Github作为JSON的完整响应。只需让Poison处理解码,无需进一步处理。
def process_response_body(body) do
body
|> Poison.decode!
end
你遗失的部分是得到的事实!不会返回JSON,而是返回%HTTPoison.Response结构,如第一个用法示例https://github.com/edgurgel/httpoison
struct包含您处理的正文,标题和状态代码。您可以使用模式匹配来提取您的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