Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EDT:Accessing a service"
(→Accessing an EGL service in either of its two forms) |
(→Accessing a third-party REST service) |
||
Line 159: | Line 159: | ||
== Accessing a third-party REST service == | == Accessing a third-party REST service == | ||
+ | |||
+ | When you access a third-party REST service, the service-access code in the Rich UI handler is accessing a proxy function, which also must be generated to JavaScript. | ||
+ | |||
+ | |||
+ | |||
<source lang="java"> | <source lang="java"> |
Revision as of 14:30, 30 August 2012
You can access services from a Rich UI application. This page gives code examples. For additional information, see Service bindings.
Accessing a dedicated service
The simplest way to deploy a service written in EGL is to include it with the Rich UI application. The service in that case is known as a dedicated service.
Assume that the service is named MyServiceType and the function of interest is named calculate. Here is a short example of the code necessary to access that service:
call MyServiceType.calculate(myList) returning to theCallBack onException theExceptionHandler;
Accessing an EGL service in either of its two forms
If the logic for a given service is written in EGL, the logic might be accessed as a dedicated service or as an EGL REST-RPC service. In that second case, the service is deployed outside of the Rich UI application, typically on a different server.
Here is the simplest way to switch between accessing the identical EGL service logic in one way or another:
- In your code, declare a binding variable and embed it in a call statement.
- In the EGL deployment descriptor, define an entry. To switch between the two forms of the same service logic, you can vary the entry in the same deployment descriptor or, more likely, can reference a different deployment descriptor with a same-named entry.
/******************************************************** * Declare the binding variable * ********************************************************/ myBinding IHttp? = Resources.getResource("binding:myBinding"); /******************************************************** * Call the service * ********************************************************/ call MyServiceType.calculate(myList) using myBinding returning to theCallBack onException theExceptionHandler; /******************************************************** * Example: create a new EGL project for * * "Web 2.0 client application with services". Add the * * the Service type shown next to the server package, * * and add the Handler type to the client package. * * * * Test the example in the Rich UI Preview tab * * as follows: * * * * 1. Type valid input into the first text box; * * for example: 5, 12, 4. * * * * 2. Click '''Calculate'''. * ********************************************************/ /******************************************************** * The file with a Service type * ********************************************************/ package server; service MyServiceType // variables and constants can be here function calculate(myScores Int[] in) returns(Decimal(4, 2)) numberOfScores, i, mySum Int; numberOfScores = myScores.getSize(); for(i from 1 to numberOfScores) mySum = myScores[i] + mySum; end return(mySum/numberOfScores); end end /******************************************************** * The file with a Handler type * ********************************************************/ package client; import server.MyServiceType; import org.eclipse.edt.rui.widgets.GridLayout; import org.eclipse.edt.rui.widgets.GridLayoutData; import org.eclipse.edt.rui.widgets.TextField; import org.eclipse.edt.rui.widgets.TextLabel; import dojo.widgets.DojoButton; import dojo.widgets.DojoTextField; handler MyHandler type RUIhandler{initialUI =[ui], onConstructionFunction = start, cssFile = "css/MyClientAppWithService.css", title = "MyHandler"} ui GridLayout{columns = 3, rows = 4, cellPadding = 4, children =[myResult, myButton, scores, codeLabel]}; codeLabel TextLabel{layoutdata = new GridLayoutData{row = 2, column = 2}, text = "Numbers:"}; scores TextField{layoutData = new GridLayoutData{row = 2, column = 3}}; myButton DojoButton{layoutData = new GridLayoutData{row = 4, column = 2}, text = "Calculate", onClick ::= ui_onClick}; myResult DojoTextField{layoutData = new GridLayoutData{row = 4, column = 3}}; function start() end function theExceptionHandler(exp AnyException in) SysLib.writeStdOut(exp.messageID + " " + exp.message); if(exp isa ServiceInvocationException) SysLib.writeStdOut((exp as ServiceInvocationException).detail1); SysLib.writeStdOut((exp as ServiceInvocationException).detail2); SysLib.writeStdOut((exp as ServiceInvocationException).detail3); end end function theCallBack(retResult decimal(4, 2) in) myResult.text = retResult; end function ui_onClick(event Event in) inputLength int = scores.text.length(); myDelimiters string = ", "; myPosition int = 1; myToken string; myList int[]; while(myPosition < inputLength) myToken = StringLib.getNextToken(scores.text, myPosition, myDelimiters); if(myToken != null) myList.appendElement(myToken as int); end end /************ Service access statements ***************************/ myBinding IHttp? = Resources.getResource("binding:myBinding"); call MyServiceType.calculate(myList) using myBinding returning to theCallBack onException theExceptionHandler; /*******************************************************************/ end end
function theCallBack(retResult decimal(4, 2) in, myHttp IHTTP in) myResult.text = retResult; /* display the response in JSON format */ SysLib.writeStdOut(myHttp.getResponse().body); end
Accessing a third-party REST service
When you access a third-party REST service, the service-access code in the Rich UI handler is accessing a proxy function, which also must be generated to JavaScript.