2017-09-27 3 views
1

Par exemple, j'ai un client API qui renvoie json (sous forme de chaîne, non décodée). À l'heure actuelle, je dois faire quelque chose comme çaComment éviter json décoder dans phoenix lors de l'envoi de réponse de JSON?

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

    json conn, Poison.decode!(json) 
end 

Si j'évite Poison.decode alors la réponse sera une énorme chaîne au lieu de JSON. Puis-je omettre Poison.decode d'une manière ou d'une autre? Cela ressemble à une action excessive pour moi.

Note: Je suis sur Phoenix 1.3.0

Répondre

3

La fonction json/2 peut envoyer une structure de données sérialisable JSON (y compris une chaîne).

Votre fonction APIClient.fetch n'est pas JSON décoder la réponse, si la chaîne est déjà JSON, il n'y a pas besoin de le décoder. Vous pouvez l'envoyer directement à l'aide send_resp/3:

send_resp(conn, 200, json) 

Vous pouvez aussi avoir besoin de définir le type de contenu à l'aide put_resp_content_type/3:

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

Puisque la fonction json/2 code les données en tant que JSON, en supposant que la chaîne JSON:

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

Vous encodez deux fois, ce qui:

"\"{\\\"hello\\\":\\\"world\\\"}\"" 
+0

Merci pour la réponse, mais où avez-vous obtenu cette fonction 'send_resp/4'? Je ne peux pas le trouver dans docs. –

+0

Et 'put_resp_content_type' est également manquant. Je suis sur Phoenix 1.3.0 –

+0

Ceux-ci viennent de prise https://hexdocs.pm/plug/Plug.Conn.html#put_resp_content_type/3 - J'ai ajouté les liens à ma réponse. Merci – Gazler