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
InformationsquelleAutor Jesse | 2014-04-01
Schreibe einen Kommentar