2017-09-27 58 views
1

例如,我有一個返回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

回答

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