我正在做一个概念验证来演示我们如何在堆栈中实现3scale。在一个示例中,我想做一些POSTrequestbody操作来创建一个API façade,将可能是遗留的API格式Map到新的内部格式。例如,更改如下内容
{ "foo" : "bar" , "deprecated" : true }
进入
{ "FOO" : "bar" }
Lua模块docs forcontent_by_lua,这似乎是合适的方法
不要在同一位置使用本指令和其他内容处理程序指令。例如,本指令和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
3条答案
按热度按时间f1tvaqid1#
建议使用
access_by_lua
在nginx.conf中
在cache.lua文件中,您可以执行以下操作:
bvjveswy2#
补充一下Prashant已经提到的内容:当你从3scale下载Nginx配置文件时,你会注意到包含了一个Lua文件。这个文件已经被
access_by_lua_file
调用了。在我看来,这个文件是添加body操作代码的最佳位置。它将在向API服务器发送
proxy_pass
之前为每个请求执行。此外,this是一篇非常好的深入博客文章,讲述了如何在Nginx中使用Lua完成对请求的不同转换:
7jmck4yq3#
最近,我不得不在post request中基于JSON值操作上游,我发现这很有用:NGINX LUA and JSON
这是基本的配置,但给出了一个想法如何做到这一点。