prog:ords_rest_service
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
prog:ords_rest_service [2017/03/23 09:48] – [CRUD - Daten mit REST Aufruf verarbeiten] gpipperr | prog:ords_rest_service [2018/10/18 09:52] (aktuell) – [Oracle ORDS 3.0 REST API nativ verwenden] gpipperr | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | =====Oracle ORDS 3.0 REST API nativ verwenden===== | ||
+ | **2017/03** | ||
+ | |||
+ | Ziel: Ein JSON Record soll als Webservice zur Verfügung gestellt werden. | ||
+ | |||
+ | Das ganze kann zwar auch direkt in der APEX Oberfläche über APEX erfolgen, hier soll aber eine saubere Trennung der Umgebung durchgeführt werden, es wird auf die native ORDS Methoden gesetzt. | ||
+ | |||
+ | Ein ORDS wurde bereits für die Verwendung mit APEX konfiguriert und eingerichtet => [[prog: | ||
+ | |||
+ | |||
+ | Ablauf: | ||
+ | * URL Mapping auf den DB Connection Pool " | ||
+ | * Datenbank Schema für REST aktivieren | ||
+ | * Lesenden Zugriff auf das Schema einrichten | ||
+ | * PL/SQL Code für den JSON erstellen und aufrufen | ||
+ | * CRUD Operationen über REST aktivieren | ||
+ | |||
+ | |||
+ | Mit " | ||
+ | |||
+ | |Base ORDS URL |< | ||
+ | |Schema (alias) |< | ||
+ | |Module | ||
+ | |Template | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====URL Mapping für den REST Aufruf einrichten==== | ||
+ | |||
+ | Um die APEX Funktionalität nicht zu beeinträchtigen und eine saubere Trennung zu den APEX DAD zu realisieren wird ein eigenes URL Mapping hinterlegt | ||
+ | |||
+ | |||
+ | Für den Connect zur DB wird dazu der Pool mit dem User " | ||
+ | |||
+ | |||
+ | <code powershell> | ||
+ | C: | ||
+ | |||
+ | java -jar ords.war map-url --type base-path /restsrv apex_pu | ||
+ | |||
+ | Mõr 22, 2017 10:00:01 AM | ||
+ | INFO: Creating new mapping from: [base-path,/ | ||
+ | |||
+ | </ | ||
+ | |||
+ | Im " | ||
+ | |||
+ | |||
+ | D.h. über die **Base ORDS URL** < | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ===Datenbank Schema für REST aktivieren - Schema Alias anlegen=== | ||
+ | |||
+ | |||
+ | In der Datenbank wird das DB Schema " | ||
+ | |||
+ | DB User aktiveren bzw. Schema Alias anlegen: | ||
+ | <code sql> | ||
+ | |||
+ | sqlplus gpi/gpi | ||
+ | |||
+ | |||
+ | BEGIN | ||
+ | ORDS.enable_schema( | ||
+ | p_enabled | ||
+ | p_schema | ||
+ | p_url_mapping_type | ||
+ | p_url_mapping_pattern => ' | ||
+ | p_auto_rest_auth | ||
+ | ); | ||
+ | | ||
+ | COMMIT; | ||
+ | END; | ||
+ | / | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | ====Lesenden Zugriff auf das Schema einrichten==== | ||
+ | |||
+ | ===Modul/ | ||
+ | |||
+ | ÜBer die ORDS.DEFINE_SERVICE Procedure läßt sich der ganze REST Service in einem Zug definieren. | ||
+ | |||
+ | Dazu wird das REST **Module** und das **Template** angelegt: | ||
+ | |||
+ | <code sql> | ||
+ | BEGIN | ||
+ | ORDS.define_service( | ||
+ | p_module_name | ||
+ | p_base_path | ||
+ | p_pattern | ||
+ | p_method | ||
+ | p_source_type | ||
+ | p_source | ||
+ | p_items_per_page => 0); | ||
+ | |||
+ | COMMIT; | ||
+ | END; | ||
+ | / | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Überprüfen mit: | ||
+ | <code sql> | ||
+ | set linesize 130 pagesize 300 | ||
+ | |||
+ | column source_type | ||
+ | column source | ||
+ | column uri_template | ||
+ | column name format a20 | ||
+ | column uri_prefix | ||
+ | column method | ||
+ | column id format 9999999 | ||
+ | |||
+ | ttitle left "ORDS Modules" | ||
+ | |||
+ | select id | ||
+ | , name | ||
+ | , uri_prefix | ||
+ | | ||
+ | order by name | ||
+ | / | ||
+ | |||
+ | ttitle left "ORDS Templates" | ||
+ | select id | ||
+ | , module_id | ||
+ | , uri_template | ||
+ | from user_ords_templates | ||
+ | order by module_id | ||
+ | / | ||
+ | |||
+ | |||
+ | ttitle left "ORDS Handlers" | ||
+ | select id | ||
+ | , template_id | ||
+ | , source_type | ||
+ | , method, source | ||
+ | from | ||
+ | order by id | ||
+ | / | ||
+ | |||
+ | ttitle off | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Nun kann die Tabelle mit **< | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ===Modul/ | ||
+ | |||
+ | Modul anlegen: | ||
+ | <code sql> | ||
+ | BEGIN | ||
+ | | ||
+ | ORDS.define_module( | ||
+ | p_module_name | ||
+ | p_base_path | ||
+ | p_items_per_page => 0); | ||
+ | | ||
+ | commit; | ||
+ | END; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Template anlegen um alles auszulesen | ||
+ | <code sql> | ||
+ | begin | ||
+ | ORDS.define_template( | ||
+ | | ||
+ | | ||
+ | |||
+ | commit; | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | Template anlegen um nur ein Department auszulesen | ||
+ | <code sql> | ||
+ | begin | ||
+ | ORDS.define_template( | ||
+ | | ||
+ | | ||
+ | commit; | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Händler anlegen für das Template " | ||
+ | <code sql> | ||
+ | begin | ||
+ | ORDS.define_handler( | ||
+ | p_module_name | ||
+ | p_pattern | ||
+ | p_method | ||
+ | p_source_type | ||
+ | p_source | ||
+ | p_items_per_page => 0); | ||
+ | commit; | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | Aufruf mit < | ||
+ | |||
+ | |||
+ | Händler anlegen für das Template " | ||
+ | <code sql> | ||
+ | begin | ||
+ | ORDS.define_handler( | ||
+ | p_module_name | ||
+ | p_pattern | ||
+ | p_method | ||
+ | p_source_type | ||
+ | p_source | ||
+ | p_items_per_page => 0); | ||
+ | commit; | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Aufruf mit < | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | === PL/SQL Routine aufrufen === | ||
+ | |||
+ | Soll etwas komplexer abgefragt werden, bietet es sich an den Aufruf über eine PL/SQL Routine zu kapseln. | ||
+ | |||
+ | |||
+ | In diesem Beispiel wird der Übergabe Wert einfach wieder in Großbuchstaben zurückgeben | ||
+ | |||
+ | PL/SQL Beispiel: | ||
+ | |||
+ | <code sql> | ||
+ | create or replace procedure getRestData(p_input_value varchar2) | ||
+ | is | ||
+ | begin | ||
+ | | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | REST Service: | ||
+ | <code sql> | ||
+ | BEGIN | ||
+ | -- Module | ||
+ | ORDS.define_module( | ||
+ | p_module_name | ||
+ | p_base_path | ||
+ | p_items_per_page => 0); | ||
+ | |||
+ | -- Template | ||
+ | ORDS.define_template( | ||
+ | | ||
+ | | ||
+ | |||
+ | -- Händler | ||
+ | | ||
+ | p_module_name | ||
+ | p_pattern | ||
+ | p_method | ||
+ | p_source_type | ||
+ | p_source | ||
+ | p_items_per_page => 0); | ||
+ | | ||
+ | COMMIT; | ||
+ | | ||
+ | END; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | Aufruf mit < | ||
+ | |||
+ | == apex_json Package verwenden == | ||
+ | |||
+ | Beispiel PL/SQL für das anlegen eines eigenen JSON Records, gebe das Datum, die Anzahl der Mitarbeiter und den Eingabewert zurück: | ||
+ | <code sql> | ||
+ | create or replace procedure getRestData(p_input_value varchar2 default null) | ||
+ | as | ||
+ | l_cursor sys_refcursor; | ||
+ | begin | ||
+ | | ||
+ | open l_cursor for | ||
+ | | ||
+ | , (select count(*) from emp) as empcount | ||
+ | , upper(p_input_value) as input_value from dual; | ||
+ | |||
+ | apex_json.open_object; | ||
+ | apex_json.write(' | ||
+ | apex_json.close_object; | ||
+ | | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== CRUD - Daten mit REST Aufruf verarbeiten ==== | ||
+ | |||
+ | |||
+ | ^REST AUFRUF^Aktion^ | ||
+ | |POST| Create or Update| | ||
+ | |PUT | Update| | ||
+ | |DELETE| Delete| | ||
+ | |GET | Read| | ||
+ | |||
+ | Neben dem Lesen soll auch Daten in die DB geschrieben werden. | ||
+ | |||
+ | |||
+ | Tabelle: | ||
+ | |||
+ | <code sql> | ||
+ | |||
+ | create table WAGO_LOG_MESSAGES( ID number(11), log_date date, message varchar2(2000)); | ||
+ | |||
+ | create sequence wago_log_messages_seq; | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Wrapper um in die Tabelle zu schreiben mit POST und zu löschen mit DELETE REST Aufruf | ||
+ | |||
+ | <code sql> | ||
+ | create or replace procedure logMessage(p_task varchar2, p_date varchar2 , p_message varchar2) | ||
+ | is | ||
+ | begin | ||
+ | case p_task | ||
+ | when ' | ||
+ | insert into wago_log_messages ( id, log_date, | ||
+ | (wago_log_messages_seq.nextval, | ||
+ | | ||
+ | when ' | ||
+ | | ||
+ | htp.p(' | ||
+ | when ' | ||
+ | update wago_log_messages set message=p_message where log_date=to_date(p_date,' | ||
+ | htp.p(' | ||
+ | else | ||
+ | htp.p(' | ||
+ | |||
+ | end case | ||
+ | commit; | ||
+ | EXCEPTION | ||
+ | WHEN OTHERS THEN | ||
+ | HTP.print(SQLERRM); | ||
+ | rollback; | ||
+ | end logMessage; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ===POST Handler für INSERT=== | ||
+ | |||
+ | |||
+ | Anlegen mit: | ||
+ | <code sql> | ||
+ | BEGIN | ||
+ | -- Module | ||
+ | ORDS.define_module( | ||
+ | p_module_name | ||
+ | p_base_path | ||
+ | p_items_per_page => 0); | ||
+ | |||
+ | -- Template | ||
+ | ORDS.define_template( | ||
+ | | ||
+ | | ||
+ | |||
+ | -- Händler | ||
+ | | ||
+ | p_module_name | ||
+ | p_pattern | ||
+ | p_method | ||
+ | p_source_type | ||
+ | p_source | ||
+ | p_items_per_page => 0); | ||
+ | |||
+ | COMMIT; | ||
+ | |||
+ | END; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | URL: http:// | ||
+ | Content-Type: | ||
+ | Daten: | ||
+ | </ | ||
+ | |||
+ | ===PUT Handler für UPDATE=== | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | BEGIN | ||
+ | -- Template | ||
+ | ORDS.define_template( | ||
+ | | ||
+ | | ||
+ | -- Händler | ||
+ | | ||
+ | p_module_name | ||
+ | p_pattern | ||
+ | p_method | ||
+ | p_source_type | ||
+ | p_source | ||
+ | p_items_per_page => 0); | ||
+ | |||
+ | COMMIT; | ||
+ | |||
+ | END; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | URL: http:// | ||
+ | Content-Type: | ||
+ | Daten: | ||
+ | </ | ||
+ | |||
+ | ===DELETE Handler für Delete=== | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | BEGIN | ||
+ | -- Template | ||
+ | ORDS.define_template( | ||
+ | | ||
+ | | ||
+ | |||
+ | -- Händler | ||
+ | | ||
+ | p_module_name | ||
+ | p_pattern | ||
+ | p_method | ||
+ | p_source_type | ||
+ | p_source | ||
+ | p_items_per_page => 0); | ||
+ | |||
+ | COMMIT; | ||
+ | |||
+ | END; | ||
+ | / | ||
+ | |||
+ | </ | ||
+ | |||
+ | < | ||
+ | URL: http:// | ||
+ | Content-Type: | ||
+ | Daten: | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | ==== Quellen ==== | ||
+ | |||
+ | |||
+ | Doku: | ||
+ | * Implicit Parameters => https:// | ||
+ | |||
+ | |||
+ | Oracle | ||
+ | |||
+ | * Developing Oracle REST Data Services Applications => http:// | ||
+ | |||
+ | |||
+ | Web | ||
+ | |||
+ | * https:// | ||
+ | * http:// |
prog/ords_rest_service.txt · Zuletzt geändert: 2018/10/18 09:52 von gpipperr