Hello,
On 3/9/2012 9:40 PM, ssc1478 wrote:
It can't find the program so I think it thinks that OH is the program
instead of an argument.
My httpd.conf file has a ScriptAliasMatch to map anything following
PHIL to /qsys.lib/phil.lib:
ScriptAliasMatch ^/PHIL/(.*) /qsys.lib/phil.lib/$1.pgm
Right... you're telling it that everything that follows '/PHIL/' is to 
be placed in $1.  So, this would result in Apache looking for a program 
named:
/qsys.lib/phil.lib/B01/OH.pgm
So, you don't really want it to take everything after "/PHIL/" and make 
it the program name, do you?
My suggestion is to write a "REST service router" program that receives 
the initial control from Apache, then calls the appropriate web service 
that you write. It can parse the program name from the URL.
ScriptAlias /rest /qsys.lib/phil.lib/rest.pgm
Now write a program (named REST.PGM) that reads the URL and parses the 
program name out of it.  This is off the top of my head, and I haven't 
tested it:
uri = %str(getenv('REQUEST_URI'));
monitor;
   keystr = %scan('/rest/': uri) + %len('/rest/');
   nextbit = %scan('/': uri: keystr);
   keyname = %subst(uri: keystr: (nextbit-keystr));
on-error;
   // handle error
endmon;
Now you have a variable named 'keyname'.  That could contain the name of 
the program you want to call, and then you could just call it.  Or if 
you want to be fancy, it could be the key to a database record 
containing info about your RESTful services.  This would be a bit more 
secure (since the caller can't call any arbitrary program on your 
system) and gives you the option to do other useful things, such as 
store the library list for each program in the PF, and set up the 
library list on each call, etc.
So you could do something like this.  (Assuming RESTFILE is your 
database file containing the web services, and it has fields in it named 
RFLIB and RFPGM containing the library/program to call.)
 D myPgmName       s             21a
 D RUNSERVICE      PR                  ExtPgm(myPgmName)
    .
    .
    chain keystr RESTFILE;
    if not %found;
       // handle error
    else;
       // maybe add code here to set up library list?
       myPgmName = %trim(RFLIB) + '/' + %trim(RFPGM);
       RUNPGM(myPgmName);
    endif;
You might want to wrap the whole thing in a MONITOR, too.. and add a 
DSPJOBLOG OUTPUT(*PRINT), etc.  That way, if the web service crashes, 
you can get diagnostics easily, and send a useful message back to the 
caller.
Food for thought...
As an Amazon Associate we earn from qualifying purchases.