Chris Malek is a PeopleTools® Technical Consultant with two decades of experience working on PeopleSoft enterprise software projects. He is available for consulting engagements.
About Chris Work with ChrisIntroducing a small but powerful PeopleSoft bolt-on that makes web services very easy. If you have a SQL statement, you can turn that into a web service in PeopleSoft in a few minutes.
This section will show a simple example of using the HttpListeningHandler
to post to PeopleSoft using a synchronous service operation. This is the request/reply paradigm where code is run in response to in inbound message.
In this article:
First let’s setup the PeopleSoft side.
Now we need a PeopleSoft message object that will represent the XML that the client program will post.
Message Attribute | Value |
---|---|
Name | CHG_GENERIC |
Version | V1 |
Type | Nonrowset-based |
In this example, we create a new service. You can easily re-use another service if you wish.
Service Attribute | Value |
---|---|
Name | CHG_TEST_SYNC |
Now we need to create some PeopleCode that will run when a new message is posted to the integration broker for this Service Operation.
CHG_SYNC_TEST:syncTest
import PS_PT:Integration:IRequestHandler;
class syncTest implements PS_PT:Integration:IRequestHandler
method onRequest(&MSG As Message) Returns Message;
end-class;
method onRequest
/+ &MSG as Message +/
/+ Returns Message +/
/+ Extends/implements PS_PT:Integration:IRequestHandler.OnRequest +/
Local XmlDoc &xmlDocFromPython;
Local XmlNode &requestRootNode;
&xmlDocFromPython = &MSG.GetXmlDoc();
&requestRootNode = &xmlDocFromPython.DocumentElement;
/* Setup response xml body */
Local Message &response;
&response = CreateMessage(Operation.CHG_SYNC_TEST, %IntBroker_Response);
Local XmlDoc &xmlout;
Local XmlNode &childNode;
&xmlout = CreateXmlDoc("<?xml version='1.0'?><response/>");
Evaluate Lower(&requestRootNode.NodeName)
When = "helloworld"
&childNode = &xmlout.DocumentElement.AddElement("helloworld").AddText("Hello client");
Break;
When = "activeusercount"
Local integer &ucount;
SQLExec("SELECT COUNT(*) FROM PSOPRDEFN WHERE ACCTLOCK = 0 ", &ucount);
&childNode = &xmlout.DocumentElement.AddElement("activeusercount").AddText(String(&ucount));
Break;
When-Other
&childNode = &xmlout.DocumentElement.AddElement("error").AddText("I do not understand. Please try again. You submitted: " | &requestRootNode.NodeName);
Break;
End-Evaluate;
&response.SetXmlDoc(&xmlout);
Return &response;
end-method;
OnRequest
method.This will probably make a little more sense later in the article when we look at the request and response from the Python client.
Now we need to set up the actual Service Operation. There are several steps here.
Service Operation Attribute | Value |
---|---|
Name | CHG_SYNC_TEST |
Type | Synchronous |
Version | V1 |
Active | Checked |
Message Version | CHG_TEST.V1 |
Queue Name | IB_EXAMPLES (or create a new queue ) |
Now we need to hook the CHG_I_TESTER:syncTester
application class to execute when a service operation is posted. We do this on the Handler tab of the Service Operation.
Service Operation Handler Attribute | Value |
---|---|
Handler Name | Test (This value will be over written by peoplecode) |
Handler Type | OnRequest |
Implementation | Application Class |
Description | Tester |
Package Name | CHG_I_TESTER |
Path | : |
Class ID | syncTest |
Method | OnRequest |
Now we need to setup the routing to make this node able to send Service Operations.
Service Operation Routing Attribute | Value |
---|---|
routing name | CHG_IN_SYNC_TEST |
sender node | CHG_TEST_NODE |
Receiver Node | PSFT_CS (or whatever your default local node is ) |
External Alias | CHG_SYNC_TEST.V1 |
Active | Checked |
Now our PeopleTools system should be ready to receive messages from some HTTP client.
We are going to document the web service call in HTTP syntax as it is language agnostic.
POST https://ib.cedarhilllsgroup.com/PSIGW/HttpListeningConnector HTTP/1.1
OperationName: CHG_SYNC_TEST.v1
Content-Type: text/xml
From: CHG_TEST_NODE
To: PSFT_CS
Password: vase-lawless-realty
Accept: */*
accept-encoding: gzip, deflate
content-length: 35
<?xml version="1.0"?> <helloworld/>
Response:
HTTP/1.1 200 OK
status: 200
Date: Tue, 26 Feb 2019 18:54:12 GMT
Content-Length: 81
Content-Type: text/xml; charset=UTF-8
TransactionID: e837d6b8-39f7-11e9-bcb4-fb3330b2eab1
<?xml version="1.0"?> <response><helloworld>Hello client</helloworld></response>
The handler can also run a different branch if the payload XML has a <activeusercount/>
root node. Here is that example
POST https://ib.cedarhilllsgroup.com/PSIGW/HttpListeningConnector HTTP/1.1
OperationName: CHG_SYNC_TEST.v1
Content-Type: text/xml
From: CHG_TEST_NODE
To: PSFT_CS
Password: vase-lawless-realty
Accept: */*
accept-encoding: gzip, deflate
content-length: 40
<?xml version="1.0"?> <activeusercount/>
Response:
HTTP/1.1 200 OK
status: 200
Date: Tue, 26 Feb 2019 18:57:17 GMT
Content-Length: 80
Content-Type: text/xml; charset=UTF-8
TransactionID: 5686417f-39f8-11e9-bcb4-fb3330b2eab1
<?xml version="1.0"?> <response><activeusercount>6</activeusercount></response>
So what did we learn? We learned that you can pretty much submit any XML to a synchronous Service Operation and have it respond to what was submitted. Of course, the functionality presented here is completely useless. You can extrapolate the example here to do whatever. The Python client could be sending in actual data in the XML. The PeopleCode could actually parse the data and update something in PeopleSoft and return a response. It is up to the two systems to agree upon an XML format to exchange.