Comment puis-je manipuler du JSON corps d'une requête POST à l'aide de Nginx et Lua?

Je suis en train de faire une preuve de concept pour montrer comment nous pourrions mettre en œuvre 3scale dans notre pile. Dans un exemple je veux faire un POST demande corps manipulation pour créer une API de façade que les cartes de ce qui pourrait être un héritage de l'API de format pour une nouvelle interne. Par exemple. modifier quelque chose comme

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

en

{ "FOO" : "bar" }

La Lua module docs pour content_by_lua, ce qui semble être la méthode appropriée dire

Ne pas utiliser de la présente directive et d'autres gestionnaire de contenu des directives dans le même emplacement. Par exemple, la présente directive et de la proxy_pass directive ne doit pas être utilisé dans le même emplacement.

Ma compréhension est que le content_by_lua est un gestionnaire de contenu comme proxy_pass, dont un seul peut être utilisé par emplacement.

Je ne pense pas qu'il y a moyen de supprimer proxy_pass que c'est la base de la façon dont la transmission par proxy fonctionne, donc est-il possible de capture de la demande dans un autre emplacement, utilisez content_by_lua, puis passer à l'emplacement de la mise en œuvre de proxy_pass ou est-il une autre méthode comme rewrite_by_lua lequel est le plus approprié?


Si ça aide quelqu'un d'autre, j'ai ajouté la fonction suivante (mon premier peu de Lua) qui supprime les user_key paramètre qui 3scale nécessite une autorisation, mais n'est pas valide pour notre API si transmis sur:

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

OriginalL'auteur Jesse | 2014-04-01