1. August 2011

Der Browser in eurer Datenbank: HTTPURITYPE

The simple browser in your database: HTTPURITYPE
Wenn es darum geht, HTTP-Zugriffe aus der Datenbank heraus zu machen, ist das Paket UTL_HTTP natürlich das Mittel der Wahl - damit kann ein Browser komplett imitiert werden; vom Setzen der HTTP Header Felder oder von Cookies bis hin zu den HTTP Methoden GET und POST ist alles drin, was man braucht.
When it's about doing HTTP requests with PL/SQL - there's only one answer: UTL_HTTP. UTL_HTTP allows you to mimick a web browser completely in the database - one can set cookies, HTTP headers, do GET and POST requests and much more.
In vielen Fällen braucht man das alles aber nicht - es muss einfach nur etwas per HTTP abgerufen werden. Und für genau diese Fälle gibt es die ganz einfache Variante: HTTPURITYPE - das kann man nutzen wie eine SQL-Funktion und es macht die ganze Arbeit auf einmal.
But in most cases these cool stuff is just not needed - all we want to do is a simple, plain HTTP request - no cookies, no special HTTP headers; nothing. And yes: There is a simple variant: HTTPURITYPE can be used like a SQL function and it does the whole work in one shot.
Da passiert erstmal noch nix ... Los geht's, wenn Ihr den Content selbst mit GETBLOB(), GETCLOB() oder GETXML() abruft.
Not much at the first glance. To have the database actually do the HTTP request you need to add one of the methods GETXML(), GETBLOB() or GETCLOB() ...
Alles klar, dann setzen wir noch den Proxy ...
Ok, ok ... go ahead and set the proxy server ...
Voilá. HTTPURITYPE kann den Code wirklich ganz massiv vereinfachen - und wenn eine einfache Lösung ausreicht, dann soll man diese ja auch nutzen. Und als kleinen Exkurs kann man das Beispiel ja noch fortsetzen, indem man das XML auch direkt zerlegt ...
And that's it - HTTPURITYPE is a great code simplification when it's about HTTP and PL/SQL. And we could continue this example and start to shred the XML we got back ...
Einen RSS-Feed abholen und direkt zerlegen - mit nur einer SQL-Abfrage. Einfacher geht es nun wirklich nicht.
Fetching an RSS feed and parsing it into a database table with just one SQL query - there is no simpler way ...
Ach ja ... fast hätte ich das vergessen. Ab Oracle11g braucht Ihr noch zusätzliche Netzwerk-Privilegien, damit Ihr aus der Datenbank überhaupt herauskommt: Mit dem PL/SQL-Paket DBMS_NETWORK_ACL_ADMIN müsst Ihr uerem Datenbankuser für die einzelnen Netzwerkziele freischalten. Wie das geht, ist in diesem Blog-Posting beschrieben.
And (last but not lease) one important point: On Oracle11g (or higher) you need special networking privileges - EXECUTE on UTL_HTTP is not sufficient. Using the package DBMS_NETWORK_ACL_ADMIN the DBA needs to enable the individual network "targets" for a specific database user. The blog posting describes the process.

Kommentare:

Jonas Gassenmeyer hat gesagt…

Hallo Carsten,

ich habe eine Frage zu setproxy().
Momentan klappen meine Aufrufe nur, wenn ich die IP Adresse statt der URL für den WebProxy angebe. Als Entwickler kann ich nicht nachvollziehen, wie die Netzwerkeinstellungen auf dem DB Host sind.
Mir ist auch netzwerktechnisch nicht klar, wie die Prozedur setproxy() die URL weiterreicht. Wer ist danach für die Namensauflösung in eine IP zuständig? Die reguläre Host Datei des DB Servers?

Habe ich über meine Session (evtl. als DBA) eine Möglichkeit, diese Einstellungen zu prüfen?

Was super wäre, wenn es einen Weg gibt, den Proxy Server über einen PAC Server oder ähnliche Konfigurationsmöglichkeiten zu setzen. Kennst Du da einen Weg?

Danke im Voraus und viele Grüße
Jonas

Carsten Czarski hat gesagt…

Hallo Jonas,

die Namensauflösung wird auf Betriebssystemebene des DB Servers gemacht. Das wäre also die Hosts Datei oder ein auf dem DB Server konfigurierter Nameserver (/etc/resolv.conf). Bei SET_PROXY kann aber nur eine IP Adresse oder ein Servername eingerichtet werden. Proxy Skripte wie im Browser ("automatische Proxy-Konfiguration") werden hier nicht unterstützt.

Grüße


Carsten

Beliebte Postings