dimanche, juillet 16, 2006

AJAX - Lire un fichier en dehors du domaine

Comme précédemment indiqué, les applications AJAX ne peuvent pas accèder aux fichiers en dehors du domaine Internet de la page appelante (il est toutefois à noter que cette limitation ne semble pas toucher Microsoft Internet Explorer). La méthode préconisée pour dépasser cette limite, quelque soit le navigateur Web utilisé, est de passer par un "Cross-Domain Proxy".

Cross-Domain Proxy

Un "cross-domain proxy" n'est rien de plus qu'une application hébergée dans le domaine , qui va télécharger le fichier extérieur souhaité et le renvoyer vers l'application AJAX. Cette technique est notamment utilisée par NetVibes. En ouvrant NetVibes avec l'extension de Firefox Firebug, on constate que les fils RSS de la page sont appelés à travers une URL du type : http://www.netvibes.com/xmlProxy.php?url=http%3A//swww.acme.com/rss.xml

L'application PHP xmlProxy.php se contente de récupérer le fichier XML et de la transmettre au navigateur Web. Il ne traite pas d'informations avant expédition. Celà permet de ne pas surcharger le serveur en laissant cette tâche au poste client.

Lotus Domino Cross-Domain Proxy

Pour faire la même chose avec Lotus Notes j'ai commencé par utiliser la méthode "ALAX" présentée dans l'article "La recherche d'informations sur l'Internet depuis un client Lotus Notes". Malheureusement il semble que la propriété responseText gère mal, voire pas du tout, les charset autres que UTF-8. Les principales sources d'informations françaises étant codées en ISO-8859-1 je ne pouvais utiliser cette méthode.

J'ai donc décidé d'en profiter pour développer un agent Lotus Notes en Java.
L'agent doit récupérer l'URL cible en argument et renvoyer le contenu de cette URL.
cross domain proxy
Le code source de l'agent est :
import lotus.domino.*;
import java.io.*;
import java.net.*;

public class JavaAgent extends AgentBase {

public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// Récupération de l'URL passé en argument de l'agent
Document doc = agentContext.getDocumentContext();
String newurl = doc.getItemValueString("Path_Info_Decoded");
newurl = newurl.substring(newurl.indexOf("url=") + 4);
URL url = new URL (newurl);

// Initialisation du résultat à renvoyer
String result = "";

// Les informations seront renvoyés vers le navigateur au format XML
PrintWriter pw = getAgentOutput();
pw.println("Content-type: text/xml");

// Récupération du contenu de la page cible
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
result += inputLine.toString();
}

// Envoi du résultat vers le navigateur Web
pw.println(result);
doc.recycle();

} catch(Exception e) {
e.printStackTrace();
}

}
}
Pour appeler l'agent il faut utiliser un URL du type : http://serverlocal/path/base.nsf/agent?openagent&url=http%3A//sitecible/path/fichier

Intégration dans l'aggrégateur RSS

On peut très facilement intégrer cette fonctionnalité dans l'aggrégateur RSS précédemment présenté.

ajax rss
  • Etape 1 : Intégration de l'agent sur une base du domaine Web. L'agent peut être déclaré dans la base elle même ou depuis n'importe quelle autre base du domaine Internet.
  • Etape 2 : Déclaration des URL d'ouverture de fil. Au lieu d'indiquer directement l'URL de la cible, on la fait précéder de l'URL de l'agent selon le format présenté. On pourra aussi prévoir un développement pour intégrer automatiquement cette syntaxe afin de simplifier la tâche de l'utilisateur.
Attention, le javascript d'interprétation des fils RSS présenté ne prend pas en charge le format ATOM pour le moment.

[Mise à jour] Ajout de doc.recycle() suite à la remarque de Yogi, administrateur du sombre blog DarkBlog à consulter sans hésitation.

2 Commentaires:

Anonymous YoGi dit...

Merci.
Et ne pas oublier les recycle() sur les objets Domino !

lundi, août 21, 2006 10:36:00 PM  
Blogger Philippe GAUVIN dit...

Arf ! Désolé pour cette erreur. Je viens de corriger le code.
Merci.

lundi, août 21, 2006 11:40:00 PM  

Enregistrer un commentaire

Lien vers ce message:

Créer un lien

<< Home

Rechercher sur ce blog
Effacer résultat