> Tech > Apache requêtes et réponses : vue d’ensemble

Apache requêtes et réponses : vue d’ensemble

Tech - Par Renaud ROSSET - Publié le 28 janvier 2014
email

À ce stade, il est intéressant de voir exactement comment les requêtes et les réponses sont traitées côté serveur.

Apache requêtes et réponses : vue d’ensemble

Une requête est envoyée à Apache d’après l’URL spécifiée dans l’option config d’Ext.Ajax.request.

Apache reçoit la requête et détermine sa bibliothèque de destination en fonction du chemin indiqué immédiatement avant le nom du programme. Apache invoque ensuite le programme RPG ORUINTRO de la même manière qu’il serait invoqué à partir de la ligne de commande. Le programme ORUINTRO reçoit le contrôle, lit l’entrée provenant du navigateur, la traite, et finalement produit une réponse qu’Apache relaie vers le client.

La figure 7 montre l’essentiel du programme ORUINTRO. La première action consiste à invoquer la sous-routine initpgm, qui déclenche certaines variables globales et lit l’action. Nous utilisons ensuite une instruction select pour voir quelle action se déroule et nous invoquons une sous-procédure définie localement du même nom : ici, btnNxtPnl1. Enfin, nous invoquons la sous-routine endpgm, qui effectue le même nettoyage et renvoie à Apache la réponse créée dans la sous-procédure btnNxtPnl1. C’est le flux général de la requête ; voyons maintenant chaque portion.

Figure 7 : Code principal RPG

La figure 8 montre la sousroutine initpgm. Il faut noter ici les appels vers json_create() et jsona_create(). Le premier crée un handle vers le message de réponse principal et le second crée un handle vers la matrice uiActn que nous ajouterons aux portions de logique de contrôle et de gestion. J’emploie le terme “handle” parce qu’il est semblable à la manière dont fonctionnent les handles de fichiers IFS, à cela près que ces variables ne sont pas des entiers et sont plutôt déclarées comme pointeurs. La présence de ces pointeurs ne devrait pas trop vous préoccuper, vous vous y habituerez rapidement. Ensuite, http_inStr() est appelé pour charger la requête envoyée à Apache dans une chaîne définie globalement nommée gIn.stdIn. Cela s’appelle “lire à partir d’une entrée standard = reading from standard input,” ce qui signifie tout simplement que nous utilisons une API fournie par IBM en coulisses pour extraire la requête complète. La variable gIn.stdIn contient maintenant la valeur &action=btnNxtPnl1. Au fur et à mesure que vos panneaux Ext JS deviennent plus complexes avec davantage de champs d’entrée, vous verrez beaucoup plus de depaires nom-valeur dans gIn.stdIn.

Figure 8 : Sous-routine initpgm RPG

La dernière ligne utilise http_getCgiVal() pour obtenir “l’action” provenant de la variable gIn.stdIn. Il existe beaucoup d’autres sous-procédures http_* permettant d’accéder à divers types de données. Par exemple, http_ getCgiNbr() renverra un type de donnée numérique plutôt qu’une chaîne, ce qui vous épargnera la conversion.

À ce stade, la variable gIn.action a une valeur btn- NxtPnl1. Quand nous revenons à l’instruction select dans le corps du programme, la sous-procédure locale btnNxtPnl1() correspondante est invoquée. Vous pourriez bien sûr utiliser une sous-routine, mais je préfère des sous-procédures pour pouvoir utiliser des variables locales si la sous-procédure les justifie.

La figure 9 montre la sous-procédure btnNxtPnl1() complète qui inclut deux appels vers la sous-procédure locale uiactn(), que montre la figure 10. Pour l’essentiel, nous voulons ajouter deux éléments à la matrice JSON uiActn : un pour cacher pnl1 et un pour montrer pnl2. Vous vous souvenez que nous avons initialisé gJuiactnArray dans la sous-routine initpgm. HIDE et SHOW sont définis comme des constantes globales pour faciliter leur spécification. uiactn() nous économise trois lignes de code chaque fois que nous voulons relayer une action vers Ext JS. Et voilà, c’est tout le code dont vous avez besoin pour passer d’un panneau au suivant !

Figure 9 : Sous-procédure btnNxtPnl1 RPG

Figure 10 : Sous-procédure uiActnRPG

La dernière portion du programme qui conclut l’ensemble des requêtes et réponses du début à la fin, consiste à invoquer la sous-routine endpgm, que montre la figure 11. Tout d’abord, le gMsgTxt global est placé au niveau supérieur de la réponse JSON, en l’ajoutant à gJRsp avec un appel vers json_putString(). Ensuite, nous ajoutons gJuiActnArry à gJRsp et le nommons uiActn. (Revenez à la figure 4 pour voir à quoi ressemblera la chaîne JSON résultante.)

Figure 11 : Sous-routine endpgm RPG

La dernière chose à faire est d’écrire au client la réponse qui est stockée en mémoire. Comme nous communiquons  avec HTTP, nous devons suivre ses règles. Nous devons d’abord indiquer le “Content-Type” de notre réponse, suivi de deux interlignes, puis transmettre le contenu que nous voulons délivrer à Ext JS. Nous obtenons le contenu en invoquant json_toString() et en le passant au gJRsp de niveau supérieur ; il est immédiatement passé à http_outPtr(). Enfin, nous faisons un peu de nettoyage avec un appel à json_dispose() pour être certain de ne pas créer des fuites de mémoire.

À ce stade, l’utilisateur voit pnl2 avec un nouvel  ensemble de boutons à actionner. Si on clique dessus, ces boutons enverront une autre requête au programme RPG pour traiter cette identification de bouton spécifique. Il n’y a rien de vraiment nouveau dans pnl2, donc nous allons passer à pnl3, qui a d’autres champs form définis (voir la figure 12). Vous remarquerez que pnl3 était déjà occupé par des données quand il a été affiché.

Figure 12 : Panneau Enter Data Ext JS

Il en est ainsi parce que quand l’utilisateur a sélectionné le bouton btnNxt- Pnl2, il a invoqué la sous-procédure RPG côté serveur correspondante, btnNxtPnl2, que montre la figure 13, et a utilisé json_putString() et json_putInt() pour occuper la réponse JSON qui a été ensuite traitée par la méthode JavaScript uiactn() sur le client. Les noms NAM, CRDCD, DOB, AGE et TIMESTAMP utilisés correspondent directement aux noms Ext JS dans pnl3. La figure 13 montre aussi la sous-procédure btnStayPnl3, qui a été créée pour montrer un exemple de ce qui se passe quand on reste sur un panneau après une interaction utilisateur et qu’on change le contenu des composants du panneau. Dans ce cas, nous vérifions la nature du code crédit et nous transmettons un message au client s’il est “Horrible.”

Figure 13 : Sous-procédures btnNxtPnl2 et btnStayPnl3 RPG

La pointe de l’iceberg

On le voit, le tandem Ext JS / OpenRPGUI est très prometteur pour les programmeurs RPG souhaitant moderniser leurs applications. L’équipe OpenRPGUI, d’esprit très communautaire, ne constitue que la pointe de l’iceberg quant à notre ambition avec ces outils. Nous avons beaucoup d’idées pour rendre tout cela encore plus efficace. Comme pour toute démarche de modernisation, il y a une courbe d’apprentissage. Mais c’est la plus courte que j’ai trouvée à ce jour, parce que beaucoup est fourni en standard, et que le concept de communication avec un panneau prédéfini correspond à ma philosophie applicative. Pour plus d’informations, consultez la page de support OpenRPGUI (openrpgui. com/support), où vous trouverez un lien vers le forum SourceForge officiel pour OpenRPGUI.

Téléchargez cette ressource

Sécuriser votre système d’impression

Sécuriser votre système d’impression

Longtemps sous-estimée, la sécurisation d’un système d’impression d’entreprise doit être pleinement prise en compte afin de limiter le risque de fuite d’informations sensibles. Voici les 3 principales précautions à prendre.

Tech - Par Renaud ROSSET - Publié le 28 janvier 2014