Monday 20 October 2014

SOA-Suite 12c: configure inbound REST adapter

Since release 12c, the Oracle SOA Suite comes with an adapter for REST-Services. This tutorial shows how to configure an inbound REST Adapter for XML and JSON Payload.


Start with a new SOA Application, choose 'Empty Composite'.


Create a new REST adapter on the left side of the composite at the Exposed Services.


A Resource Path could be defined, this simple example work without one. At least one HTTP operation needs to be bound by clicking the green plus sign (+) under 'Operation Bindings'. The last two entries are presets for easier setup, but leaving out some options. So we start with 'Add operations binding'


Check JSON and XML as payload and POST for the HTTP Verb. For defining the XML-Schema, click the cog reading 'Define Schema for Native Format'.


Click through the Native Format Builder with 'Next' ...



... and 'Next' ... 


... und 'Next' ... 


... until the page, where a sample JSON file could  be uploaded via the 'Browse' button. If no file is available, just enter the desired JSON Data in the Sample text field, for example 

{
"Event" : "asdf",
"Payload" : "dfgh"
}

and click next.


The JDeveloper comes back with a ready-to-use Schema, which will be used later. Click through the wizard with 'Next' and 'Finish'


For the Response tab, also choose XML and JSON for Payload. This isn't necessary for a POST operation, but useful for testing. Select the newly created XML Schema by clicking on the magnifier icon next to 'Schema URL'. Close both dialogs with 'OK'.


The REST service is now completed. Next a BPEL process is needed, e.g. by right mouse button and choosing Insert|BPEL Process.


Change the template to 'Synchronous BPEL Process' and uncheck 'Expose as a SOAP service'. Leave the rest and finish with 'OK'.



The interface of the BPEL process does not fit to our REST service and needs to be removed. Click the symbol of the inbound interface so that the surrounding circles is represented by a dotted line. Press the 'DELETE' key on your keyboard and answer both questions with 'YES'.



Now the RestService can be wired to the BPEL process. Click 'OK' when asked for a transaction. 



Open the BPEL Process. The input and output variables for the old interface are still there. They need to be removed by clicking on the variables button (x), mark both and click on delete.


Switch to source view. The old WSDL is still imported, so the line reading <import ui:processWSDL... needs to be deleted.


The old interface is deleted, so the receiveInput can now be wired to the RestService.


Change the Port Type to the new RestService_ptt.



A new input variable is needed. Click on 'Auto-Create Variable and in the 'Create Variable' dialog just click 'OK'. 


Wire the replyOutput also to the RestService and repeat the steps above.


To let the process do at least anything, create a file adapter to write down the messages.


Click through the wizard. Choose 'Write File' for Operation Type. Check 'Add Output Header' for more verbose output.


Choose an output directory, then a filename template and append a sequence (%SEQ%).



Select the Root-Element of the above created Schema.


Click through the wizard to the end.


Now put an Invoke activity right behind receiveInput and wire it to fileOutput.


Create a new input and output variable via the green plus (+) and close the dialog.


Put an assign activity in front of the Invoke1 activity.


Open the assign activity and map the Root-Element of receiveInput...InputVariable to Invoke1_Write_InputVariable.
For the return, place another assign activity between Invoke1 and ReplyOutput and create the mapping accordingly for Invoke1_Write_OutputVariable.
That's it, die example is ready to run. Deploy it to a SOA Suite instance of your choice and open
FMW Control.


In FMW Control, select the project, click the test button and choose the RestService.


Change both Media Types to application/json. Switch to Raw View, enter your request and test the service.



If nothing went wrong, the event should be logged to the file and the response gives back the folder and the filename.
At the deployment, the SOA Suite automatically creates an according WADL. This could be copied from the service test page for testing the service in JDeveloper.


Open the HTTP Analyzer via Tools|HTTP Analyzer and click on the 'Open URL...' icon.


Paste the copied WADL-URL and hit RETURN.


When JDeveloper parsed the WADL, the test client can be called via the 'Test' button.


The test form seems to have still some problems with JSON. So switch the Content-Type to application/xml and test it via 'Send Request'. Becase the returning data is now 'fileName' and 'directory', instead of expected 'Event' and 'Payload', the JDev cannot parse the returning data. But for a clean solution, this example would have become even longer.


Instead, simply switch to Raw Message view to see that the expected data is returned.

As this simple example shows, the REST/JSON-support in JDeveloper and SOA Suite is definitively ready to use.