Forums : Template et RDF

Aller à la discussion :  Plus récente Plus ancienne

# Réccuperer une RDF via un post

Envoyé par : woogluf

Date : 22/05/2006 17:58

Bonjour,

Suite aux conseils de laurentj je repose ma question sur ce forum.

Je voudrais alimenter un template avec les données venant d'une requête POST. L'idéal serait de poster une requête au format xml et de reccupérer la réponse au format RDF, et que cette réponse alimente automatiquement mon template (i.e. sans manipulation).

Est-ce que quelqu'un connaît un moyen d'affecter la réponse au datasource de mon tree ?

# Re: Réccuperer une RDF via un post

Envoyé par : chBok

Date : 22/05/2006 18:57

Tu peux déjà commencer à regarder cet exemple présent sur le wiki et venir compléter tes questions ici :)

==> /wiki/ApplisWeb/ExemplePhpRdf

# Re: Réccuperer une RDF via un post

Envoyé par : laurentj

Date : 23/05/2006 00:09

Il faut envoyer ta requète avec xmlhttprequest. Tu récupère le contenu rdf via responseText, que tu donnes alors au parser RDF, qui remplira alors un datasource (qu'il faut que tu crée auparavant). Tu affecte ensuite ce datasource au template via la propriété databases des balises XUL.

# Re: Réccuperer une RDF via un post

Envoyé par : woogluf

Date : 23/05/2006 14:33

L'envoi d'un post via xmlhttprequest fonctionne :

var r=new XMLHttpRequest();
r.open("GET",maQueryUri, true);
r.onreadystatechange = function () {
	if (r.readyState == 4) {
		if(r.status == 200) {netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
			parser.parseString ( datasource , uri, r.responseText );
			tree.builder.rebuild();
		}
	}
};
r.send(null);

Il suffit juste d'utiliser POST à la place de GET et de passer les paramètres au r.send.

Le problème est que parser.parseString n'est alors appelé qu'une fois la réponse entièrement reçue. (Je voudrait que mon tree commence à s'afficher dès que je reçois les premières données).

Il faudrait à prioris utiliser parser.parseAsync mais que ne sait pas comment le lier au stream de la réponse http.

Si quelqu'un a une idée, je suis preneur.

Merci

# Re: Réccuperer une RDF via un post

Envoyé par : wako

Date : 23/05/2006 15:19

Sa ne me semble pas possible.

r.readyState == 4 <== la reponse est totalement recu.

Si tu utilises les niveaux avant (3 par exemple) comment tu peux connaitre la taille du fichier ? comment tu vas faire pour reconstruire le fichier global ?

Je suis également preneur, mais vraiment septique sur une solution viable.

wako

# Re: Réccuperer une RDF via un post

Envoyé par : woogluf

Date : 23/05/2006 15:37

le channel du xmlhttprequest permet de réccupérer un listener sur le stream en faisant r.channel.asyncOpen (listener ,context) il suffit, à mon avis, de lui passer le listener retourné par parser.parseAsync et c'est dans la boîte.

Malheureusement, je ne sais pas comment fixer l'url du post, ni comment envoyer les données, ça doit être un truc dans le genre :

var r=new XMLHttpRequest();
r.open("POST",maQueryUri, true);
var listener=parser.parseAsync ( datasource , uri);
r.channel.asyncOpen ( listener , null);
r.send(mesdonnees);

Mais quoi exactement ???

# Re: Réccuperer une RDF via un post

Envoyé par : laurentj

Date : 23/05/2006 15:43

cf wiki pour l'utilisation de xmlhttprequest

# Re: Réccuperer une RDF via un post

Envoyé par : woogluf

Date : 23/05/2006 16:02

Désolé laurent, mais je ne crois (je viens de revérifier) que le wiki soit suffisament pointu pour comprendre comment récupérer la réponse du serveur via le streamlistener.

Ou alors j'ai besoin de lumières supplémentaires ;)

# Re: Réccuperer une RDF via un post

Envoyé par : laurentj

Date : 24/05/2006 13:08

Tu demandes comment indiquer l'url du post, et comment envoyer les données : tout est indiqué dans le wiki. Ce n'est pas dépendant du fait que tu récupère de manière synchrone ou non la réponse.

Coté récupération réponse, tu n'a rien à faire de plus que ce que tu as montré à mon avis. Le listener renvoyé par le parser va être appelé par le channel au fure et à mesure que la réponse arrive, et alimentera donc automatiquement la datasource rdf.

Ensuite il suffit d'assigner la datasource à ton template si ce n'est pas déjà fait (via la propriété databases)..

# Re: Réccuperer une RDF via un post

Envoyé par : woogluf

Date : 27/05/2006 12:36

Malheureusement, ça ne fonctionne pas (la méthode send est déjà censée faire un asyncopen).

J'ai essayé le code suivant (je ne l'ai pas sous les yeux, la syntaxe ne sera donc peut-être pas exacte).

var r=new XMLHttpRequest();
r.open("GET",maQueryUri, true);
var listener=parser.parseAsync ( datasource , uri);
r.channel.asyncOpen ( listener , null);

Ca marche bien, ce qui peut être utile à ceux qui veulent outrepasser le cache, car il y a des flags qui peuvent être modifiés au niveau du channel pour désactiver son utilisation (voir doc de référence de httpchannel, je crois).

Par contre, lorsque de tente d'utiliser la méthode post, ça se barre en nouille.

var r=new XMLHttpRequest();
r.open("POST",maQueryUri, true);
  var UploadChannel = r.channel.QueryInterface(Components.interfaces.nsIUploadChannel);
 // upload ascii file
  var aStream = Components.classes['@mozilla.org/io/string-input-stream;1'].createInstance(Components.interfaces.nsIStringInputStream);
  aStream.setData("toto", -1);
  UploadChannel.setUploadStream(aStream, "text/plain", -1);
var listener=parser.parseAsync ( datasource , uri);
r.channel.asyncOpen ( listener , null);

Firefox doit boucler quelque par et n'envoie jamais ma requète au serveur.

A noter, qu'en mettant en commentaire la ligne UploadChannel.setUploadStream(aStream, "text/plain", -1);, cela fonctionne à nouveau, mais que ce n'est pas un post qui est fait mais un get.

Si quelqu'un a une idée...

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.