在服务器上 nginx 1.10.3
已创建测试存根,以 200 和静态 json 响应任何请求
cat mockserver.test.conf
server {
listen 80;
server_name mockserver.test;
location / {
return 200 '{"name": "qwerty", "phone": "+123"}';
}
}
如何配置 nginx,以便通过 POST 请求发送数据
POST http://mockserver.test/
{"token": "+444"}
响应是 json
{"name": "qwerty", "phone": "+444"}
也就是说,POST 请求中的键的值phone
被替换为响应键的值。token
https://nginx.org/en/docs/varindex.html
尝试使用:
return 200 '{"phone": "$request_body"}'
- 返回一个空字符串
return 200 '{"phone": "$request"}'
- 仅返回POST / HTTP/1.1
已更新以反映评论。
在执行指令的请求处理阶段
rewrite
,请求主体还没有被读取,因此这并不奇怪。它真的只包含需要插入到JSON中的数据,而无需进行任何处理吗?原则上,可以通过对自己进行额外的代理并通过自定义标头传递请求正文的内容来解决此问题,例如,proxy_set_header X-Request-Body $request_body;
在第二个服务器块中它将通过变量可用$http_x_request_body
:当使用类似的技术(附加代理层)时,为了稍微提高效率,您可以监听单独的套接字:
补充1
抱歉,晚上不知怎么的没注意到,问题提供了传入 JSON 的示例。我想我对将
$request_body
整个变量插入到传出的 JSON 中的尝试感到困惑。一般来说, njs模块非常适合这种情况(使用 njs 模块解析传入 JSON 的示例可在此处找到)。但对于简单的情况,您可以尝试使用带有map
正则表达式的块(取自此处):使用的正则表达式旨在检索给定键名(在本例中
phone
)的 JSON 字符串值,以更熟悉的 PCRE 语法可以写成如下形式:补充 2
由于某些我不知道的原因,nginx 版本 1.10.3(出于某种原因(2025 年!)问题作者使用)抱怨在块中的正则表达式中使用编号组
map
:(尽管在现代版本的 nginx 中这种配置非常实用)。但是相同的 nginx 1.10.3 完全理解使用命名组的相同正则表达式:
我并不想知道这个错误影响了哪些版本的 nginx,也不知道它具体是什么时候被修复的:)最重要的是上面给出的解决方法非常实用。
补充 3
根据问题指定的条件配置nginx:
还有!为了让上游服务正确处理我们提供的 JSON,
server { ... }
您可能需要在最后一个块中添加一个指令