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
Vous devez vous connecter pour publier un commentaire.
Je vous suggère d'utiliser
access_by_lua
dans nginx.conf
dans le cache.fichier lua, vous pouvez faire quelque chose comme :
OriginalL'auteur Prashant Gaur
En ajoutant à ce que Prashant déjà mentionné: lorsque vous téléchargez vos fichiers de configuration de Nginx de 3scale vous remarquerez qu'il y a un fichier Lua inclus. Ce fichier est déjà appelé à partir d'
access_by_lua_file
.Ce fichier serait à mon avis le meilleur endroit pour ajouter votre corps de manipulation de code. Il sera exécuté pour chaque demande avant le
proxy_pass
à votre serveur d'API est envoyé.Aussi, cette est vraiment un bon en profondeur l'article du blog sur la façon d'accomplir différents de transformation de vos demandes à l'aide de Lua à l'intérieur de Nginx:
access_by_lua_file
a déjà été appelé.OriginalL'auteur vdg
Récemment, j'ai eu à manipuler en amont basée sur la valeur JSON dans une requête post et j'ai trouvé cela utile: NGINX LUA et JSON
C'est la configuration de base, mais donne une idée de comment le faire.
OriginalL'auteur Dimitar Atanasov