Follow Us on Twitter

APEX en SOA Suite, een combinatie die werkt

Mei 2015 – Oracle Application Express (APEX) is een browser-based ontwikkelomgeving, waarin razendsnel webapplicaties gebouwd kunnen worden. Oracle SOA Suite is een onderdeel van Fusion Middleware, waarin onder andere web services gebouwd kunnen worden.

Hoewel er veel meer mogelijk mee is, wordt APEX vooral ingezet voor applicaties waarin de nadruk ligt op CRUD (Create, Retrieve, Update en Delete) en rapportages bovenop een database systeem. SOA Suite wordt daarentegen vooral ingezet in complexe landschappen, waarin diverse informatiebronnen worden geïntegreerd.
Op het eerste gezicht lijken het twee compleet verschillende werelden, maar dankzij diverse technieken is het zeer goed mogelijk om ze gebruik te laten maken van elkaars sterke punten.

In dit Whitebook zien we een aantal methodes om informatie uit te wisselen tussen APEX en SOA Suite, waarbij verschillende technologieën de revue passeren. Hierdoor ontstaan complete en robuuste oplossingen, waarbij bestaande investeringen niet worden weggegooid en weinig nieuwe investeringen nodig zijn.

Casus

Om de verschillende mogelijkheden van de integratie van Application Express en SOA Suite te illustreren, maken we gebruik van een voorbeeldcasus.

In het voorbeeld gaat het om twee bedrijven. Het Nederlandse Holland BV is een relatief klein bedrijf met een aantal innovatieve producten. Voor de administratie van het personeelsbestand en de verkopen heeft Holland BV een APEX applicatie gebouwd. Het tweede bedrijf is de grote multinational Amerika Inc. Dit bedrijf was zeer geïnteresseerd in de producten van Holland BV en heeft daarom een meerderheidsbelang genomen.

Qua software werkt Amerika Inc. heel anders. Zij hebben gekozen voor een Service Oriented Architecture, waarbij de diverse databases en andere bronnen worden ontsloten middels web services. Elk dochter- en zusterbedrijf van Amerika Inc. sluit op deze web services aan om ieder een eigen front-end te tonen.

De uitdaging voor deze twee bedrijven is nu om hun software landschappen op elkaar aan te sluiten. In plaats van te kiezen voor één groot nieuw pakket, kiezen ze voor een andere oplossing. Waar het kan, willen ze elkaars software gebruiken, om met een minimale investering tot het gewenste resultaat te komen.

Met SOAP van SOA Suite naar APEX

De eerste uitdaging is de personeelsadministratie. Amerika Inc. heeft hiervoor een SOAP service gebouwd in Oracle SOA Suite 12c. Deze service levert XML berichten op met daarin informatie over personeelsleden.

Holland BV heeft voor hetzelfde doel een APEX applicatie waarin een rapport is opgenomen om een personeelsoverzicht te tonen.

Het is de bedoeling dat na de integratie van deze twee systemen de personeelsleden van Amerika Inc. ook worden getoond in hetzelfde rapport.

Wat is SOAP?

De afkorting SOAP staat voor Simple Object Acces Protocol. Het is een industriestandaard die door veel grote bedrijven wordt ondersteund als het belangrijkste protocol om XML berichten te versturen. Het resultaat van een SOAP service is een XML bestand met daarin een zogenaamde Envelope die bestaat uit een optionele Header en een Body waarin de inhoudelijke informatie is opgenomen.

SOAP web service maken in SOA Suite

Multinational Amerika Inc. stelt enkele basisgegevens uit z’n personeelsadminstratie beschikbaar aan z’n afnemers door middel van een web service.
Een gebruikelijke architectuur voor een web service zoals deze in Oracle SOA Suite, is een combinatie van twee hoofdcomponenten.
Aan de ene kant is er een SOA Composite met daarin de adapters om gegevens uit de verschillende bronnen op te halen en te bundelen tot een antwoord bericht.
Aan de andere kant een OSB proxy die de communicatie met de buitenwereld regelt.
Schematisch ziet dat er dan als volgt uit.

Service architectuur
Figuur 1: Service architectuur

Tot en met versie 11g vereiste het bouwen van deze twee componenten ook twee verschillende ontwikkelomgevingen. Het SOA stuk werd gebouwd in JDeveloper en het OSB stuk in bijvoorbeeld Eclipse voorzien van het Oracle Enterprise Pack for Eclipse (OEPE).

Vanaf versie 12c is deze scheiding niet meer nodig. In JDeveloper kunnen sinds deze versie zowel OSB als SOA componenten worden gebouwd.

De web service in dit voorbeeld ziet er dan als onderstaand uit.

Allereerst de OSB Proxy:

OSB Proxy
Figuur 2: OSB Proxy

Daarna de SOA Composite:

SOA Composite
Figuur 3: SOA Composite

Het bericht dat hieruit komt ziet er uit als in onderstaande code:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
	<soap:Body>
		<GetEmployeesResponse xmlns:hr="http://www.amerikahr.com/getemployees">
			<hr:Employees>
				<Employee>
					<Name>Tony Stark</Name>
					<Job>President</Job>
					<Location>Los Angeles</Location>
					<Salary>5000</Salary>
				</Employee>
				<Employee>
					<Name>Pepper Potts</Name>
					<Job>Accountant</Job>
					<Location>Los Angeles</Location>
					<Salary>4000</Salary>
				</Employee>
				<Employee>
					<Name>Bruce Banner</Name>
					<Job>Smash</Job>
					<Location>New York</Location>
					<Salary>3500</Salary>
				</Employee>
				<Employee>
					<Name>Steve Rogers</Name>
					<Job>Sales</Job>
					<Location>New York</Location>
					<Salary>3500</Salary>
				</Employee>
			</hr:Employees>
		</GetEmployeesResponse>
	</soap:Body>
</soap:Envelope>

Uit dit stuk XML is af te leiden dat er per werknemer een naam, functie, locatie en salaris worden teruggegeven. Deze informatie kunnen we vervolgens gaan integreren in het bestaande rapport.

SOAP web service inlezen in APEX

Hoe een web service in APEX kan worden aangeroepen, is in een eerder Whitebook beschreven.

Sinds het schrijven van dat Whitebook is het aanroepen van een web service binnen Application Express eigenlijk niet veranderd. Nog steeds maken we een Web Service Reference aan binnen de Shared Components van een applicatie en nog steeds wordt het resultaat van die Reference in een Collection gestopt.

Sinds die tijd is het wel eenvoudiger geworden om de gegevens op te halen uit die Collection. Om het antwoordbericht van de web service uit de case uit te lezen in een query te halen, volstaat de onderstaande query.

select xtab."Name" ename
 , xtab."Job" job
	 , xtab."Salary" sal
	 , xtab."Location" loc
  from apex_collections c, 
		  XMLTable(XMLNAMESPACES(DEFAULT 'http://amerikahr.com/employees'),'//Employees/Employee' passing xmltype001
			COLUMNS "Salary" PATH 'Salary'
				  , "Location" PATH 'Location'
				  , "Job" PATH 'Job'
				  , "Name" PATH 'Name'
		  ) xtab
 where c.collection_name = 'AMERIKAHR'

Door deze query te integreren in het bestaande rapport van de Holland BV applicatie, worden nu de gegevens van beide bedrijven samen getoond.

Met REST van APEX naar SOA Suite

De tweede uitdaging is een bericht de andere kant op. Amerika Inc. heeft een applicatie waarin de producten van het gehele bedrijf worden getoond. De basis hiervan is een web service die informatie uit verschillende bronnen bij elkaar verzamelt.

Om de informatie van Holland BV hier aan toe te voegen, moet deze eerst beschikbaar gesteld worden. Voor dit doel besluiten de software architecten om een nieuwe RESTful web service te maken in de APEX applicatie en deze te consumeren in de SOA composite van Amerika Inc.

Wat is REST?

REST is een type software architectuur dat de laatste jaren veel aan populariteit heeft gewonnen. De afkorting staat voor REpresentational State Transfer. REST bestaat onder andere uit een aantal richtlijnen en best-practices voor het maken van schaalbare web services. Het wordt gezien als een simpeler alternatief voor op SOAP gebaseerde web services. Een manier om dit voor elkaar te krijgen is door gebruik te maken van JSON in plaats van XML als protocol om de informatie te transporteren.

JSON (JavaScript Object Notation) is een gegevensformaat dat als alternatief voor XML wordt gebruikt. Het formaat is compacter en minder uitgebreid dan XML en daardoor zijn bestanden met vergelijkbare inhoud in JSON aanzienlijk kleiner dan die in XML. Dit helpt bij het verhogen van de performance en de schaalbaarheid.

Een voorbeeld bericht ziet er dan als volgt uit:

{"employees":[
    {"firstName":"Steve", "lastName":"Rogers"},
    {"firstName":"Tony", "lastName":"Stark"},
    {"firstName":"Bruce", "lastName":"Banner"}
]}

Ter vergelijking. Dit zelfde bericht in XML zou er ongeveer zo uit zien:

<employees>
    <employee>
        <firstName>Steve</firstName> <lastName>Rogers</lastName>
    </employee>
    <employee>
        <firstName>Tony</firstName> <lastName>Stark</lastName>
    </employee>
    <employee>
        <firstName>Bruce</firstName> <lastName>Banner</lastName>
    </employee>
</employees>

Een ander verschil is dat een RESTful service in tegenstelling tot een SOAP service onder andere is aan te roepen met de standaard HTML methodes GET, PUT, POST en DELETE. Op die manier communiceren bijvoorbeeld ook webbrowsers met webpagina’s en remote servers.

RESTful service maken in APEX

Het aanbieden van een RESTful service is mogelijk in Application Express sinds versie 4.2 met Oracle REST Data Services (voorheen APEX Listener) versie 2.0. Holland BV en Amerika Inc. gaan deze feature gebruiken om gegevens uit de bestaande applicatie te publiceren als een web service.

Om een RESTful service te maken in APEX navigeren we naar de SQL Workshop. Daar is de knop RESTful Services beschikbaar. Na het drukken op deze knop verschijnt een pagina met een overzicht van beschikbare RESTful services, evenals een Create knop om een nieuwe service te maken.

In het voorbeeld willen de bedrijven de gegevens uit de product tabel van Holland BV beschikbaar stellen. De service die dit gaat ondersteunen moet wel zo flexibel zijn, dat er alleen producten uit een opgegeven categorie worden teruggegeven in het antwoord bericht.

Bij het aanmaken van een RESTful service moeten een aantal zaken worden ingevuld. De naam moet slim gekozen worden. Deze komt namelijk in het adres te staan die wordt gebruikt om de service aan te roepen. Deze service heet ‘products’. Een ander belangrijk onderdeel van het adres is de URI Template. De naam zegt het al een beetje; dit is een voorbeeld van de URI (Unified Resource Identifier) waarmee de service kan worden aangeroepen. Hierin staat het adres en eventuele parameters die meegegeven kunnen worden.

Onze voorbeeldapplicatie gebruikt de URI Template get/{category}. Dit URI bestaat uit de locatie waarop de service is te bereiken (get) en een parameter (category).

Daarnaast moet er bij de service definitie aangegeven welke methode er gebruikt wordt. In dit geval wordt dat een GET methode. Dat wil zeggen dat het de bedoeling is dat er gegevens worden opgehaald. Bij een RESTful service in APEX kan dat op een aantal manieren. In dit geval wordt er een query aangeroepen die de gegevens gaat teruggeven.

De query ziet er als volgt uit:

select product_id
     , product_name
     , product_description
     , list_price
  from product_info
 where category = :category

De parameter die in de URI is gedefinieerd wordt door de service gebonden aan de Bind Variabele :category in de query.

Als alle gegevens zijn ingevuld, kan de service worden aangeroepen door het URL in een browser in te geven. http://server.holland.nl/apex/workspace/products/get/tablets is een voorbeeld van het adres waarmee de producten uit de categorie "Tablets" kunnen worden opgehaald.

Het JSON response ziet er dan uit als het volgende bericht:

{"products":[
    {"product_id":"4", "product_name":"HT10", "product_description":"Holland Tablet 10 inch", "list_price":"550" },
    {"product_id":"4", "product_name":"HT12", "product_description":"Holland Tablet 12 inch", "list_price":"600" },
    {"product_id":"5", "product_name":"HT14", "product_description":"Holland Tablet 14 inch", "list_price":"650" }
]}

Met deze RESTful service beschikbaar, kan nu de SOA Suite worden ingezet om de gegevens uit te lezen.

REST service consumeren in SOA Suite

In versie 12c van de Oracle SOA Suite is de REST adapter geïntroduceerd. Amerika Inc. gaat deze adapter gebruiken om in een bestaande webservice de productcatalogus van Holland BV te integreren. Op die manier wordt bereikt dat het gehele productaanbod van Amerika Inc. en al z’n dochters kan worden aangeboden in één enkele webservice.

De bestaande web service haalt gegevens uit een database met behulp van een Database Adapter.

SOA Composite zonder REST Adapter
Figuur 4: SOA Composite zonder REST Adapter

Gegevens uit de RESTful service worden hierin geïntegreerd door middel van de REST adapter. Als deze adapter op het canvas van de SOA service wordt gesleept, verschijnt een window waarin de configuratie kan worden gedaan. Dat komt er dan als volgt uit te zien:

REST Adapter configuratie
Figuur 5: REST Adapter configuratie

In deze configuratie komen duidelijk de componenten terug die in de RESTful service zijn aangebracht. De Base URI bevat de locatie van de service. Het Resource Path bevat het pad op de server en de Operation Bindings tonen het aan te roepen eindpunt. Met deze informatie kan de REST adapter worden aangemaakt en worden gekoppeld aan de bestaande BPEL. Daarop ziet die kant van de SOA composite er als volgt uit.

SOA Composite met REST adapter
Figuur 6: SOA Composite met REST Adapter

In de BPEL zelf kunnen nu ook alle lijntjes worden getrokken. Als laatste zou dan een XSLT transformatie moeten worden toegevoegd die ervoor zorgt dat het resultaat de informatie uit beide bronnen bevat.

BPEL met REST adapter en transformatie
Figuur 7: BPEL met REST Adapter en transformatie

Daarmee is de service compleet.

Andere mogelijkheden

Naast de genoemde varianten, is het ook mogelijk om APEX en SOA Suite op andere manieren met elkaar te laten communiceren. Hierna volgt een kort overzicht van de opties die het meest in het oog springen.

APEX_JSON

Een vrij nieuwe manier om Application Express te laten integreren met web services is de APEX_JSON package. Deze PL/SQL package wordt meegeleverd vanaf APEX 5.0. Met behulp van APEX_JSON is het mogelijk om vanuit APEX applicaties, maar ook vanuit andere PL/SQL programmatuur, allerlei bewerkingen te doen met JSON.

Het is met deze package mogelijk om JSON te genereren, om JSON te lezen en om JSON om te zetten naar XMLTYPE. Daarmee kunnen dus web services worden geconsumeerd maar ook gepubliceerd.

APEX_WEB_SERVICE

Deze PL/SQL API bestaat al wat langer. Met deze package is het alleen mogelijk om SOAP en RESTful web services te consumeren vanuit elke plek waar ook PL/SQL kan worden gebruikt. Dit is dus een alternatief voor de Web Service Reference zoals die in het eerste voorbeeld van dit Whitebook is getoond.

Ten opzichte van een Web Service Reference, is APEX_WEB_SERVICE wat bewerkelijker, maar ook flexibeler. Doordat alles in PL/SQL code gebeurt, zijn er meer handelingen te programmeren om tot hetzelfde resultaat te komen. Maar daarentegen zijn wel alle andere tools beschikbaar die in PL/SQL zijn te gebruiken.

Oracle REST Data Services 3.0

Begin mei 2015 heeft Oracle de derde versie van Oracle REST Data Services uitgebracht. Ten opzichte van eerdere releases zijn in deze versie weer een aantal nieuwe zaken toegevoegd. Enkele daarvan hebben betrekking op het publiceren van REST web services.

Voor een volledig overzicht is er meer informatie te vinden in de release notes van ORDS 3.0.

Database Adapters

Naast de meer geavanceerde voorbeelden die in dit Whitebook zijn genoemd, is er natuurlijk altijd nog de oude vertrouwde database adapter beschikbaar in SOA Suite. Met deze adapter kunnen BPEL composites en OSB proxies direct onderdelen van een database applicatie aanroepen. Op die manier kunnen een applicatie in APEX en een andere applicatie in SOA Suite gebruik maken van dezelfde tabellen en PL/SQL code. Ook dat kan een goede manier zijn om bestaande software te hergebruiken.

Conclusie

Het is al langer bekend dat Application Express erg goed is te gebruiken om web services aan te roepen en de gegevens daaruit te consumeren.

Wat nieuwer en daardoor minder bekend is, is dat APEX ook erg goed zelf web services kan aanbieden. Zeker vanaf APEX versie 5.0 met Oracle REST Data Services 2.0 en hoger zijn er diverse nieuwe mogelijkheden ontstaan.

Omdat APEX en SOA Suite prima samen te gebruiken zijn, ontstaat voor gebruikers van deze producten nieuwe kansen.

Er kan worden gekozen voor het samenvoegen van twee architecturen als er bijvoorbeeld een bedrijfsovername of fusie plaatsvindt. Op die manier kan er al snel een nieuwe front-end applicatie gemaakt worden op basis van bestaande web services.

Gezien de geringe investering die nodig is bij een APEX applicatie, kan dit zelfs gebruikt worden als tijdelijke oplossing, totdat een definitieve applicatie in een andere technologie gereed is.

Al met al is de combinatie van Application Express en SOA Suite een krachtig middel met vele mogelijkheden die voor een groot aantal toepassingen is te gebruiken.

Referenties

Waardering:
 

Reacties

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.