Oracle REST Data Services

17. april 2024

API, integrasjon, oracle, REST

ORDS logo

Oracle REST Data Services er sannsynligvis den enkleste måten å dele data som ligger i en Oracle database.

Oracle REST Data Services

Mer deling av data er et uttalt mål for mange organisasjoner, spesielt i offentlig sektor. Tilbyr du et REST API til dine data åpner det for at mange kan hente ut det de trenger på en lettvint måte. Skal noen sende data til deg er REST også den enkleste måte å gjøre det på.

REST har mange fordeler, det er utbredt og enkelt, spesielt om man sammenligner med standarder som var mer utbredt før (feks SOAP). Nå tilbys REST stadig mer, se for eksempel på Felles datakatalog på data.norge.no , selv Chuck Norris vitser tilbys nå gjennom REST, se api.chucknorris.io

Oracle tilbyr Oracle REST Data Services (ORDS) uten ekstra lisenskostnader fra oracle.com/ords . Etter flere års erfaring har jeg ikke sett et REST API som henter data fra en Oracle database raskere enn hva ORDS presterer; ytelsen er imponerende selv på beskjeden infrastruktur.

En ferdig installasjon består av to deler, en Java servlet gående på en applikasjonsserver og et nytt API i databasen.

Oracle REST Data Services oversikt

Om du vil overlate installasjon til andre og se på utviklingsmuligheter i ORDS så fortsett lenger nede i artikkelen.

Installasjon

Nedlasting består av kun en zip-fil som pakkes ut på en applikasjonsserver eller annet passende miljø. Bruk denne linken https://download.oracle.com/otn_software/java/ords/ords-latest.zip så får du alltid siste versjon. Den kan lastes ned direkte med feks wget eller curl uten behov for å klikke seg gjennom en lisensavtale. Dagens versjon, 24.1 er på 116MB komprimert.

Kravene til ORDS er beskjedne, men du må ha Java versjon 11 eller nyere. ORDS installeres gjerne av en databaseadministrator; du trenger SYS passord til databasen som skal brukes. Det finnes noen varianter på hvordan man kan gjøre en installasjon, men her vises den enkleste mulige slik at du kan komme fort i gang og se hvor enkelt det kan gjøres; installasjon i en pluggable database (PDB). I eksempel under brukes wget, men curl -O gjør samme nytte. Miljøet må være klart slik at java ligger i PATH.

wget https://download.oracle.com/otn_software/java/ords/ords-latest.zip
mkdir ords-24.1
mkdir ordsconfig
ln -s ords-24.1 ords-latest
cd ords-latest
unzip ../ords-latest.zip
bin/ords --config ../ordsconfig install

Her får du tre valg:

  Enter a number to select the database connection type to use
    [1] Basic (host name, port, service name)
    [2] TNS (TNS alias, TNS directory)
    [3] Custom database URL
  Choose [1]: 

Velg 1 som foreslått. Oppgi navn til verten hvor databasen, port er typisk 1521 som vist, service navn er service som registrert i database listener. Her bruker jeg en database som jeg opprettet i forbindelse med konferansen neste uke, OUGN 2024 . På spørsmål Enter the administrator username: velg SYS:

  Enter the database host name [localhost]: rio
  Enter the database listen port [1521]: 
  Enter the database service name [orcl]: ougn2024
  Provide database user name with administrator privileges.
    Enter the administrator username: SYS
  Enter the database password for SYS AS SYSDBA: 

Retrieving information.
ORDS is not installed in the database. ORDS installation is required.

  Enter a number to update the value or select option A to Accept and Continue
    [1] Connection Type: Basic
    [2] Basic Connection: HOST=rio PORT=1521 SERVICE_NAME=ougn2024
           Administrator User: SYS AS SYSDBA
    [3] Database password for ORDS runtime user (ORDS_PUBLIC_USER): <generate>
    [4] ORDS runtime user and schema tablespaces:  Default: SYSAUX Temporary TEMP
    [5] Additional Feature: Database Actions
    [6] Configure and start ORDS in Standalone Mode: Yes
    [7]    Protocol: HTTP
    [8]       HTTP Port: 8080
    [A] Accept and Continue - Create configuration and Install ORDS in the database
    [Q] Quit - Do not proceed. No changes
  Choose [A]: 

Valgene som foreslått her er OK (Database Actions gir andre muligheter som får bli tema en annen gang.) Den setter et generert passord for en ny bruker ORDS_PUBLIC_USER i databasen. Passordet blir liggende kryptert i en konfigurasjonsfil. Det kan lett endres senere, men bortsatt fra korrekt konfigurasjon så trenger du ikke dette passordet til noe annet. Standard er at ORDS lytter på port 8080, det kan også endres senere. Etter installasjon er ferdig så starter den i Standalone Mode (linje 6). Om du vil kan du avbryte den med Ctrl-C og starte den opp igjen med

bin/ords --config ../ordsconfig serve

I et produksjonsmiljø vil man naturligvis plassere denne i infrastruktur som man ellers vil gjøre med en applikasjon/servlet. I eksempel her kjøres ORDS i standalone mode, men det kan også deployes til Apache Tomcat eller Oracle Weblogic. Og siden den er stateless er det problemfritt å kjøre flere i parallel.

For mer informasjon om installasjon, se Installation and Configuration Guide

Enkel testing av REST i databasen

Eksempler under er gjort i SQL Developer .

Den absolutte enkleste måte å tilby REST på tabeller og views er å bruke AutoREST. Det gjør det mulig å bruke de vanlige operasjonene som GET, POST, PUT og DELETE på tabeller/views og det kan fungere greit til internt bruk om man ikke er redd for uautorisert oppdatering (det kan håndteres med roller senere eller i definisjon av et view som ikke tillater det).

En bruker ORDS_DEMO er opprettet og en CSV-fil med dagens kommuner er lastet ned fra SSB via data.norge.no.

Først aktiveres ORDS på skjemaet (bruker). Det gjøres ved å høyreklikke på connection til databasen og velge nest-siste linje i meny som vist her:

Aktivere REST for et skjema.

Huk av på Enable schema og ta bort hake ved Authorization required. Du kan velge et annet alias en brukernavn som foreslås, det kan være greit å ikke eksponere brukernavnet ut.

Aktivere REST for et skjema.

Klikk på Next og Finish for å fullføre denne delen.

Neste trinn er å aktivere REST på en tabell. Det gjøres ved å høyreklikke på tabellen som vist og velge nest-siste valg igjen:

Aktivere REST for en tabell.

På samme måte aktiveres det ved å klikke på Enable object og ta bort Authorization required

Aktivere REST for en tabell.

Nå kan data nås med nettleser, curl eller annet egnet verktøy for REST API (Postman, Insomnia og en haug med andre).

ORDS i denne demoen går på en server rio og port 8080. Context root til ORDS servlet er standard /ords/ (kan endres i konfigurasjon). I tillegg valgte jeg data som alias for brukeren og kommuner for denne tabellen. Hele URL-en blir i dette tilfellet http://rio:8080/ords/data/kommuner/. På linux bruker jeg gjerne jq til formatering av JSON:

curl http://rio:8080/ords/data/kommuner/ | jq

Denne vil hente de 25 første radene med linker som støtter paginering, kun de siste linjene er vist her:

Siste linjene fra curl kommando.

Merk at denne inkluderer link til metadata-catalog. Den vil igjen referere til Open API catalog for datasettet.

I tabellen ble kolonnen code satt som primærnøkkel. (CSV-filen ble importert fra SSB med kolonnenavn som i CSV-fil, men tomme kolonner ble droppet). Dette er kommunenummer. Søk på Oslo-kommune som har nummer 0301 kan gjøres med http://rio:8080/ords/data/kommuner/0301. Kolonnen name inneholder kommunenavn. Et søk på eksakt verdi feks Sunnfjord kan gjøres med URL 'http://rio:8080/ords/data/kommuner/?q={"name":"Sunnfjord"}' Mer om søk er vist i Developer’s Guide, 2.3.2

Dersom man ønsker å slette Sunnfjord (hvem har vel ikke det?) som har nummer 4647 kan det gjøres med:

curl -X DELETE 'http://rio:8080/ords/data/kommuner/4647'

Definisjon av REST ved hjelp av SQL og PL/SQL

Om man ønsker større kontroll, som for eksempel bestemme hvilke HTTP operasjoner man tillater kan man bruke PL/SQL-pakken ORDS som ble lagt inn ved installasjon. Faktisk er det denne som blir brukt bak kulissene i SQL Developer. For å se SQL som kjøres klikk på fane SQL på siste side:

SQL som brukes til å aktivere ORDS for tabell

Bruk av ORDS-pakken er tema i neste post .