Wie kann ich manipulieren, die JSON-body einer POST-Anforderung mit Nginx und Lua?
Ich bin dabei ein proof-of-concept, um zu zeigen, wie wir in die Tat umsetzen können 3scale in unserem stack. In einem Beispiel möchte ich einige POST Anfrage Körper-manipulation erstellen einer API-Fassade, die Karten, was könnte ein legacy-API-format zu einem neuen internen. ZB. etwas ändern wie
{ "foo" : "bar" , "deprecated" : true }
in
{ "FOO" : "bar" }
Den Lua-Modul docs für content_by_lua, die scheint, wie die entsprechende Methode sagen
Nicht mit dieser Richtlinie und anderen content-handler-Richtlinien in der gleichen Lage. Zum Beispiel, dieser Richtlinie und den proxy_pass Richtlinie sollte nicht verwendet werden, die in der gleichen Lage.
Mein Verständnis ist, dass die content_by_lua ist ein content-handler wie proxy_pass, von denen nur eine verwendet werden kann, pro Standort.
Ich glaube nicht, dass es irgendeinen Weg, um zu entfernen proxy_pass als das ist die Grundlage, wie die Proxyfunktion, so ist es möglich, erfassen Sie die Anfrage in einem separaten Ort, verwenden content_by_lua, dann gehen Sie zu dem Speicherort der Umsetzung proxy_pass oder gibt es eine andere Methode, wie rewrite_by_lua welche ist besser geeignet?
Wenn es hilft jemand anderes, habe ich noch folgende Funktion (meine erste bit Lua), die entfernt die user_key
parameter, die 3scale benötigt für die Autorisierung aber ungültig ist für unsere API wenn weitergeleitet auf:
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich schlage vor, Sie verwenden
access_by_lua
in der nginx.conf
im cache.lua-Datei, die Sie tun können, so etwas wie :
Zugabe zu dem, was Prashant bereits erwähnt: wenn Sie laden Sie Ihre Nginx Konfiguration Dateien von 3scale Sie werden feststellen, dass es eine Lua-Datei enthalten. Diese Datei wird bereits als von
access_by_lua_file
.Die Datei wäre meiner Meinung nach der beste Ort, um Ihre Körper-manipulation code. Es wird ausgeführt werden, für jede Anfrage, bevor die
proxy_pass
um Ihre API-server gesendet wird.Auch, diese ist eine wirklich gute, in die Tiefe, blog-Artikel darüber, wie das zu erreichen unterschiedliche transformation von Anfragen mithilfe von Lua-innen Nginx:
access_by_lua_file
wurde bereits genannt.Kürzlich hatte ich zu manipulieren upstream-basierend auf JSON-Wert in der post-Anforderung, und ich fand dies nützlich: NGINX LUA und JSON
Ist es, grundlegende Konfiguration, aber gibt eine Idee, wie es zu tun.