In een architectuur die opgebouwd is uit services hebben organisaties vaak te maken met het feit dat andere diensten en verschillende afdelingen gegevens op een gecontroleerde manier uit de database moeten kunnen uitlezen. Het is aan te raden om de gegevens beschikbaar te stellen via een Data as a Service of een REST API, zodat directe toegang tot de database vermeden wordt. Als de Data as a Service of de API blootgesteld wordt, dan kan de toegang tot de diensten makkelijker gecontroleerd worden. De WSO2 Enterprise Integrator (EI) biedt out-of-the-box ondersteuning om Data as a Service voor veel stores mogelijk te maken.
Bij het blootstellen van Data as a Service of een API, kan er vereist worden dat er een filter API of zoek API met filteropties aangeboden wordt om problemen met prestaties te voorkomen. In deze blog kijken we naar hoe je gegevens die in een MySQL database zijn opgeslagen als een zoek API met filteropties toegankelijk kunt maken.
Hoe ziet de use case eruit?
We willen gegevens uit een database toegankelijk maken via een REST API en die REST API zou daarbij de optie moeten hebben om de gegevens te filteren op basis van het aantal kolommen van de tabel. Hier wordt alleen een “AND”-operatie voor het filteren in beschouwing genomen. De volgende zoek/filter API call zou bijvoorbeeld de SQL query uit moeten voeren in de overeenkomstige databasetabel en het volgende resultaat op moeten leveren:
REST API call: /context/resourcepath?query1=”value”& query 2”=value”…. ”& query-n”=value”
SQL Query: SELECT * FROM TABLE WHERE COLUMN1=”VALUE” AND COLUMN2=”VALUE”….AND COLUMNn=”VALUE”
Wat is de oplossing?
WSO2 Enterprise Integrator (EI) heeft een Data Service functie die als service gebruikt kan worden om toegang te geven tot de gegevens die in de database opgeslagen zijn. Het is mogelijk om een Data Service te maken die Dynamische SQL query’s as input accepteert. Deze functie kun je gebruiken om de gegevens te filteren op basis van de waardes van de kolomattributen.
Buitenstaanders direct toegang geven tot deze Data Service is echter gevaarlijk, omdat daardoor SQL injecties mogelijk zouden zijn. Om die reden geven we buitenstaanders op een gecontroleerde manier toegang tot de Data Service, waarbij we de input voor de Data Service valideren voordat deze de service aanroept. Dit kun je doen door een REST API in de WSO2 EI te maken. Deze treedt dan op als proxy voor de Data Service. Aanvragen die binnenkomen op de REST API worden eerst gevalideerd en vervolgens wordt er van de parameters in valide aanvragen een dynamische query gemaakt voor de Data Service en daarmee wordt de Data Service aangeroepen.
Het verder blootstellen van de Data Service via local transport en toegang vanuit de REST API via local transport zou het risico op aanvallen op de Data Service verder inperken. In deze blog leggen we alleen de functionele vereisten uit en de implementatie ervan. Verdere details over het gebruik van local transport kun je in de WSO2 documentatie vinden.
Je hebt minimaal het volgende nodig om het voorbeeld in deze WSO2 Tutorial zelf na te kunnen doen:
- WSO2 EI
- MySQL Database
- MySQL Driver
- WSO2 Integration Studio
De installatie van de WSO2 Enterprise Integrator & Database
- Download en kopieer de MySQL driver naar <EI_HOME>/lib
- Laten we een database maken om gegevens van vestigingen van een bedrijf in op te slaan. We voeren voorbeeldgegevens in.
Een API / service maken om gegevens op te vragen
- Creëer de volgende projecten in de Integration Studio:
- ESB Project (FilterAPI-ESB) – Holds ESB Artifacts
- Data Service Project ( FilterAPI-DS) – Holds Data Service Artifact
- Data Source Project ( FilterAPI-DataSource) – Holds Data Source Artifact
- Composite Carbon Application (FilterAPI-CAPP) – Holds the artifacts to be deployed
- Creëer een Data Source om de database te kunnen verbinden:
- Klik met de rechter muisknop op FilterAPI-DataSource > New > Data Source
- Schakel over naar ‘source view’ en configureer de data source
- Creëer een Data Service met als input een dynamic query
- Klik met de rechtermuisknop op FilterAPI-DS > New > Data Service
- Kies het data source Type “Carbon Data Source” en selecteer de naam van de data source die je in de vorige stap gemaakt hebt.
- Wanneer het Service-bestand aangemaakt is, schakel je over op ‘source view’ en creëer je de service om de query als dynamische query naar de tabel te sturen. De service hieronder bevat de volgende stappen:
- Definieer de Data source
- Definieer de Query om de details van de vestigingen te krijgen
2.1. Definieer de SQL om de details van de vestigingen te krijgen
2.2. Definieer de Input parameter mapping
2.3. Definieer de Out Put parameter mapping
3. Definieer operation
3.1 Kies de queryID om de operatie te mappen
3.2 Definieer de operation input parameters
Let op: Stel binnen input mapping het sqlType in en zet de Value voor voor filterQuery op QUERY_STRING. Hier is filterQuery het SQL WHERE clause statement. Bijv. WHERE OfficeCode=1
- Test de Data Services met de dynamische filter SQL query
- Selecteer de Data Source en Data Service die in de Composite Carbon Application gecreëerd zijn (FilterAPI-CAPP) en genereer de car-applicatie.
- Deploy de car-applicatie naar de WSO2 EI Server
- Zoek de deployde service in het services deel en selecteer de optie ‘Try this Service’
- Geef nu een WHERE clause statement op als filterQuery parameter. Bijvoorbeeld: “WHERE officecode=1’. De service zal de data filteren op basis van de opgegeven condition in de WHERE clause en geeft de respons terug.
Nu hebben we een service die SQL accepteert als ‘clause condition’ en op basis daarvan de gegevens filtert.
- Creëer een REST API – De service die we in de vorige stap gecreëerd hebben is gevoelig voor SQL-injecties, omdat de caller ieder SQL-statement als parameter aan kan bieden. Daarom zullen we ervoor moeten zorgen dat deze Service niet toegankelijk is voor buitenstaanders of onbetrouwbare clients. Als buitenstaanders toegang moeten krijgen tot deze service, dan zou dat kunnen door een beveiligde API te gebruiken. De API dient kolomwaardes te accepteren als query parameters en de parameters dienen gecontroleerd te worden om SQL-injectie te voorkomen. De API zal dan de dynamische WHERE clause construeren op basis van de ontvangen en gevalideerde parameters.
- Klik met de rechter muisknop op FilterAPI-ESB -> New -> Rest API
- Geef de API een naam en context
- Creëer de logica om de query parameters te valideren en de dynamische WHERE clause te construeren. Creeër de data service payload vanuit de geconstrueerde input parameter, roep de data service aan, transformer het bericht naar JSON en stuur het terug naar de caller.
Let op: In de bovenstaande API zijn er slechts twee tabelkolommen die voor het filter in aanmerking komen en gemapt zijn op de query parameters. Dit kan uitgebreid worden naar een willekeurig aantal kolommen.
Table Column | Query Param |
OfficeCode | code |
City | city |
De bovenstaande API heeft geen logica om de validatie uit te voeren. De validatie zou toegevoegd kunnen worden voordat de dynamic query geconstrueerd wordt. Als de validatie faalt, kan er een foutbericht teruggestuurd worden naar de caller.
- Test the REST API
- Selecteer alle artifacts die nodig zijn voor de applicatie en creëer het .car-bestand.
- Deploy het .car-bestand in WSO2 EI
- Roep de API aan met verschillende dynamic query parameters om de gegevens te filteren. Gebruik bijvoorbeeld:
- Om offices op stadsnaam te selecteren: GET http://localhost:8280/office?city=Norwich
- Om offices op officecode te selecteren: GET http://localhost:8280/office?code=1
- Om offices op stadsnaam en officecode te selecteren: GET http://localhost:8280/office?code=1&city=Norwich
Conclusie
De data service feature in WSO2 Enterprise Integrator is een krachtige functie om toegang te geven tot gegevens uit verschillende databronnen. Samen met de WSO2 EI mediation feature kunnen deze gegevens op een gecontroleerde manier toegankelijk gemaakt worden voor openbare applicaties.