Good afternoon All,
I as able to progress from my previous question:
How to implement the RESTful API with a mixed set of *ENTRY parameter list | IBM iI updated the *ENTRY PLIST of our APIs so it will define the individual parameters rather than 1 big string. Now i am able to expose our RPGLE APIs as RESTful endpoints via IWS. Below is the PCML generated for reference:
<pcml version="6.0">
<!-- RPG program: R_H15ARR -->
<!-- created: 2022-11-07-18.18.06 -->
<!-- source: JAWILIJ1/QRPGLESRC(R_H15ARR) -->
<!-- 52908 -->
<struct name="DSAIMR">
<data name="R_GZWSID" type="char" length="4" usage="inherit" />
<data name="R_GZDIM" type="zoned" length="2" precision="0" usage="inherit" />
<data name="R_GZTIM" type="zoned" length="6" precision="0" usage="inherit" />
<data name="R_GZSEQ" type="packed" length="7" precision="0" usage="inherit" />
<data name="R_GZIMG" type="char" length="1" usage="inherit" />
<data name="R_GZAB" type="char" length="4" usage="inherit" />
<data name="R_GZAN" type="char" length="6" usage="inherit" />
<data name="R_GZAS" type="char" length="3" usage="inherit" />
<data name="R_GZBRNM" type="char" length="4" usage="inherit" />
<data name="R_GZPBR" type="char" length="5" usage="inherit" />
<data name="R_GZPSQ" type="packed" length="5" precision="0" usage="inherit" />
<data name="R_GZVFR" type="zoned" length="7" precision="0" usage="inherit" />
<data name="R_GZBRND" type="char" length="4" usage="inherit" />
<data name="R_GZDRF" type="char" length="16" usage="inherit" />
<data name="R_GZAMA" type="packed" length="15" precision="0" usage="inherit" />
<data name="R_GZAPP" type="char" length="2" usage="inherit" />
<data name="R_GZTCD" type="char" length="3" usage="inherit" />
<data name="R_GZCCY" type="char" length="3" usage="inherit" />
<data name="R_GZSRC" type="char" length="2" usage="inherit" />
<data name="R_GZUC1" type="char" length="3" usage="inherit" />
<data name="R_GZUC2" type="char" length="3" usage="inherit" />
<data name="R_GZNPE" type="packed" length="5" precision="0" usage="inherit" />
<data name="R_GZNR1" type="char" length="35" usage="inherit" />
<data name="R_GZNR2" type="char" length="35" usage="inherit" />
<data name="R_GZNR3" type="char" length="35" usage="inherit" />
<data name="R_GZNR4" type="char" length="35" usage="inherit" />
<data name="R_GZRFR" type="char" length="1" usage="inherit" />
<data name="R_GZAUT" type="char" length="1" usage="inherit" />
<data name="R_GZSSI" type="char" length="1" usage="inherit" />
<data name="R_GZFRV" type="char" length="1" usage="inherit" />
<data name="R_GZTTP" type="char" length="1" usage="inherit" />
<data name="R_GZHSRL" type="char" length="16" usage="inherit" />
<data name="R_GZHAMT" type="packed" length="15" precision="0" usage="inherit" />
<data name="R_GZAUTC" type="char" length="12" usage="inherit" />
<data name="R_GZCED" type="char" length="1" usage="inherit" />
<data name="R_GZCHQ" type="char" length="1" usage="inherit" />
<data name="R_GZDRFN" type="packed" length="16" precision="0" usage="inherit" />
<data name="R_GZINW" type="char" length="1" usage="inherit" />
<data name="R_GZRAU" type="char" length="1" usage="inherit" />
<data name="R_GZEMN1" type="char" length="4" usage="inherit" />
<data name="R_GZRAU1" type="char" length="1" usage="inherit" />
<data name="R_GZEMN2" type="char" length="4" usage="inherit" />
<data name="R_GZRAU2" type="char" length="1" usage="inherit" />
<data name="R_GZEMN3" type="char" length="4" usage="inherit" />
<data name="R_GZRAU3" type="char" length="1" usage="inherit" />
<data name="R_GZEMN4" type="char" length="4" usage="inherit" />
<data name="R_GZRAU4" type="char" length="1" usage="inherit" />
<data name="R_GZMCH" type="char" length="1" usage="inherit" />
<data name="R_GZTCCY" type="char" length="3" usage="inherit" />
<data name="R_GZTAMA" type="packed" length="15" precision="0" usage="inherit" />
<data name="R_GZTCED" type="char" length="1" usage="inherit" />
<data name="R_GZHCCY" type="char" length="3" usage="inherit" />
<data name="R_GZEAN" type="char" length="20" usage="inherit" />
<data name="R_GZGDP" type="char" length="1" usage="inherit" />
<data name="R_GZPSQ7" type="packed" length="7" precision="0" usage="inherit" />
</struct>
<program name="R_H15ARR" path="/QSYS.LIB/QTEMP.LIB/R_H15ARR.PGM">
<data name="#ZWSID" type="char" length="4" usage="inputoutput" />
<data name="#ZDIM" type="packed" length="2" precision="0" usage="inputoutput" />
<data name="#ZTIM" type="packed" length="6" precision="0" usage="inputoutput" />
<data name="#ZSEQ" type="packed" length="7" precision="0" usage="inputoutput" />
<data name="GZJTT" type="char" length="1" usage="inputoutput" />
<data name="@LIB" type="char" length="10" usage="inputoutput" />
<data name="@VALD" type="char" length="1" usage="inputoutput" />
<data name="@PGM" type="char" length="10" usage="inputoutput" />
<data name="DSAIMR" type="struct" struct="DSAIMR" usage="inputoutput" />
<data name="GZREC" type="char" length="1" usage="inputoutput" />
<data name="GZMES7" type="char" length="37" usage="inputoutput" />
<data name="AOW" type="char" length="37" count="20" usage="inputoutput" />
<data name="@EM" type="char" length="37" count="20" usage="inputoutput" />
<data name="@AEXT" type="char" length="1" usage="inputoutput" />
<data name="@AREC" type="char" length="1" usage="inputoutput" />
<data name="@EMH" type="char" length="37" count="20" usage="inputoutput" />
<data name="@EA" type="packed" length="15" precision="0" count="20" usage="inputoutput" />
<data name="@EB" type="char" length="4" count="20" usage="inputoutput" />
<data name="@DR" type="char" length="1" count="20" usage="inputoutput" />
</program>
</pcml>
I am now able to do a POST using the RESTFul endpoint generated from the above PCML. However as you can imagine, the request body contains every single parameter, many of which are actually optional (refer to DSAIMR struct above, so many fields included by default). Am thinking
1. do i need some sort of API manager to "hide" some of the fields, default some of the fields so that the REST endpoint is more "end user friendly" with only the bare minimum required fields, or to orchestrate / combine the RESTful API endpoints into a composite or semantic type of API? Is this the proper architectural pattern for managing the RPGLE RESTful API endpoints from IWS?
2. For your RESTful RPGLE API endpoints what do you use in your applications for managing the endpoints, and for things like security token based authentication?
3. our clients deploy our software on prem, not cloud based, and 3rd party banking applications that might use these RPGLE RESTful endpoints are likely deployed on prem as well, things like Tellering systems, Party systems, Cash Management etc. So im thinking if the answer to 1 is yes, then for performance considerations, i will need the API manager to be deployed on premise as well rather than cloud based like Azure/Mulesoft/AWS etc.
Your inputs are much appreciated. Thanks!
------------------------------
[Joel]
------------------------------