2016-12-02 17 views
1

Предположим, у вас есть функция, возвращающая json, определенную в вашей базе данных postgresQL.openresty upstream postgres, вызывающий функцию, которая сама возвращает json

CREATE OR REPLACE FUNCTION test() RETURNS JSON AS $$ 
    SELECT 
    '[ 
    {"fName":"John","lName":"Doe"}, 
    {"fName":"Jane","lName":"Doe"} 
    ]'::JSON; 
$$ 
LANGUAGE SQL STRICT IMMUTABLE; 


SELECT test(); 
------------------------------------- 
[         
    {"fName":"John","lName":"Doe"}, 
    {"fName":"Jane","lName":"Doe"} 
] 

Кроме того у вас есть Nginx, включая Nginx модуль Postgres (openresty) с follwoing конфигурации в файле:

worker_processes 1; 
error_log logs/error.log; 
events { 
    worker_connections 1024; 
} 
http { 

    upstream database { 
     postgres_server localhost dbname=example user=postgres; 
     postgres_keepalive max=200 overflow=reject; 
    } 

    server { 
     listen 8080; 
     location /test/ { 
       postgres_pass database; 
       rds_json on; 
       postgres_query HEAD GET "SELECT test()"; 
       postgres_rewrite HEAD GET no_rows 410; 
     } 
    } 
} 

С rds_json на; все кавычки экранируются на выходе и это выглядит следующим образом:

curl http://localhost:8080/test/ 
[{"test":"[\n {\"fName\":\"John\",\"lName\":\"Doe\"},\n {\"fName\":\"Jane\",\"lName\":\"Doe\"}\n ]"}] 

Условный я поставил rds_json прочь; я получаю правильно отформатированный JSON, но возвращенная строка начинается и заканчивается с некоторыми неудобных признаками:

@^C^@^@^@^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@<80>r^@^D^@test^AL^@^@^@[ 
    {"fName":"John","lName":"Doe"}, 
    {"fName":"Jane","lName":"Doe"} 
    ]^@ 

Есть ли способ, чтобы либо избавиться от дополнительных признаков в объекте результата или не избежать все двойные кавычки в первом случае?

Thanks

ответ

0

Я нашел причину. На самом деле это было тривиально. Вместо того, чтобы сделать openresty формат выходным для json. Извините за беспокойство сообщества с моим вопросом. Я должен был правильно установить заголовок:

worker_processes 1; 
error_log logs/error.log; 
events { 
    worker_connections 1024; 
} 
http { 

    upstream database { 
     postgres_server localhost dbname=example user=postgres; 
     postgres_keepalive max=200 overflow=reject; 
    } 

    server { 
     listen 8080; 
     location /test/ { 
       postgres_pass database; 
       postgres_query HEAD GET "SELECT test()"; 
       more_set_headers 'Content-Type: application/json'; 
       postgres_rewrite HEAD GET no_rows 410; 
     } 
    } 
}