【问题标题】:How to avoid json decoding in phoenix while sending json response?发送json响应时如何避免在phoenix中进行json解码?
【发布时间】:2017-09-29 02:30:34
【问题描述】:

例如,我有一个返回 json 的 API 客户端(作为字符串,未解码)。目前,我必须做这样的事情

def show(conn, params) do
  {:ok, json} = ApiClient.fetch(params["options"])

  json conn, Poison.decode!(json)
end

如果我避免使用Poison.decode,那么响应将是一个巨大的字符串而不是 json。我可以以某种方式省略Poison.decode 吗?这对我来说似乎是一种过度的行为。

注意:我使用的是 phoenix 1.3.0

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    json/2 函数可以将任何可序列化的数据结构作为 JSON(包括字符串)发送。

    您的 APIClient.fetch 函数不是对响应进行 JSON 解码,但是如果字符串已经是 JSON,则无需对其进行解码。可以直接使用send_resp/3发送:

    send_resp(conn, 200, json)
    

    您可能还需要使用put_resp_content_type/3 设置内容类型:

    conn
    |> put_resp_content_type("application/json")
    |> send_resp(200, json)
    

    由于json/2 函数将数据编码为 JSON,假设 JSON 字符串:

    "{\"hello\":\"world\"}"
    

    您将对其进行两次编码,结果是:

    "\"{\\\"hello\\\":\\\"world\\\"}\""
    

    【讨论】:

    • 感谢您的回答,但您从哪里获得 send_resp/4 功能?我在文档中找不到它。
    • put_resp_content_type 也不见了。我在 Phoenix 1.3.0
    • 这些来自插件hexdocs.pm/plug/Plug.Conn.html#put_resp_content_type/3 - 我已将链接添加到我的答案中。