使用 openresty upstream postgres 调用返回 json 的函数

假设您在您的 postgresQL 数据库中定义了一个返回 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"}
 ]

此外,您还有一个包括 Postgres Nginx 模块(openresty)的 Nginx,配置文件如下:

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 on; 所有引号都在输出中进行了转义,结果如下所示:

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

如果我设置 **rds_json off;**,我就会收到一个格式正确的 json,但返回的字符串起始和结尾带有一些奇怪的符号:

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

是否有一种方法可以消除结果对象中的附加符号,或者在第一种情况下不转义所有双引号?

谢谢

点赞
用户1612798
用户1612798

我找到了一个原因。实际上它是微不足道的。只需从配置中删除 rds_json on;,而不是让 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;
        }
    }
}
2016-12-06 11:43:59