26 Dez 2006 

Eine Perle

Wer es noch nicht entdeckt hat: 4D pflegt ein Code-Archiv. Da versteckt sich manche Perle. Von einer will ich berichten. Sie nennt sich

HTTP Download, V11-Version

und wird so erklärt: Eine einzige Methode, erlaubt HTTP Download von HTML oder Dokumenten (Jpg, Gif, pdf) als Blob, als Bild oder als Text. Benötigt 4D 2004.1 oder neuer und 4D Internet Commands. Da nur eine Methode, ist sie einfach in Anwendungen integrierbar.
Frage: Download macht mein Browser, zu was ist das in meiner 4D-Anwendung gut? Antwort: um das Internet in die Datenbank zu integrieren und zwar nahtlos.

Gängige Frage mit einer leichten Antwort:

Was ist meine IP?

What is my IP?Von Hand geht das so: Sie besuchen whatismyip.org und lesen Ihre IP im Browserfenster. Dann tragen Sie sie in 4D ein, selbst mit Kopieren & Einsetzen, ist nicht der Weisheit letzter Schluß.
Jetzt lernen Sie die Perle das erste mal kennen. Diese drei Zeilen Code reichen, um 4D die IP auslesen zu lassen:
$resultText:=""
$url:="http://whatismyip.org/"
HTTP_Download ("text";->$resultText;$url)
In der $resultText steht dann die IP. Sie können das gebrauchen? Ich auch :-)

Sie wollen unabhängig sein von whatismyip.org? Nichts einfacher als das. Eine minimale HTML-Seite mit diesem Inhalt <html><body><p><!--#echo var="REMOTE_ADDR"--></p></body></html> anlegen und auf dem eigenen WebSpace im Zugriff halten. Das ist ein ServerSideInclude-Befehl, den kann jeder Apache.

Adressen verifizieren und lokalisieren

Google Map Das Navigationssystem im Auto oder im Internet befragen ist eine Methode. Im Browser sieht das bei maps.google.de so aus: Straße und Ort eingeben und auf Adresse suchen klicken. Wird die Adresse gefunden, taugt sie was. Ist mühsam, wenn es mehr als einige wenige Adressen sind.

Gehen wir den Weg allen Re-Engineerings! Eine Such-URL sieht in Google-Map so aus:
http://maps.google.de/maps?f=q&hl=de&q=hanns-braun-str,+neufahrn&sll=50.092393,10.195313&sspn=19.400297,32.783203&ie=UTF8&z=16&om=1
Um die Such-URL rauszufinden, kopiert man den Link hinter URL zu dieser Seite. Es steckt mehr drin, als wir bereits wüßten oder was wir brauchten. Z.B. sll=50.092393,10.195313, das viel zu weit nördlich für das Suchbeispiel – erinnert mich an die Koordinate meines Providers. Zum Starten einer Suche reicht bereits dieser Teil hin http://maps.google.de/maps?f=q&hl=de&q=hanns-braun-str,+neufahrn, wie man leicht durch Klick auf den Link nachprüfen kann.

Wie oben beschrieben, könnte ich mit HTTP_Download die URL verschicken und erhielte den Source-Code der Ergebnis-Seite. Diesen könnte ich parsen … muß aber nicht sein. Zu meiner Freude bietet Google die Koordinaten in effizienteren Formaten an. Das eine ist KML (Keyhole Markup Language, ich merke mir Koordinaten ML besser) ein XML-Derivat und JSON (JavaScript Object Notation), ein Format nicht nur für JavaScript.

Maps Ich ergänze die kurze Variante der oben dargestellten URL um &output=kml und verschicke diese http://maps.google.de/maps?f=q&hl=de&q=hanns-braun-str,+neufahrn&output=kml. Das von Google gelieferte Dokument heißt maps und landet in meinem Download-Ordner. Maps ist Text, xml formatiert, genauer kml und ja, keine Extension. Zur besseren Lesbarkeit dargestellt in BBEdit und bereits durch Markup/Utilities/Format aufbereitet. In <name> steht die lokale Schreibweise, in <address> die für Computer und andere Verwender mit begrenztem Zeichenvorrat und in <coordinates> die Koordinaten als Dezimalgrad (Grad + Minuten/60 + Sekunden/3600). Der erste Wert ist der Längengrad, der zweite der Breitengrad und wenn vorhanden die Höhe über dem Meeresspiegel, ansonsten eine Null.

Nun lernen Sie die Perle ein zweites Mal kennen: schicke ich die ULR per HTTP_Download los, bekomme ich das KML-Dokument direkt in 4D zurück, wahlweise als Text oder als Blob.

Text parsen oder XML-auseinandernehmen per DOM oder SAX?

HTTP_Download liefert das Ergebnis wahlweise als Text oder als Blob. Es sind nur 4 kB, dann ist Text einfacher zu handhaben
$resultText:=""
$url:="http://maps.google.de/maps?f=q&hl=de&q=hanns-braun-str,+neufahrn&output=kml"
HTTP_Download ("text";->$resultText;$url)
und parse nach strAfter($resultText;"</coordinates>") und strBefore($resultText;"</coordinates>") und erhalte 11.655750,48.316272,0. Über myNum* die erste Koordinate in den Längengrad und die zweite in den Breitengrad. Die dritte ist die z-Koordinate für m ü.NN und meistenteils noch Null.

Blob ist praktisch, da die DOM XML Befehle auch Blobs als Quelle akzeptieren. Nur spielen die DOM XML Befehle nicht immer mit – melden fälschlicherweise ein nicht koscheres XML. Die SAX XML Befehle sind mit den kml-Dokumenten toleranter, eignen sich für Routing-kmls. Doch leider akzeptieren SAX XML Befehle kein Blob, laden das XML nur von Platte.

Andere Beispiele?

Klar! Kurse abfragen oder die Bahn-Verbindung oder … weitere Beispiele, wenn denn welche kommen, werde ich hier veröffentlichen oder verlinken.

* myNum wrapped die Text-in-Zahl-Konvertierung per Num, d.h. ersetzt Punkt durch Komma und umgekehrt

Massenabgleich! Google hat ganz frisch (Dez '06) seine Nutzungsrechte verändert. Neu ist die Grenze von 50.000 Ortsabfragen pro Tag, mehr werden nicht mehr gewährt und die verwendete Google-ID ggf. für einen von Google festgelegten Zeitraum gesperrt.

4D Themen: Berichte in Arbeit