如何在发送json响应的同时避免phoenix中的json解码?

问题描述:

例如,我有一个返回json的API客户端(作为字符串,未解码)。目前,我必须做这样的事情如何在发送json响应的同时避免phoenix中的json解码?

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

    json conn, Poison.decode!(json) 
end 

如果我避免Poison.decode那么响应将是一个巨大的字符串,而不是JSON。不知何故,我可以省略Poison.decode吗?它对我来说看起来是一种过度的行为。

注:我在凤凰1.3.0

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\\\"}\"" 
+0

感谢您的回答,但是您从哪里得到'send_resp/4'函数?我无法在文档中找到它。 –

+0

并且'put_resp_content_type'也不存在。我在凤凰城1.3.0 –

+0

这些来自插件https://hexdocs.pm/plug/Plug.Conn.html#put_resp_content_type/3 - 我已经添加了链接到我的答案。 – Gazler