2016-07-09 23 views

Odpowiedz

12

Phoenix.Controller.json/2 aktualnie nie akceptuje opcji, które można przekazać do kodera JSON.

Jeśli chcesz, aby wszystkie wywołania json generowały ładną wartość JSON, możesz utworzyć opakowanie o numerze Poison i poinformować Phoenix, aby z niego korzystał.

W lib/my_app/pretty_poison_encoder_for_phoenix.ex, dodać:

defmodule MyApp.PrettyPoisonEncoderForPhoenix do 
    def encode_to_iodata!(data) do 
    Poison.encode_to_iodata!(data, pretty: true) 
    end 
end 

I config/config.exs dodać:

config :phoenix, :format_encoders, json: MyApp.PrettyPoisonEncoderForPhoenix 

Po ponownym uruchomieniu serwera, wszystkie rozmowy json powinien automatycznie drukować ładny JSON.

Jeśli chcesz tylko ładne wyjście w dev, możesz zamiast tego dodać powyższy kod w config/dev.exs. Jeśli to zrobisz, prod nadal będzie generować niezły kod JSON.


Można również stworzyć prosty wrapper, który robi co Phoenix.Controller.json/2 robi (prawie; patrz uwaga poniżej), ale także sprawia, że ​​wyjście dość:

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 

Zastosowanie:

def index(conn, _params) do 
    pretty_json conn, [%{a: 1, b: 2}, %{c: 3, d: 4}] 
end 

Output :

➜ curl localhost:4000 
[ 
    { 
    "b": 2, 
    "a": 1 
    }, 
    { 
    "d": 4, 
    "c": 3 
    } 
] 

Uwaga: To nie jest dokładnie równoważne z Phoenix.Controller.json/2, ponieważ ta funkcja dodaje tylko typ zawartości, jeśli nie jest obecny. Możesz użyć tej samej logiki, kopiując kod z here.