2016-07-09 2 views

답변

12

Phoenix.Controller.json/2은 현재 JSON 인코더로 전달 될 수있는 옵션을 허용하지 않습니다.

모든 json 호출이 pretty JSON을 출력하도록하려면 Poison 주위에 래퍼를 만들고 Phoenix에 사용하도록 알릴 수 있습니다.

lib/my_app/pretty_poison_encoder_for_phoenix.ex에서 추가

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

그리고 config/config.exs에서

이 추가

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

서버를 다시 시작하면, 모든 json 통화가 자동으로 꽤 JSON을 인쇄해야합니다.

dev에만 꽤 출력하고 싶다면 위의 코드를 config/dev.exs에 추가하면됩니다. 그렇게하면 prod은 여전히 ​​예쁜 JSON을 출력합니다.


또한 Phoenix.Controller.json/2가 무엇을 수행하는 간단한 래퍼를 생성 할 수 있습니다 (거의; 아래 참고 참조)뿐만 아니라 꽤 출력한다 :

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 

사용법 :

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

출력 :

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

참고 :이 함수는 콘텐츠 유형이 없으면 추가하는 기능이므로 정확히 Phoenix.Controller.json/2과 같지 않습니다. here에서 일부 코드를 복사하여 동일한 로직을 사용할 수 있습니다.

관련 문제