URL-Mysterien von Lotus Notes/Domino
19. März 2006 von Wolfgang SommergutSeit der Einführung des Domino-Servers in der Version 4.5 von Lotus Notes können Dokumente und viele Design-Elemente über URLs im Browser abgerufen werden. Dafür gibt es eine durchgängige Syntax nach dem Muster http://Host/Database/DominoObject?Action&Arguments
(einen guten Überblick bietet dieser Beitrag auf developerWorks). Das erleichtert die Entwicklung von Web-Anwendungen, in der Praxis hat dieses Konzept jedoch immer wieder seine Tücken.
Das Projekt, an dem ich zurzeit arbeite, nutzt fast ausschließlich Lotusscript-Agents, die auf dem Domino-Server laufen. Dabei ist mir aufgefallen, dass man ein solches Script nicht unbedingt nach der vorgegebenen Syntax http://Host/Database/Agentnamet?OpenAgent&Arguments
ansprechen muss. Beispielsweise kann ich einen Agent namens import über ein bloßes http://Host/Database/import
aufrufen. Das klappt aber nur dann, wenn der Funktion keine Argumente übergeben werden. Ein http://Host/Database/import?Arguments
quittiert der Domino-Server mit einem HTTP 404. Man könnte jetzt natürlich fragen, wo das Probleme liege. Schließlich braucht man ja nur das OpenAgent
anhängen und alles wird gut.
Die Schwierigkeiten mit der Domino-URL-Syntax treten indes auf, wenn man einen Agent im action-Attribut eines HTML-Fomulars angeben will. Jeder gängige Browser generiert aus
<form method="GET" action="http://Host/Database/import?OpenAgent">
<input type="text" name="eingabe"/>
</form>
eine URL, in der das Suffix „?OpenAgent“ fehlt. Entsprechend scheitert der Aufruf mit einem HTTP 400 oder 404. Ich habe mir in der Vergangenheit damit beholfen, dass ich im HTML-Formular beim Submit-Event per Javascript die korrekte URL zusammengebaut und über die href-Eigenschaft des location-Objekts abgeschickt habe. Dieses Verfahren ist auf Dauer etwas aufwändig. In der Dokumentation von IBM habe ich allerdings keinen Hinweis gefunden, wie man das Problem lösen könnte.
Durch Herumprobieren habe ich kürzlich einen einfacheren Weg entdeckt. Man gibt über das Formular gleich am Anfang einen vesteckten Parameter mit dem Wert OpenAgent mit:
<form method="GET" action="http://Host/Database/import?OpenAgent">
<input type="hidden" name="OpenAgent" value="">
<input type="text" name="eingabe"/>
</form>
Das Ergebnis ist zwar keine völlig korrekte URL im Sinne von Domino, weil auf ?OpenAgent nocht ein ‚=‘ folgt. Aber das scheint nicht zu stören, zumindest nicht in der Version 6 von Notes/Domino. Alternativ könnte man natürlich das Formular via method="post"
an den Server schicken. In diesem Fall werden die Parameter nicht an die URL angehängt, so dass der Aufruf auch ohne ?OpenAgent klappt. Da allerdings das Aufbereiten von Formulardaten, die als multipart/form-data codiert sind, in Lotusscript nur wenig Freude macht, hat die POST-Variante auch ihre Nachteile (und selbst das einfachere application/x-www-form-urlencoded erfordert Handarbeit, weil Lotusscript auch dafür keine Routine anbietet).
Kategorie: Messaging und Collaboration Ein Kommentar »
Hallo Wolfgang.
Fuer POST (normale forms) hatte ich mal ne generische Routine geschrieben die ein Notes Dokument mit allen Feldern macht. eMail mir wenn Du die haben willst.
Die andere Variante ist es forms zu haben (da geht dann auch Multipart) und den agenten im querysave zu haben. Problem dabei: wenn die Felder voll dynamische sind geht es nicht. In R5 gab das noch einen Fehler in R6 werden die schweigend weggeschmissen.
Wenn Deine Anforderungen „nur“ konfigurierbare formulare sind wuerde ein DXL gesteuertes erzeugen der forms eine alternative darstellen. Je nach Anforderung koennte man dann submit und agent entkoppeln, was den antwortzeiten zugute kommen wuerde. Der agent wuerde dann mit „if documents are created or changed“ laufen. Wenn das zulange dauert: im $$Return auf einen sprungseite gehen die per Ajax den abarbeite Agenten started (das ist dann zeitnah aber asychnron)
:-) stw