如何使用Nginx和Lua处理POST请求的JSON主体?

杰西

我正在做一个概念验证,以演示如何在堆栈中实现3scale在一个示例中,我想进行一些POST请求主体操作,以创建一个API外观,该外观将旧API格式映射为新的内部API格式。例如。改变像

{ "foo" : "bar" , "deprecated" : true }

进入

{ "FOO" : "bar" }

用于content_by_luaLua模块文档,看起来像是适当的方法

不要在同一位置使用此指令和其他内容处理程序指令。例如,此指令和proxy_pass指令不应在同一位置使用。

我的理解是content_by_lua是类似于proxy_pass的内容处理程序,每个位置只能使用其中一个。

我不认为有任何方法可以删除proxy_pass,因为这是代理工作方式的基础,因此是否有可能在单独的位置捕获请求,使用content_by_lua,然后传递至实现proxy_pass的位置,或者是否有其他类似的方法rewrite_by_lua哪个更合适?


如果对其他人有帮助,我添加了以下函数(我的Lua的第一位),该user_key函数删除了3scale授权所需要参数,但如果继续转发,则对我们的API无效:

function remove_user_key()
  ngx.req.read_body()
  -- log the original body so we can compare to the new one later
  local oldbody = ngx.req.get_body_data()
  log(oldbody)
  -- grab the POST parameters as a table
  local params = ngx.req.get_post_args()

  -- build up the new JSON string
  local newbody = "{"

   for k,v in pairs(params) do
     -- add all the params we want to keep
     if k ~= "user_key" then
        log("adding"..k.." as "..v)
        newbody = newbody..'"'..k..'":"'..v..'",'
     else 
        log("not adding user_key")
     end
   end
  --remove the last trailing comma before closing this off
  newbody = string.sub(newbody, 0, #newbody-1)
  newbody = newbody.."}"

  ngx.req.set_body_data(newbody)
  log(newbody)
end

if ngx.req.get_method() == "POST" then
  remove_user_key()
end
普拉尚·高尔(Prashant Gaur)

我建议您access_by_lua
在nginx.conf中使用

位置/ { 
                #fastcgi服务器
                default_type的主机和端口text / html; 
                设置$ URL“ http:// $ http_host $ request_uri”; 
                access_by_lua_file /home/lua/cache.lua; 
                proxy_pass http:// $ target; 
                ------- 
                ---------

在cache.lua文件中,您可以执行以下操作:

如果ngx.req.get_method()==“ POST”,则
    -检查请求方法是否为POST-
    实现逻辑
    返回

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在SprayTest中使用JSON主体模拟POST请求?

无法使用JSON主体复制POST请求

使用node.js测试API如何处理无效的JSON语法请求主体

替换NGINX代理中的POST请求主体

在Nginx中使用Lua脚本发布请求处理

如何处理 POST 主体 HttpServletRequest 中的 JSON

如何使用Ruby Mechanize设置POST请求的主体?

如何使用Servlet API处理POST请求

如何处理来自请求主体的图像

简单的Python服务器使用JSON处理GET和POST请求

如何在Lua中使用OAUTH发送POST请求

使用Gunicorn和Nginx处理请求时出错

如何在nginx上获取等待或排队的请求的请求主体?

如何使用Kafka,Alpakka Kafka,Play Framework和Websocket处理POST请求?

如何在OpenAPI(Swagger)中描述此POST JSON请求主体?

在POST请求中混合使用查询参数和主体参数是一种不好的做法吗?

尝试使用springboot从POST请求主体读取嵌套JSON时获取null

如何使用python请求和处理JSON?

如何以json格式构建请求的主体

如何从Go上的请求主体获取JSON

使用请求主体的Scala Play框架POST请求

Swagger UI似乎无法使用POST json主体处理可选键

使用通用JSON对象作为请求主体

如何使用Guzzle以JSON发送POST请求?

如何使用 nginx 将 post 请求传输到不同的端口?

如何使用带字符串主体的凌空发送POST请求?

使用Groovy脚本在SoapUI中生成动态JSON请求主体并将其传递给POST API请求

如何使用Elastic Load Balancer和EC2 / Nginx解决502 Bad Gateway错误,以处理HTTPS请求?

如何使用Oauth请求提交和处理请求参数?