Logo Oracle Deutschland   Application Express Community
Einfacher Informationsaustausch mit RSS-Feeds I: RSS Feeds "konsumieren"
Erscheinungsmonat APEX-Version Datenbankversion
Januar 2012 ab 4.0 ab 10.2

RSS (Really Simple Syndication) ist ein sehr einfaches, auf XML basierendes, Format zum Austausch von Nachrichten im Internet. Nahezu alle Informationsseiten oder Blogs bieten RSS-Feeds an. Wird der RSS-Feed mit einer Anwendung abonniert, so ruft diese das XML (regelmäßig) ab, liest es aus und stellt die Inhalte in übersichtlicher, lesbarer Form dar. Einige Beispiele für RSS-Feeds sind ...

In diesem Tipp wird vorgestellt, wie Sie einen RSS-Feed in Ihrer APEX-Anwendung abonnieren und die Inhalte auf einer der Seiten darstellen können. Grundsätzlich kann dieser Tipp auf allen APEX-Versionen nachvollzogen werden - lediglich das am Ende vorgestellte APEX-Plugin Simple RSS Reader erfordert mindestens APEX 4.0. Generell ist das Einbinden eines RSS-Feeds in APEX einfacher, als man denkt - erforderlich sind nur drei Schritte:

  • Zunächst muss der RSS Feed abgerufen werden - das wird mit PL/SQL erledigt. Für einfache Fälle reicht HTTPURITYPE, ist das Aufsetzen der HTTP-Verbindung aufwändiger, so kann auch mit dem Paket UTL_HTTP gearbeitet werden.
  • Zum Extrahieren der Informationen aus dem RSS-Feed werden XML-Funktionen benötigt, denn wie zu Beginn erwähnt, basiert das RSS-Format auf XML. Die nötigen Funktionen stehen direkt als SQL-Funktionen bereit.
  • Die Darstellung selbst erfolgt mit APEX-Bordmitteln - meist bietet sich die Verwendung eines Berichts an.

Voraussetzungen

Das Abrufen eines RSS-Feeds ist eine Netzwerkoperation. Das bedeutet, dass zunächst EXECUTE-Rechte am Paket UTL_HTTP bzw. an dem Objekttypen HTTPURITYPE benötigt werden. Das ist auf den meisten Systemen standardmäßig bereits der Fall. Arbeitet man auf einer 11g-Datenbank, so muss zusätzlich vom DBA eine Netzwerk-ACL für den Zugriff auf den Server mit dem RSS-Feed eingerichtet werden. Mehr zu Netzwerk-ACLs können Sie in einem Community-Tipp nachlesen - zum Zugriff auf den RSS-Feed von www.apex-plugin.com müsste der DBA die ACL wie folgt einrichten.

begin
  dbms_network_acl_admin.create_acl(
    acl =>         'apex-RSS-network.xml',
    description => 'Netzwerk-Connects zum Abruf von RSS-Feeds',
    principal =>   'SCOTT', -- PARSING SCHEMA der Anwendung
    is_grant =>    true,
    privilege =>   'connect'
  );
  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
    acl =>         'apex-RSS-network.xml',
    principal =>   'SCOTT', -- PARSING SCHEMA der Anwendung
    is_grant  =>   true,
    privilege =>   'resolve'
  );
  dbms_network_acl_admin.assign_acl(
    acl =>         'apex-RSS-network.xml',
    host =>        'www.apex-plugin.com',
    lower_port =>  80,
    upper_port =>  80
  );
end;
/
sho err
    
commit
/

Erste Schritte

Anschließend kann man in SQL*Plus, dem SQL Developer oder dem APEX SQL Workshop den ersten Test wagen: Die XML-Inhalte des RSS-Feeds werden in Abbildung 1 zunächst einfach nur abgerufen. Beachten Sie, dass Sie den Proxy-Server mit UTL_HTTP.SET_PROXY setzen müssen, wenn sich der Datenbankserver hinter einer Firewall befindet (was ja üblicherweise der Fall ist).

Das XML des RSS-Feeds lässt sich in SQL*Plus abrufen

Abbildung 1: Das XML des RSS-Feeds lässt sich in SQL*Plus abrufen

Mit SQL-Funktionen kann das zurückgelieferte XML nun zerlegt werden. Am einfachsten ist das extrahieren von Titel und Link für jeden Eintrag im RSS-Feed.

begin
  utl_http.set_proxy('{proxyserver}:{proxyport}');
end;
/

select
  title,
  link
from
  xmltable(
    '//item'
    passing httpuritype('http://www.apex-plugin.com/oracle-apex-plugins/rss').getxml()
    columns
     title varchar2(200) path '/item/title/text()',
     link  varchar2(500) path '/item/link/text()'
  )
/

TITLE                          LINK
------------------------------ --------------------------------------------------
RDS Customizable               http://www.apex-plugin.com/oracle-apex-plugin ...
ClariFit From To Date Picker   http://www.apex-plugin.com/oracle-apex-plugin ...
Bookmark                       http://www.apex-plugin.com/oracle-apex-plugin ...
ClariFit Dialog                http://www.apex-plugin.com/oracle-apex-plugin ...
JasperServer Report Tunnel     http://www.apex-plugin.com/oracle-apex-plugin ...
Month Picker                   http://www.apex-plugin.com/oracle-apex-plugin ...
:                              :

Einbinden in eine APEX-Anwendung

Mit dieser SQL-Abfrage kann der RSS-Feed also abgerufen und direkt "zerlegt" werden - stellt man sie nun als View RSS_APEXPLUGIN bereit, so kann mit APEX-Bordmitteln ein Bericht erzeugt werden (Abbildung 2). Natürlich lässt sich dieser auch ohne View, direkt mit der SQL-Abfrage, einrichten.

Ein APEX-Bericht auf Basis der View wird erstellt

Abbildung 2: Ein APEX-Bericht auf Basis der View wird erstellt

Der mit UTL_HTTP eingestellte Proxyserver gilt allerdings nicht für die APEX-Applikation - daher sieht ein erster Test der Anwendungsseite wie in Abbildung 3 aus.

Der erste Versuch schlägt fehlt - der Proxyserver ist nicht eingestellt

Abbildung 3: Der erste Versuch schlägt fehlt - der Proxyserver ist nicht eingestellt

Navigieren Sie dazu zu den Gemeinsamen Komponenten und klicken Sie dann auf der rechten Bildschirmseite auf Definition bearbeiten. Stellen Sie dann den Proxyserver, wie in Abbildung 4 dargestellt, ein.

Proxyserver für die Anwendung einstellen

Abbildung 4: Proxyserver für die Anwendung einstellen

Das reicht jedoch noch nicht aus - denn der in APEX eingestellte Proxy-Server ist nur für APEX-Standardkomponenten wirksam. Für den Bericht, der eine View selektiert, die im Hintergrund tatsächlich eine Netzwerkverbindung aufbaut, funktioniert es (noch) nicht. Allerdings steht die Angabe nun in der Umgebungsvariablen APEX_APPLICATION.G_PROXY_SERVER bereit, so dass es ein Einfaches ist, einen PL/SQL-Prozess einzurichten, der Beim Laden der Seite - Vor Header ausgeführt wird (Abbildung 5) ...

PL/SQL Prozess einrichten: Beim Laden der Seite - Vor Header

Abbildung 5: PL/SQL Prozess einrichten: Beim Laden der Seite - Vor Header

... und den Proxy-Server mit folgendem Code setzt.

begin
  utl_http.set_proxy(apex_application.G_PROXY_SERVER);
end;

Das Ergebnis sieht dann wie in Abbildung 6 aus.

Der APEX-Bericht zeigt die Inhalte des RSS-Feeds an

Abbildung 6: Der APEX-Bericht zeigt die Inhalte des RSS-Feeds an

Mit ein wenig Einrichtung und Formatierung werden die Berichtszeilen anklickbar ...

Der Bericht ist fertig formatiert - und die Einträge können geklickt werden

Abbildung 7: Der Bericht ist fertig formatiert - und die Einträge können geklickt werden

Neben der reinen Darstellung sind natürlich auch andere Operationen denkbar; so könnte ein Datenbankjob (DBMS_SCHEDULER) den RSS-Feed regelmäßig abrufen und die Inhalte in eigene Tabellen speichern. Je nach Inhalt des RSS-Feeds wäre auch automatisierter Mailversand oder ähnliche Aktionen denkbar. Den Möglichkeiten sind hier keine Grenzen gesetzt.

Beschränkt man sich dagegen auf die reine Darstellung der Inhalte, so ist die beschriebene manuelle Arbeit eigentlich nicht nötig - denn es gibt ein APEX-Plugin dafür.

Ein APEX-Plugin verwenden

Es geht natürlich auch einfacher - denn diese Arbeit kann auch von einem APEX Plugin übernommen werden. Das Simple RSS Reader Plugin übernimmt alle hier vorgestellten Schritte und muss "nur" noch konfiguriert werden (Abbildung 8).

Einrichtung des APEX-Plugins "Simple RSS Reader"

Abbildung 8: Einrichtung des APEX-Plugins "Simple RSS Reader"

Wie man sehen kann, nimmt das Plugin dem Entwickler eine ganze Menge Arbeit ab; Dinge wie "Asynchrones Refresh" werden automatisch erledigt. Mit dem Plugin ist auch das Aufnehmen mehrerer Feeds auf eine APEX-Seite kein Problem mehr: die Seite reagiert und kann genutzt werden, auch wenn einer der RSS-Feeds etwas langsamer arbeiten sollte.

Das Plugin "Simple RSS Reader" in Aktion: Mehrere RSS-Feeds auf einer Seite

Abbildung 9: Das Plugin Simple RSS Reader in Aktion: Mehrere RSS-Feeds auf einer Seite

Fazit

Die Einbindung externer Informationen per RSS in eine APEX-Anwendung ist ein Kinderspiel. Einfache Fälle erledigt das APEX-Plugin; soll es individueller werden, so ist die technische Grundlage innerhalb weniger Minuten gelegt - mit der SQL-Abfrage zum Extrahieren der Informationen können beliebig PL/SQL-Prozeduren, -Funktionen oder andere Datenbankaktivitäten gestartet werden.

Zurück zur Community-Seite