Wolkig bis heiter APEX als Drehkreuz für Web Service-Anwendungen Andreas Wismann WHEN OTHERS Beratung | Projektmanagement | Coaching rund um Oracle Application Express In APEX Informationen von "woanders" holen • RSS Feed • HTML von anderen Websites, <IFRAME> • Text • CSV Web Service • XML • binäre Daten • JSON } In APEX Informationen von "woanders" holen RSS Feed … • HTML von anderen Websites (IFRAME) • Text • CSV • XML • binäre Daten • JSON ACL (Access Control List), ab Oracle 11g • APEX_040200 • APEX_PUBLIC_USER • das Parsing-Schema einer APEX-Anwendung 1. ACL anlegen mit Privileg connect DBMS_NETWORK_ACL_ADMIN.CREATE_ACL ( acl => 'apex-internetzugang.xml', description => 'APEX-Internetzugang vom Workspace XYZ', principal => 'MEIN_PARSING_SCHEMA', -- anwendungsbezogen is_grant => true, privilege => 'connect' ); 2. Privileg resolve hinzufügen DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE ( acl => 'apex-internetzugang.xml', principal => 'MEIN_PARSING_SCHEMA', is_grant => true, privilege => 'resolve' ); 2. Host-Angaben hinzufügen DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL ( acl => 'apex-internetzugang.xml', host => '*', -- oder z.B.: 'localhost' lower_port => NULL, -- oder z.B.: '80' upper_port => NULL -- oder z.B.: '8080' ); Berechtigungen? SELECT , , , , , FROM ; USER PRIVILEGE host lower_port upper_port status user_network_acl_privileges SELECT * FROM dba_network_acls NATURAL JOIN dba_network_acl_privileges; Voraussetzung: APEX Listener 2.0 bzw. Oracle Rest Data Services, ORDS • mit anderen APEX-Architekturen stehen die Web Service Features nicht zur Verfügung • Konfigurationsskript (siehe Doku): @apex_rest_config.sql RSS-Feed lesen Demo 1 RSS-Feed lesen Alternativen: • APEX Plugins • Beispielanwendung analysieren Region Type "URL" Region Type "URL" CSV-Daten lesen Demo UTL_HTTP CSV-Daten lesen <?PHP // Skript auf einem Webserver print ( '15;1;10 Wismann;Andreas;Hirschstr. 10;41564;Kaarst;0176 7800 3109 Wismann;Silke;Hirschstr. 10;41564;Kaarst;' ); ?> UTL_HTTP.REQUEST :P500_RESULTS := UTL_HTTP.REQUEST ( url => 'http://myserver.com/service?' || :P500_PARAMS , proxy => NULL ); • datenbankseitige HTTP-Anfrage • wartet auf Antwort vom entfernten Server • benötigt ebenfalls ACL-Privilegien Paramterübergabe: Werte aufbereiten! UTL_HTTP.REQUEST • Müssen die Ergebnisse umgewandelt werden? • wohin damit? -- zum Beispiel: in einer PL/SQL-Region -- zum Browser schicken… SYS.HTP.P ( :P500_RESULTS ); HTTPURITYPE select httpuritype ('http://google.com').getclob() from dual APEX-Instanz für Web Services "freischalten" • INTERNAL > Manage Instance > Security 2 "Typen" von Web Services • REST Representational State Transfer • einfach zu erstellen, testen, verwenden • SOAP Simple Object Access Protocol • immer XML • aufwändiger zu implementieren • mächtiger REST Web Services • GET • HEAD • POST • PUT • DELETE Information ("Ressource") abrufen nur Header senden (schnelle Anfrage) Daten übermitteln Dateibasierter Upload Ressource löschen • TRACE gibt die Anfrage 1:1 zurück (Debugging) • OPTIONS • CONNECT Einen APEX-Report Web-Service-fähig machen Report > Edit Region > Region Definition Report als Web Service: Voraussetzungen • Seite muss "Page is Public" sein (keine Authentifizierung erforderlich) • Report-Region braucht eine "Static ID" • Static ID muss DOM- bzw. URL-konform sein • nicht sondern oder mein Report mein_Report meinReport Einen APEX-Report Web-Service-fähig machen • RESTful Classic Report localhost Ergebnisse testen? • URL im Browser aufrufen (sehr unterschiedliche Ergebnisse …) • Testen mit APEX selbst • Tools beispielsweise SoapUI http://sourceforge.net/projects/soapui/ Web-Service-Ausgabe eines APEX-Reports <?xml version="1.0"?> <ROWSET> <ROW> <PRODUCT_ID>41</PRODUCT_ID> <PRODUCT_NAME>Business Shirt</PRODUCT_NAME> <PRODUCT_DESCRIPTION>Wrinkle-free cotton business shirt</PRODUCT_DESCRIPTION> <CATEGORY>Mens</CATEGORY> <PRODUCT_AVAIL>Y</PRODUCT_AVAIL> <LIST_PRICE>50</LIST_PRICE> <MIMETYPE>image/jpeg</MIMETYPE> <FILENAME>shirt.jpg</FILENAME> <IMAGE_LAST_UPDATE>18.09.2011</IMAGE_LAST_UPDATE> </ROW> <ROW> <PRODUCT_ID>42</PRODUCT_ID> <PRODUCT_NAME>Trousers</PRODUCT_NAME> <PRODUCT_DESCRIPTION>Black trousers suitable for every business man</PRODUCT_DESCRIPTION> <CATEGORY>Mens</CATEGORY> <PRODUCT_AVAIL>Y</PRODUCT_AVAIL> <LIST_PRICE>80</LIST_PRICE> <MIMETYPE>image/jpeg</MIMETYPE> <FILENAME>pants.jpg</FILENAME> <IMAGE_LAST_UPDATE>18.09.2011</IMAGE_LAST_UPDATE> </ROW> </ROWSET> Classic Report als Web Service-Quelle • REST • Adresse wie beispielsweise http://... /apex_rest.getReport?app=121&page=3 &reportid=customers • XML-Ausgabe Interaktiver Report als Web Service-Quelle Iocalhost Interaktiver Report als Web Service-Quelle • REST • Adresse wie beispielsweise http://... /apex_rest.getReport?app=121&page=3 &reportid=customers • XML-Ausgabe • Filter-Einstellungen und sonstige gespeicherten Vorgaben werden beim Abruf des Web Service nicht berücksichtigt • Ergebnismenge entspricht "dem" SQL Query JSON • schlankes Text-Austauschformat • Objekte können serialisiert werden • unmittelbar verwendbar in JavaScript • viel einfacher, aber nicht so mächtig wie XML • native JSON-Unterstützung in Oracle 12g XML JSON <employees> <employee> <firstName>John</firstName> <lastName>King</lastName> </employee> <employee> <firstName>Rita</firstName> <lastName>Clark</lastName> </employee> <employee> <firstName>Pete</firstName> <lastName>Scott</lastName> </employee> </employees> {"employees":[ {"firstName":"John", "lastName":"King"}, {"firstName":"Rita", "lastName":"Clark"}, {"firstName":"Pete", "lastName":"Scott"} ]} APEX-Instanz für Web Services "freischalten" • INTERNAL > Manage Instance > Feature Configuration SQL Workshop > RESTful Services apex.oracle.com { "next": { "$ref": "https://apex.oracle.com/pls/apex/when_others/doag/beispiel/get?page=1" }, "items": [ { "object_name": "DEMO_REPORT_FUNCTION", "object_id": 23904506, "object_type": "FUNCTION", "created": "2013-10-10T21:42:52Z", "last_ddl_time": "2013-10-11T09:29:02Z", "timestamp": "2013-10-11:09:29:02", "status": "VALID", "temporary": "N", "generated": "N", "secondary": "N", "namespace": 1 }, { "object_name": "DEMO_TABLE", "object_id": 28971750, "data_object_id": 28971750, "object_type": "TABLE", "created": "2014-05-28T01:45:07Z", "last_ddl_time": "2014-05-28T01:45:07Z", "timestamp": "2014-05-28:01:45:07", "status": "VALID", "temporary": "N", "generated": "N", "secondary": "N", "namespace": 1 } ] JSON } SOAP in APEX • … nur in der Rolle des Konsumenten • Web Service Reference erzeugen (Shared Components > Web Service References) • URL der WSDL, oder manuell einen SOAP Envelope eingeben • Wizards verwenden: "Form on a Web Service" "Form and Report on a Web Service" apex.oracle.com Package APEX_WEB_SERVICE (Verarbeitung von REST und SOAP Web Services) ■ Function BLOB2CLOBBASE64 ■ Function CLOBBASE642BLOB ■ Procedure MAKE_REQUEST ■ Function MAKE_REQUEST ■ Function MAKE_REST_REQUEST ■ Function PARSE_RESPONSE ■ Function PARSE_RESPONSE_CLOB ■ Function PARSE_XML ■ Function PARSE_XML_CLOB Package APEX_WEB_SERVICE DBMS_OUTPUT.PUT_LINE ( apex_web_service.parse_xml ( p_xml => apex_web_service.make_request ( p_url ,p_action => 'http://betriebskantine.org' => '…/getTagesmenue' ,p_envelope => XML ) ) ); ,p_xpath => '//Tagesmenue/text()' ,p_ns => 'xmlns="http://betriebskantine.org"' youtube-Videoliste per Google API apex.oracle.com Youtube-Player in APEX (HTML-Region) <iframe title="&P9_VIDEO_TITLE." width="320" height="210" src="http://www.youtube.com/embed/&P9_VIDEO_ID.?rel=0" frameborder="0" allowfullscreen> Youtube-Player in APEX (Escape-Prozess) -- sicher ist sicher… :P9_VIDEO_TITLE := APEX_ESCAPE.HTML (:P9_VIDEO_TITLE); :P9_VIDEO_ID := APEX_ESCAPE.HTML (:P9_VIDEO_ID); <iframe title="&P9_VIDEO_TITLE." width="320" height="210" src="http://www.youtube.com/embed/&P9_VIDEO_ID.?rel=0" frameborder="0" allowfullscreen> Zusammenfassend… Feature APEX-Bordmittel verfügbar auf apex.oracle.com Webinhalte in APEX darstellen Region Type URL JA Webinhalte mit PL/SQL lesen UTL_HTTP NEIN REST konsumieren Web Service References JA REST erzeugen Reports, RESTful Services NEIN, JA SOAP konsumieren Web Service References JA SOAP erzeugen NEIN - Buchtipps • Kindle-Version gestern(?) gratis auf amazon.de WHEN OTHERS Beratung | Projektmanagement | Coaching rund um Oracle Application Express Andreas Wismann Dipl.-Informatiker (FH) http://when-others.com [email protected] +49 176 7800 3109 +49 2131 314 9966 @whenothers