Thursday, September 23, 2010

Going Mobile with PeopleSoft

Chapter 14 of my PeopleTools Tips & Techniques book walks you step-by-step through creating a mobile application. That chapter uses a CI based web service and Oracle ADF to demonstrate some of the simple drag-and-drop tools provided by Oracle. Even though the technique demonstrated appears simple, if you start to dig into the generated code and try to work directly with the Web Service Data Control, you will quickly see that JDeveloper does a very, very good job of hiding the real complexities behind web services. For this year's OpenWorld, I wanted to show just how simple it could be to create a mobile app for PeopleSoft. For my prototype, I chose to build a mobile worklist out of plain HTML, JavaScript, and CSS (it seems to me that plain HTML, JavaScript, and CSS is about as simple as web development gets). Without a server side technology like JDeveloper's ADF and JSF, I knew my mobile app would have to communicate with PeopleSoft using Ajax. As it turns out, most modern mobile browsers support XHR (as of BlackBerry 6, Torch, the BlackBerry browser is now WebKit - YEAH!!!), but I knew having a good mobile JavaScript library like jQuery would certainly help. A quick google search turned up xuijs, which happens to be modeled after jQuery. Using jEdit, my favorite syntax highlighting text editor, I prototyped the user interface, substituting Ajax URL's for local text files. After ironing out the server side requirements, I set about creating the Integration Broker App Class synchronous request handlers that my app would require. To make my HTML and JavaScript as simple as possible, I wrote my handlers to return data in JSON and JSONP format. While my JavaScript and PeopleCode may prove to be of some interest to you, I believe the most important concept from this exercise is the mechanism for calling Integration Broker from Ajax. To execute a web service from an HTTP GET (basic Ajax in REST-like fashion), you use a URL similar to:

http://your.peoplesoft.server/PSIGW/HttpListeningConnector?Operation=YOUR_OPERATION_NAME.v1&OperationType=Sync

Calling any service operation implies, of course, that you have a message, service, service operation, handler, and an any-to-local routing.

My point for sharing this is that we easily forget how simple an application can be. PeopleTools provides the integration architecture. It is up to us to pick a language we are comfortable developing with. If your organization prefers .Net over Java, then write your web based mobile app in .Net. The language doesn't matter. Pretty much any language can make an HTTP request to the Integration Broker and then process the response. The keys are:

  • Knowing how to call Integration Broker
  • Remembering that the mobile device has a much smaller screen

That is about all there is to building mobile applications. Pretty simple... right?

113 comments:

Sana Khan said...
This comment has been removed by a blog administrator.
Jim Marion said...

@Arshad, thank you for your kind words. I appreciate the feedback.

Jeromy McMahon said...

Jim, I just got your book today and it is nicely done! Great job! Sorry I didn't get a chance to go to OOW to meet up this year. Are you also planning on presenting at Alliance HEUG?

Jim Marion said...

Thank you Jeromy. I plan to present at Alliance this year. The HEUG board will be reviewing Oracle sessions this month. Alliance is one of my favorite conferences.

Anonymous said...

sorry i have not read your chapter 13 of mobile applications so would you like to share with us again sir kindly .....

Mobile prices in Karachi

Helping People Succeed said...

I have purchased the book and seems to well written and started playing with the mobile chapter.

However - I am unable to connect to IB thru URL..

Here is the error message..There is no node named PSADMIN and I have given CI, web service permission to node user..Any idea

-

-
-
- <![CDATA[ PSADMIN

Jim Marion said...

Unfortunately, your full error message didn't come through. PSADMIN is a user that is in the dev/QA systems at Oracle, but doesn't exist in the released system. Open your WSDL node and ANONYMOUS nodes. One of them likely has PSADMIN set as the default user in the nodes general information.

Thank you for the compliments regarding the book!

Helping People Succeed said...

Please see below for error message..
There is no user by name PSADMIN. I also tried by creating a user name PSADMIN..
--


-
-
-
SOAP-ENV:Server
null
-
-
Integration Broker Response
20
55
-
-

-
-
-

Jim Marion said...

@Helping, you are correct, there is no user named PSADMIN. What you need to do is open your WSDL node definition and Anonymous node definitions and set the default user ID to something other than PSADMIN. PeopleTools installs and upgrades set the default user to PSADMIN even though that user does NOT exist.

Unknown said...

hello Jim,

one question ,do u have any idea to call Service Operation using KSOAP API.
currently i am able to call using httppost and get directly.


Thanks in advace!!!
Madan Honap
PeopleSoft Project Lead
Bangalre

Jim Marion said...

@Madan, I was not aware of the kSOAP project. Thank you for pointing it out. Unfortunately for you, this means I don't have any examples for kSOAP.

42N-71W said...

Hi Jim! I follow your blogs big time.. If you get a chance, could you please let me know how to pass parameters to the IB peoplecode when I invoke the service using http://your.peoplesoft.server/PSIGW/HttpListeningConnector?Operation=YOUR_OPERATION_NAME.v1&OperationType=Sync

Can I append &emplid=100 in the above URL? If so, how do I access that emplid parameter in the IB peoplecode.

Thanks in Advance

Jim Marion said...

@42N-71W, Yes, just append &emplid=123, etc to your URL. In your request handler, it is a bit difficult to get query string parameters. I wrapped the code in an app class so I don't have to copy it to each handler, but essentially, here it is:

Function GetQSArg(&IBConnectorInfo as IBConnectorInfo, &parameterName as string) returns string
Local number &qsIndex = 0;

For &qsIndex = 1 To &connectorInfo.GetNumberOfQueryStringArgs()
If (&connectorInfo.GetQueryStringArgName(&qsIndex) = &parameterName) Then
Return &connectorInfo.GetQueryStringArgValue(&qsIndex);
End-If;
End-For;
End-Function;

Then call it like:

Local string &value = GetQSArg(&MSG.IBInfo.IBConnectorInfo, "emplid);

42N-71W said...

Wow - can't get any better. Worked like a charm. Thanks a lot. Oh btw, did I tell you that I have bought your book.. very informative..

Jim Marion said...

@42N-71W, I am glad you have the book. I have received a lot of good feedback. People have found the book very useful.

Sumit Agarwal said...

Jim,

I plan to do mobile application for personal data as you have in book .At last when I deploy application I got below error. I will really appreciate any help.

1.- javax.xml.soap.SOAPException: Message send failed: Connection refused: connect
2.- Message send failed: Connection refused: connect
3.- Connection refused: connect

Thanks
Sum

Jim Marion said...

@Sumit, connection refused sounds like your JDeveloper was not able to connect to your PeopleSoft instance. Do you have a proxy server or anything between you and PeopleSoft? Does your company have an authenticating web server/load balancer in front of your PeopleSoft instance for "SSO"?

Basically, it sounds like a network issue. To verify this, I usually launch Wireshark. Wireshark is a local packet sniffer. It will show you all the HTTP traffic between you and your Integration Broker. I suggest you study a little bit on Wireshark filters so you can filter for HTTP traffic just between you and your PeopleSoft instance.

Helping People Succeed said...

Hi Jim,

Can you please send some pointers of how to get non key values to a JSF page? (e.g. email address)

Could no find a good way on Trinidad components?

Jim Marion said...

@Helping, I don't have a lot of experience in this area. If you are using a CI based web service, then everything is available from the result, just not on the GET/FIND. From a FIND, you get key values, after Find, you call GET. The GET returns all the actual transaction values. I think this is what you want.

Helping People Succeed said...

Thanks. Are you planning for presentation any time soon?. I would like to meet you.

Anyways - what would be the best way to authenticate mobile users against peoplesoft database?
basically - I would like to have the peoplesoft userid (oprid) for mobile app.

Jim Marion said...

@Helping, it would be a pleasure to meet you as well. I usually speak at OpenWorld, Alliance, and Collaborate. Each year is different, though, and I won't know about the 2012 conference schedule for several months. When I find out, I'll be sure to post my schedule.

For mobile authentication, there are a couple of ways, and it really depends on your client technology (JavaScript/Ajax versus Web Services). For web services, you can use the ws-security authentication methods. If you aren't using web services, then you can submit the PeopleSoft OPRID and password (over SSL, of course) to your integration broker, and have a service operation handler call SwitchUser to authenticate the user. Once you've done that, you can return the %AuthenticationToken and then, for every future call, just submit the token.

Helping People Succeed said...

Jim - your knowledge and contribution to the community is immeasurable..

Greatly appreciate your responses!!!

Please let me know if there is way to meet you earlier..
Best

Anonymous said...

Jim, i am very impressed with your blog. This is very informative blog. I am planning to buy your book. Can you let me know if the suggested method for ps mobile will work thru EAI(client uses GIS as EAI)?

Jim Marion said...

@sunitha, unfortunately, I'm not familiar with EAI.

Anonymous said...

Jim, I purchased your book. Its well written. My client wants to approve epro requisition thru mobile phones. The client uses Gentran Integration suite(GIS)for EDI and Enterprise Application Integration (EAI) with 3rd party systems. So i am not able to understand how to work thru GIS to create the mobile app. I understood the part to create integration from PS and providing webservices. I highly appreciate your feedback. Thanks in advance.

Jim Marion said...

@Sunitha, I see. Since PeopleSoft does not yet offer mobile, you have to create your mobile application using an alternative language (Java, HTML/JavaScript, Ruby, .Net, etc). My favorite is jQuery Mobile JavaScript/HTML. With this approach, I place my mobile JavaScript/HTML on a web server (like apache httpd), and then reverse proxy Integration Broker into the same domain for AJAX.

Since you are using Gentran, you would write your mobile UI to communicate with Gentran, and then Gentran would communicate with Integration Broker.

Ganesh said...

Hi Jim,

I need to send message to Apple notification server - in JSON format and with SSL Certificate.

can you give some ideas about how can we achieve this.

-Ganesh

Jim Marion said...

@Ganesh, I have not worked with the Apple notification server. It sounds like you would use %IntBroker.ConnectorRequestURL to send an HTTPS request to your apple notification server. The service operation would be based on an unstructured message (like IB_GENERIC). Embed your JSON in a data element with the psnonxml="yes" attribute. Search PeopleBooks for psnonxml for an example.

Sankhara Buddha said...

Hi Jim,

Had been following your blog ever since I started working in PS and no wonder I didn't take a moment's time to grab the book that you wrote on PS.

Now coming to the problem that I am facing. I was working on exposing PS to a hand held device and for that I am taking aid of Chapter 14 of your book. I have generated the wsdl and now when I run the wsdl link I get the same error message which you have documented in the book. I understand that I have to correct it with a valid user from psoprdefn table. But I am not able to identify how do I correct the userid in that file. I am yet to identify the place where this wsdl file is located in the PS server? Your help will he greatly appreciated.

THanks
Indraneel.

Jim Marion said...

@Sankhara Buddha, the OPRID is actually stored in the node definition, not in the WSDL. PeopleTools > Integration Broker > Integration Setup > Nodes (I think that is the location -- I'm not in front of a system right now). I believe you want to look up the ANONYMOUS node. If there is a WSDL node, check that as well.

Sankhara Buddha said...

I am immensely thankful to you.

Thanks
Indraneel.

Jim Marion said...

@Sankhara Buddha, it is no problem. Did that solve your issue?

Jami said...

First, love your book!!!
Second, we are having issues with Message Schemas that have an array within an array. I can edit the Fault Message Schemas and get around the problem. But.. Now I am editing a Message Schema for a Response and get the following error:

Schema validation failed for request message RECV_PO_G_GET_REQUEST, message version V1. (119,40)

I am adding the following line:



As shown below:











Please let me know if you have a work around.

Thanks,
Jami

Jim Marion said...

@Jami, it looks like the details of your post were lost by blogger. Did you use XML tags in your post? Unfortunately, it doesn't like tags other than basic a, b, u, and i.

I think I am outstanding with XSL and XML, but when it comes to WSDL and schemas... well, I try to avoid them.

Repost your details and I'll see if I can give you any advice. You also might want to try the PeopleTools OTN forum or the PeopleTools ITToolBox list.

Thank you for the compliment on the book. I am very pleased that you like it.

Jami said...

Hi Jim, Thanks for the quick response. Basically, I need to add a line to a PS Message response to solve the problem. However PS doesn't seem to like it. Do you know if it is possible to edit the Message Request without causing any issues in PS? Below is what I am trying to add.

I am adding the following line:

xsd:attribute name="XmlSerializerFix" type="xsd:string" /

As shown below:

xsd:complexType name="STAGED_INF_INV2ComplexTypeShape"
xsd:sequence
xsd:element minOccurs="0" maxOccurs="unbounded" name="STGCOST_INF_INV" type="STGCOST_INF_INVComplexTypeShape" /
/xsd:sequence
xsd:attribute name="XmlSerializerFix" type="xsd:string" /
/xsd:complexType

The problem and solution is discussed here:
http://geekswithblogs.net/DavidBarrett/archive/2008/06/25/wcf-system.invalidoperationexception-unable-to-generate-a-temporary-class-result1.aspx

And this works great in the Fault Messages but PS doesn't seem to like it when I add it to a Message Response.

Helping People Succeed said...

Can you please suggest a good resource/book on jQuery mobile?
(basics + advanced..XML parsing etc)

Helping People Succeed said...

Hi Jim,
While creating webservice data control in jdevloper (from WSDL),
I get the following error message:
The WSDL open fine in browser..
Really stuck..
"
JBO-29114 ADFContext is not setup to process messages for
this exception. Use the exception stack trace and error code to
investigate the root cause of this exception. Toot cause error code is DCA-29000"

Jim Marion said...

@Helping People Succeed

A. I haven't read any jQuery Mobile books. jQuery mobile is relatively new. I just had to work through the examples, etc on their site.

B. I'm not sure what is causing your error, but here is where I start with troubleshooting:

1. Download fiddler

2. Setup JDeveloper to use Fiddler as the proxy

3. Rerun your case and look at the information in fiddler.

Another tool I use to debug this is Wireshark. Wireshark is great because you don't have to configure anything, you just turn it on. Fiddler has to be configured, but is much easier to read HTTP responses.

Helping People Succeed said...

You are the best!!!
Fiddler helped..
One of the routing for service operation ib_utility was inactive..

Giri said...

Jim,

DO u have any docmentation for messaging(SMS) from peoplesoft

Thanks
Giri

Jim Marion said...

@Giri, if you know the recipients carrier, then you can SMS by sending an e-mail to the recipients carrier specific e-mail address. For example, Verizon uses the vtext.com e-mail address, so you send a message to the phone number@vtext.com. The other way is to use an SMS gateway.

Sankhara Buddha said...

Hello Jim,

For sometime I had been constantly working on web services and I have got a few things resolved with you aide. I am thankful to you for that... :) And now, I am challenged again and I seek your help for a possible solutions.

Like in case of a CI we can do insertitem and deleteitem, is there a way we can do something similar in CI-based-web-services. I use the PS delivered Genrerate SOAP template tester and there I couldn't possibly identify anything which could be used in deleting or inserting.

Thanks
Indraneel

Jim Marion said...

@Sankhara, I know what you are saying. I am not aware of any InsertItem in CI based web services. I believe the InsertItem method is for CI collections (levels 1+, not level 0). I believe the way to add more items is to send the entire buffer including old and new rows. Basically, to send all the data.

Sankhara Buddha said...

Hello Jim,

I think I can handle the insert option by invoking the create method of the web service. All that the external system has to do is to keep a marker for the kind of activities that are being done by the user (for example, an update or an insert or a delete). If a user clicks on the insert item of the external system then the create method of the web service can be called. I am yet to test this option out. But, hoping it would work. Now the big question is hovering on how to handle the deletion. Could you think of any round about way?

Also I think this is a major gap or loop hole in the usage of web services. Oracle must take this up and consider this in the future tools release. What say?

Please provide some inputs. Your ideas will be a great reliever.

Thanks
Indraneel.

Jim Marion said...

@Sankhara, I have hit the delete issue before. You should put in an enhancement request for it.

Danielle said...

Jim,
Great Blog.
I am looking into using the recently delivered web service for student enrollment. I have review your SwitchUser to get the authentication token and I have gotten that to work with the delivered authentication web service scc_userreg_authenticate.
However the enrollment web service require a userid and password in the soap header. Can the token be passed via the soap header
Here is a sample the the peoplesoft soap tester





PTDMO
PTDMO





XYZ
XYZ
XYZ
XYZ
XYZ

Jim Marion said...

@Danielle, Integration broker supports either username/password or PIA token (PS_TOKEN). User name and password are well documented. What I don't know is how you specify a token. You might try posting the question on the OTN Forum. Another option is to enter a global support ticket.

This is something I will dig into at some point, just haven't yet.

Danielle said...

Jim,
Just an FYI
I did contact global support about using the pstoken in the soap header and this is the response

Would it be possible to to harness sso credentials (pass PS_TOKEN as the usernametoken password?) with ws-security user to extend single sign on to web service calls?
No. We never use webservice to do SSO. PSTOKEN is not WSS standard.

Jim Marion said...

@Danielle, thank you for the information. I understand what they are saying in regards to standards compliance. I'm not sure what the reporting web services do, but they allow PS_TOKEN in ws-security. See the PeopleBooks entry for more information.

So, SOAP and ws security won't let you use a token. You can still use PS_TOKEN, just not within the ws security envelop. I use it all the time in IB requests with SwitchUser. But I rarely, if ever use SOAP and ws security. Too complicated for my small brain to comprehend. I don't like the black box concept.

Actually, if you think of web services and SOAP as just XML over HTTP (which is really exactly what it is), you can still use PS_TOKEN or any other token. Just use the HttpListeningConnector not the service connector. You could then write PeopleCode to access the request information and call SwitchUser before executing transaction code and returning a response. One thing I'm not sure about is how to access the SOAP headers from the Integration Broker object model. Body and query string, yes, but headers, I don't know.

Jeffery Sun said...

Hi, Jim
Thanks for this great blog! So many useful materials!
I have a question here. I have read many materials and didn't get the answer. I know we can use CI or Webservice to interact with java appliation. I just want to know is there some more straight forward ways to call peoplesoft function from java application. We want to write a PeopleSoft Mobile App. When creating a CI, i need to generate java template for each Component. It's really not that convienient(reusable/extensible). Is there offical infrastructure like some Java Connectors i can use directly. I mean, for example, some Object Model that i can call directly.
Can you shed any light on this ?
Thanks!

Jim Marion said...

@Jeffery, there is a Java API, but it is JNI calls into the binary libs, and only runs in the context of a PeopleSoft session. So, for calling Java from PeopleCode, it is great, but not for calling PeopleSoft from Java. When calling PeopleSoft from Java, you have two options:

1. Build the API's for CI's (I don't like this one).

2. Use Integration Broker and either web services, or just plain old HTTP. I prefer plain old HTTP since it doesn't require a zillion lines of unintelligible WSDL.

Anonymous said...

I want to intergrate my mobile apps with peopleSoft. Can you guide me how I can customize my apps with peopleSoft?

Jim Marion said...

@chayanika, My book has a chapter on drag and drop mobile development using PeopleSoft web services and Oracle's JDeveloper/ADF technologies. Those are the simplest. Both JDeveloper and ADF have changed since I released that chapter, but the concepts still apply, and they apply equally as well to other development languages. You can also use plain HTML, JavaScript, and CSS to build mobile apps for PeopleSoft. When building in this manner, Integration Broker becomes your Ajax service provider.

Anonymous said...

When I try this in our development PS Portal (9.1) I get errors that it can't load due to certficate errors. The hosted gadget code is on a non-ssl server and so even though the calendar is SSL, the gadget won't load. Has anyone run into this?

Jim Marion said...

@jncallahan, did you mean to ask your question on the Google Gadgets post?

Anonymous said...

Yes, I did. I apologize. Can you move it?

Jim Marion said...

@jncallahan, no I can't. Posting is handled by Google. All I can do is approve, deny, and delete. After you repost, I'll delete these posts.

Hari_anindian said...

Hi Jim, We have integrated a third party application with PeopleSoft portal through IB synchronous messages. This is working fine. Some times we are facing issues like response time is going beyond 10 secs. We are not sure why this is happening? we do not find any pattern when/why this delay is happening?this is happening to almost all service operations.

Per day if we get 1000 transaction messages means atleast 4 or 5 message response time(PSIBLOGHDR table field publishtimestamp-lastupddttm is response time. this is how we are calculating the response time) is going beyond 10 secs. Could you please help us to understand why this is happening? and how to avoid such delay?

Thanks,
Hari.

Jim Marion said...

@Hari, I suggest you post this question on the PeopleSoft OTN forum.

Hari_anindian said...

Hi Jim, I did that too and also thought of getting help from you. Thanks.

Jim Marion said...

@Hari, yes, I saw your question hit the forum. There are a lot of really smart developers and administrators that monitor that forum.

Unknown said...

I saw ur book and it uses Oracle ADF to access. Is there any other way we can implement workflow Approval process to mobile.

Approve or Deny any request from mobile?

Jim Marion said...

@Chetan, yes, but it requires some PeopleCode. I have a prototype of this. What I did was write Integration Broker services to look up the worklist and worklist item details. A user's worklist is stored in a table, so that one is pretty easy to look up. My details web service uses the Approval Manager app class to determine information such as pusbackEnabled, hasPending, etc. Chapter 3 has some good information on working with AWE from PeopleCode including an IntegrationBroker SyncRequest handler base program listing.

I used jQuery mobile for my UI, but you could use anything that you are comfortable with.

TeachMe2DevelopPlease said...

Hello Jim. I am an aspiring developer currently as a PeopleSoft Admin at a healthcare company in Milwaukee. We have a desperate need for a mobile solution but we're on tool 8.48 with PS 8.9. Does this chapter in your book apply to this setup? Also, since Oracle offers software downloads free for non-commercial use, is it a good idea to try to set this up at home before pitching it to the company? Is there a workaround for Mobile approvals? Thanks.

Jim Marion said...

@TeachMe, yes, the chapter was written for your version of PeopleTools. Yes, download it and prototype some stuff. The chapter in the book works REALLY well for read only component interface web services. It can be good for non-CI web services, but you will have to create the WSDL. An alternative is to write all the PeopleCode to expose the worklist and the approve/deny functions through Integration Broker and then use a light-weight mobile framework like jQuery Mobile. This is actually how I do mobile.

jb said...

Jim, is it possible to identify the location, maybe by IP Address, of a user via PeopleCode? I am working in an environment where we will have users off-shore (on and oil rig) and want to check if an attachment they want to view is on the rig's server or if we have to get the attachment from the shore server. The user may or may not be from the BU of the rig, however...

Jim Marion said...

@JB, that is a tricky request because the client IP address is often hidden inside the client's network and replaced with the IP address of a proxy server or series of proxy servers. You can get the IP address from %Request.RemoteAddr, it just might not be the client's IP address. It all depends on the network. Nevertheless, it might be enough to satisfy your requirements.

jb said...

Jim, thank you for the info. We will give this a try. Your blog has been very helpful, as well as your book... Thanks again.

Jim Marion said...

@jb, very good. Thank you for the feedback.

pazhanivel said...

I got ur book..I tried the example in chapter 14...Now i have a requiremet to implement workflow approval in mobile..Please give me some idea...Should i go for CI based web services?

Jim Marion said...

@pazhanivel, you have a couple of options. One option is to create a CI for each approval component you want to make available to mobile devices. If you are on apps 9.1, then I don't recommend this approach. As an alternative, use the code from the end of chapter 3 to create an Integration Broker service handler. You can create one handler that returns a worklist, anther that returns a specific instance with details, and a third service to actually approve/deny the workflow process. I built an approval application like this and I had it use jQuery mobile and return HTML directly rather than requiring a separate web server as with ADF. If you are on 8.51 or earlier, you have to handle authentication and send a username/password or PS_TOKEN with each request (see SwitchUser). If you are on 8.52 PeopleTools, then you can use REST based services with basic auth and SSL to have the browser handle authentication.

pazhanivel said...

Thank you so much Jim for ur valuable suggestion.

Jim Marion said...

@pazhanivel, the value of the chapter 14 example is that it is drag and drop. Drag and drop development is MUCH easier to maintain over time. By contrast, the AWE alternative I described is pure code, no drag and drop. The code is relatively simple, so that is nice. Perhaps a hybrid approach would be to code the service operation handlers to use AWE, but then mock up the request and response using the Documents module, and then generate WSDL and services from those documents. Then you could use the chapter 14 development approach for creating a generic mobile approval application.

pazhanivel said...

Thanks...I am planning to go with chapter 14 only....because its easy to develop...

ufriends said...

Hi Jim,

I am trying to create a restful web service in PT 8.52. I have created the document having one primitive element USERID.the issue I m facing using handler tester is that code is not fetching the value of userid which i am providig on the handler page.If i hardcode it is working fine.
Code I m using like:
&msg_resp = CreateMessage(Operation.EMAILID_GET, %IntBroker_Response);
&DOC = &msg_resp.GetURIDocument();
&root = &DOC.DocumentElement;

&prim = &root.GetPropertyByName("USERID");
&user = &prim.Value;

Jim Marion said...

@ufriends, I think you are headed the right direction, just the wrong train track. From the example, it looks like you are trying to read USERID from the response document. I believe what you intended was to read from the input document. Here is an example:

Local Document &parmDoc = &MSG.GetURIDocument();
Local Compound &parmCom = &parmDoc.DocumentElement;
Local string &user = &parmCom.GetPropertyByName("USERID").Value;

&MSG is a parameter to your OnRequest REST service operation handler. You do not need to create it. Yes, you need to create the response message as you did, but not the request message. As a general rule, you read from the request &MSG and you write to the response message.

Whenever I see USERID in a parameter, however, I have to ask the security question: Are you passing the current USER's ID in a query string parameter or some other parameter in USERID? Instead of trusting user input, it may be better to use basic auth with SSL. Then you can use %OperatorID instead.

Munib Mohsin said...

Jim , I am facing an issue . peoplesoft worklist link is not opening , on click it is refreshing page . I am looking for its sloution .

Jim Marion said...

@Munib, Unfortunately, I do not have an answer for you. Did you open a case with global support? You may also want to post your question in the PeopleSoft General Discussion OTN Forum.

Unknown said...

Hi Jim,

I have some doubts regarding the CI based webservices.Can I use the same URL

http://your.peoplesoft.server/PSIGW/HttpListeningConnector?Operation=YOUR_OPERATION_NAME.v1&OperationType=Sync

for the CI Based webservice to post the data from the html page.
I am trying to append the emplid and descr field to the above URL as http://your.peoplesoft.server/PSIGW/HttpListeningConnector?Operation=YOUR_OPERATION_NAME.v1&OperationType=Sync&EMPLID=10&DESCR=TEST.

I am getting an error message like

The request string ( data ) is not properly formed. (158,16005)

Please suggest me how to call a CI based webservice from HTML or javascript.

Jim Marion said...

@Suma, your doubts are correct. The code that processes the CI based web service expects an XML document.

You can use CI's in OnRequest PeopleCode with URL parameters, you just have to write the code to read from Query string parameters instead of from the request document. See my REST-like post for an example of reading query string parameters in 8.51 and earlier. In 8.52 and later, you can create REST services and map URL parameters into a Document object, which is much easier.

Unknown said...

Thank you Jim for the reply.I will try with the OnRequest peoplecode .

Kevin Weaver said...

I am finally to Chapter 14 of your book and I created the CI Based web service for Personal Data and I attempted to test the WSDL, but it did not come up. Only the PeopleSoft Listening connector web page displayed.

The URL that was generated:

Generated WSDL URL: http://lsys113c.umb.com:13100/PSIGW/PeopleSoftListeningConnector/CI_CI_PERSONAL_DATA.1.wsdl

When I changed the PeopleSoftListeningConnector to HttpListeningConnector the browser display's the WSDL.

Is this correct? Or should the PeopleSoftListeningConnector be presenting the WSDL?

Jim Marion said...

@Kevin, did you setup your Integration Broker service configuration target location? I think the WSDL is supposed to come from PeopleSoftServiceListeningConnector.

Kevin Weaver said...

Under this Menu Path
PeopleTools>>Integration Broker>>Configuration>>Service Configuration

The Target Location is http://lsys113c.umb.com:13100/PSIGW/PeopleSoftListeningConnector


I continued with the exercise, and got an error attempting to read the WSDL in JDeveloper.

DCA-40001: Failed to Read the WSDL at "http://lsys113c.umb.com:13100/PSIGW/HttpListeningConnector/CI_CI_PERSONAL_DATA.1.wsdl" The WSDL document cannot be found.

Even though I can get to it via the browser.

Jim Marion said...

@Kevin, no. That is the wrong URL. The sample right below the configuration value is
http://:/PSIGW/PeopleSoftServiceListeningConnector. Notice the "Service" in the connector name.

Kevin Weaver said...

I corrected that mistake and now I can see the WSDL using:

http://lsys113c.umb.com:13100/PSIGW/PeopleSoftServiceListeningConnector/CI_CI_PERSONAL_DATA.1.wsdl

But I still get an error with JDeveloper when I try to create the Data Control?

DCA-40001: Failed to Read the WSDL

Thanks for the help!

Jim Marion said...

@Kevin, do you have proxy servers involved? Does JDeveloper need to be configured to use one?

When I have problems like this with JDeveloper then I reach for one of two tools:

1. Wireshark
2. Fiddler

Fiddler is easier to use, but requires you to configure JDeveloper to use Fiddler as the proxy. Wireshark is a little harder to figure out (with IP filters, etc), but it doesn't require any JDeveloper changes.

Kevin Weaver said...

Thanks!

I have been doing the exercises in your book to keep me sharp. However, I saw your comment in this post about building a simple mobile approval application using HTML and CSS.

So I built a simple login html, where I post the form to integration broker, parse the credentials out and use the switchuser function to change the context.

Then I use IB to create a Worklist xml and then transform the xml using xlst to html. Then I use our ESB to change the http header content from xml to html.

This works beautifully. What do you think?

Jim Marion said...

@Kevin, I think you should sign up to demonstrate this in a session at Collaborate. It is a good approach for pre-8.52. Once you move to 8.52, you will get REST with basic auth over SSL. With REST and basic auth, you can map inbound parameters (from a URL, for example) into a document and access them from the structured document. You won't need to authenticate (SwitchUser) because the basic auth part of the REST service definition takes care of that for you. You also won't need the external service to change the content-type header. REST service operations have a configuration for changing the response content-type header.

Prior to 8.52, the way I handled the content-type header was through our reverse proxy server (apache httpd) and mod_headers.

Kevin Weaver said...

I think this would make a great presentation, but I will have to write it up this week as they are due this Friday.

I have been playing around with it, and I cannot get absence request to approve from the Application Package, I keep getting this error:


Integration Broker Response202716URL Catalog entry "" not found. (2,716) EOAW_UTILITIES.Portal.portalURL.OnExecute Name:getServletURL_ PCPC:5279 Statement:79 Called from:EOAW_UTILITIES.Portal.portalURL.OnExecute Name:GenerateComponentPortalURL Statement:53 Called from:EOAW_CORE.DEFN.AWTxn.OnExecute Name:GetNotifyURLOverride Statement:366 Called from:EOAW_CORE.NOTIFICATION.InlineStrategy.OnExecute Name:ProcessNotifications Statement:78 Called from:EOAW_CORE.NotificationEventHandler.OnExecute Name:ProcessNotifications Statement.

However, I did get my custom workflow to approve, via the service.

Kevin Weaver said...

I figured out that the Internal URL was not set on the Transaction Registry for Absence. This book you wrote is quite handy! Thanks!

Jim Marion said...

@Kevin, yes, that would be a great presentation. Good work figuring out the answer as well!

Anonymous said...

Hi Jim,

Very Useful. U r The Man.
Is it possible to Generate One time Password SMS Token from Peoplesoft?
Thanks!
Chandru

Shiva said...

Hi Jim,

I have a requirement where I need to render the existing peoplesoft page which is designed on 8.53 tools as per the mobile devices/Tablets display.

How I need to develop this requirement and what should my approach will be?

How can I include the CSS into on top of peoplesoft pages? is this is possible? or should I redesign whole peoplesoft page into an HTML page and call it with Iscripts?

Please advise.

Thanks,
Shiva.

Jim Marion said...

@Shiva, PeopleTools 8.53 is supported on iPad, but it looks exactly the same as it does on a desktop, so it isn't really mobile friendly. For PeopleTools 8.53 it is recommended that you build mobile applications some other way rather than app designer pages. For example, in this post I am using Integration Broker. Another option is to use iScripts.

Shiva said...

Thanks Jim.

Unknown said...

Hi Jim, Im confused with PT8.54 Mobile Application Platform. Can you create a mobile app from scratch using it, or is it just a way for a custom (e.g. .net) mobile app to connect to PS? I imagine this blog post would change if the above functionality was employed?

Jim Marion said...

@Luke, I would not have written this blog post today. It was written 5 years ago when PeopleSoft did not have a mobile strategy.

MAP is designed to create completely new mobile applications. It is a point-click editor that builds REST services and a jQuery Mobile user interface. Data binding and event handling happens through PeopleCode app class handlers.

Unknown said...

@Jim
Sincerest thanks for your quick response as I'm trying to conceptualize how MAP could fit in our enterprise mobile tech strategy and this was the closest post I could find about implementing PS mobile apps.

I went to MyOracleSupport and found some docs that also helped (1949496.1, 1949528.1, 1949521.1)

Would it be correct for me to say that I would use MAP over Fluid Interface if:
1. I wanted to generate the most 'light-weight' mobile experience (through use of created data-subset MAP documents instead of Fluid component record sets).
2. I wanted to include non PeopleSoft information on a page - i.e. external references.
These seem to be two key functional features of MAP.

Final question, MAP talks about building a mobile application - but where does the application icon, compiled program, etc get generated to actually make a 'mobile application' available for download (Android/iOS/Win8). Or is it assumed that we do that and simply provide a browser interface within the app to connect to the MAP pages?

I may be so so far off here.

Jim Marion said...

@Luke, #1, yes Oracle recommends MAP for light-weight user experience, especially when working with any type of integration. What makes MAP light is that it uses very simple HTML markup and then jQuery Mobile to "progressively enhance" pages based on device capabilities. Fluid's HTML is not nearly so simple.

The documentation you are reading appears to be using the phrase "mobile application" very loosely. Both MAP and Fluid just create mobile web experiences. Neither of them generate compiled binaries.

Oracle's Mobile Application Framework (MAF) offers one way to deploy a MAP (or fluid) mobile website as a hybrid application. MAF has this concept called a URL Feature that allows you to white list an external URL and display it as if it were a native application with access to device features. Another approach I have taken is to combine Integration Broker REST services with AngularJS and cordova to build hybrid "compiled" on-device applications.

Unknown said...

@Jim
No English words to describe my gratitude for your assistance. Not only have you clarified this technology and the 'vagueness' in some of the PeopleSoft documentation, but also provided me with next steps on tech to explore to create a 'compiled' 'PeopleSoft' mobile app.

Thanks again,
Luke

Sachin Jhawar said...

Hi Jim,

Thanks for sharing such valuable information as always .
I am having a scenario where we have exposed a REST service from peoplesoft 8.53 to third party site which uses ajax to call the WS , they are facing Cross domain issue when calling peoplesoft WS . i have used document to generate the JSON via REST . i believe JSONP should be able to take care of the issue but i am not sure how to generate JSONP from peoplesoft, any inputs you can offer ?
Thanks for all your help !
Sachin.

Jim Marion said...

@Sachin, I have used JSONP with the HttpListeningConnector, but not the RESTListeningConnector. With the HttpListeningConnector, you can use an XML result with a psnonxml attribute. PeopleSoft will strip the XML and just return the internal content.

You can use CORS with a ServletFilter.

Unknown said...

Hi Jim,

In PeopleTools 8.54, there is a delivered html file called "signin_fmode.html" for mobile signin page. I understand that the purpose of this new html is for having two different login pages for mobile and laptop devices and this html is displayed when we add an additional query string "&fmode=1" along with the signin URL. But my question is how can we render the respective html pages automatically based on the device used to login with single URL. Because we can't provide PeopleSoft users two different login URLs (one with fmode=1 and another one without it) for different devices. Is there any delivered approach/mechanism for handling this?

Jim Marion said...

@Muthu, great question. You might want to ask it on the PeopleSoft OTN General Discussion forum.

ndgwva said...

Hi Jim,
Thanks for all great information on developing mobile projects with PeopleSoft. Would you mind providing more information on the CORS issue with a PeopleSoft soap web service? Our mobile web app (based in Appcelerator) is subject to CORS and to get past this with other (non PS based web services), we've added the following in Apache on the web service's server:
Header: Access-Control-Allow-Origin Value: *
Header: Access-Control-Allow-Headers Value: X-Titanium-Id

Could you please describe how this can be done for the PeopleSoft web service (based in 8.54)?
example endpoint of the PS web service: http://our.peoplesoft.server/PSIGW/PeopleSoftServiceListeningConnector

Jim Marion said...

@ndgwva, I would have done it the exact same way. I am not aware of CORS support in 8.54... although, you may want to post your question in the OTN PeopleSoft General Discussion forum in case I missed something.

ndgwva said...

Sorry, I should of stated the server admin does not wish to modify the Apache or WebLogic files on the PeopleSoft server. Just curious if there was a way to add these headers within PeopleSoft.

Jim Marion said...

@ndgwva, I don't believe you can set CORS headers from PeopleSoft. You should ask on the PeopleSoft Genereal Discussion OTN forum just in case someone else figured it out. If it were me, I would use rules in the Apache conf to add CORS headers for specific URLs. You can also use a Weblogic ServletFilter if you need more logic, but if you can get away with just Apache conf, that is easiest to maintain and configure.

Amado Dumpit said...

Hey Jim,

I'm following your PS Journal since then and I would like to say that the amount of information you have been providing is very helpful.

We've recently deployed a project where PeopleSoft is the provider to a 3rd party mobile application using REST and currently, we are still looking ways to enhance the user experience and security of the data as we have exposed a view payslip functionality to the mobile. We only have a network layer security in place (Tunnel) and we are still exploring ways in implementing application layer security other than basic authentication and SSL as the options in PS. Would you be able to provide recommendation/s on other setups we can implement, we're leaning towards exploring OAuth or SAML though per OTN, this is not yet supported by our tools version (8.54).

Appreciate you response on this one.

Amado Dumpit said...

Hi Jim,

We have exposed some view and transnational functionalities in our PS to 3rd Party (Mobile) using REST. Currently, we're using basic authentication and SSL for Application Layer Security. Is there a way we can implement token based request specifically for commercial impacting or payroll related transactions such as view payslip?.

Thank you.

Jim Marion said...

@Amado, I have seen customers use JWT and PS_TOKEN as token-based solutions.

Jim Marion said...

@Amando, regarding other tokens, options, and implementation details, it is true that IB only gives a couple of options, but here is how we implement anything we want: First, we certainly want to enable a secure connection (SSL/TLS, etc). Second, any service operation can be set to public. A public setting doesn't mean every user will see data. It just means IB will invoke the service operation handler. Using PeopleCode, we can implement another layer of security to confirm the identity of the user. After validating, we SwitchUser to invoke CI's, code, etc, that a public user would not be able to access. Using this approach, of course, you must be extremely careful to ensure your code is written in a secure manner.