如何在发送json响应时避免在凤凰中进行json解码?

时间:2017-09-27 09:06:27

标签: elixir phoenix-framework

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

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

1 个答案:

答案 0 :(得分:3)

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