【问题标题】:Return JSON after REST call in Phoenix endpoint在 Phoenix 端点中调用 REST 后返回 JSON
【发布时间】:2016-07-08 00:10:37
【问题描述】:

我正在学习 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

我从 Phoenix 那里得到一个错误页面,上面写着

无法编码值:{:total_count, 2389278}

所以有些东西在起作用,我实际上是在调用 Github 的 API,但由于某种原因我错过了一步,我已经按照这里的示例进行操作 https://github.com/edgurgel/httpoison#wrapping-httpoisonbase

非常感谢任何帮助/提示!

【问题讨论】:

    标签: json elixir phoenix-framework httpoison


    【解决方案1】:

    不确定您的预期结果是什么,但我假设您只想从控制器返回来自 Github 的完整响应作为 JSON。让 Poison 处理解码即可,无需进一步处理。

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

    您缺少的部分是得到!不返回 JSON,而是返回 %HTTPoison.Response 结构,如第一个用法示例中所示 https://github.com/edgurgel/httpoison

    该结构包含您处理的正文、标题和状态代码。您可以使用模式匹配来提取您的 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
    

    【讨论】: