Web-Service-Anwendungen mit APEX

Werbung
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
Herunterladen