C'è un modo per fare in modo che Phoenix.Controller.json(conn, data)
emetta un bel JSON?Fai in modo che il controller Phoenix emetta un bel JSON
risposta
Phoenix.Controller.json/2
attualmente non accetta opzioni che potrebbero essere passate al codificatore JSON.
Se si desidera rendere globalmente tutte le chiamate json
piuttosto JSON, è possibile creare un wrapper attorno a Poison
e indicare a Phoenix di utilizzarlo.
In lib/my_app/pretty_poison_encoder_for_phoenix.ex
, aggiungere:
defmodule MyApp.PrettyPoisonEncoderForPhoenix do
def encode_to_iodata!(data) do
Poison.encode_to_iodata!(data, pretty: true)
end
end
E in config/config.exs
, aggiungere:
config :phoenix, :format_encoders, json: MyApp.PrettyPoisonEncoderForPhoenix
Dopo aver riavviato il server, tutte le chiamate json
dovrebbero stampare automaticamente abbastanza JSON.
Se si desidera un output piuttosto buono in dev
, è possibile invece aggiungere il codice sopra riportato in config/dev.exs
. Se lo fai, prod
continuerà a produrre JSON non grazioso.
È possibile anche creare un semplice wrapper che fa quello Phoenix.Controller.json/2
fa (quasi; vedi nota sotto), ma rende anche l'uscita abbastanza:
def pretty_json(conn, data) do
conn
|> put_resp_header("content-type", "application/json; charset=utf-8")
|> send_resp(200, Poison.encode!(data, pretty: true))
end
Usage:
def index(conn, _params) do
pretty_json conn, [%{a: 1, b: 2}, %{c: 3, d: 4}]
end
uscita :
➜ curl localhost:4000
[
{
"b": 2,
"a": 1
},
{
"d": 4,
"c": 3
}
]
Nota: questo non è esattamente equivalente a Phoenix.Controller.json/2
poiché tale funzione aggiunge solo il tipo di contenuto se uno non è presente. È possibile utilizzare la stessa logica copiando un codice da here.