J2ME -> Utilisation de KXmlRPC: blocage au 256ème caractère de réponse

J2ME -> Utilisation de KXmlRPC: blocage au 256ème caractère de réponse - Java - Programmation

Marsh Posté le 13-02-2005 à 01:29:52    

Bonjour,
 
  J'essaie de faire une application sur un téléphone mobile. Cette application doit pouvoir dialoguer avec un blog disposé sur un serveur web.
 
  J'ai le WTK22 et mon blog de test est Nucleus http://nucleuscms.org/.
  J'essaie d'utiliser les APIs standards des blogs : surtout MetaWebBlogAPI (http://www.xmlrpc.com/metaWeblogApi)
  J'ai commencé par tester un programme Java "normal" et ça marchait à peu près (en tout cas pour récupérer un Post -pour poster un Post ça marche toujours pas... -http://forum.hardware.fr/hardwaref [...] 4150-1.htm-)
 
  Pour ce qui est de mon appli J2ME, j'ai récupéré un parser XML qui s'appelle kXML-RPC http://kxmlrpc.objectweb.org/ et qui est apparement fait pour tourner sur J2ME.
 
  Mon problème est que j'arrive à envoyer une requête mais que je ne récupère que les 256 premières caractères de la réponse.
 
Lorsque dans WTK j'active le Network Monitor, j'obtiens pour client -> serveur
 

Code :
  1. ..<methodCall>
  2. .. <methodName>metaWeblog.getPost</methodName>
  3. .. <params>
  4. ..  <param>
  5. ..   <value>
  6. ..    <string>1</string>
  7. ..   </value>
  8. ..  </param>
  9. ..  <param>
  10. ..   <value>
  11. ..    <string>monlogin</string>
  12. ..   </value>
  13. ..  </param>
  14. ..  <param>
  15. ..   <value>
  16. ..    <string>monpasswd</string>
  17. ..   </value>
  18. ..  </param>
  19. .. </params>
  20. ..</methodCall>


et pour la réponse serveur -> client, je n'obtiens apparemment que le début :

Code :
  1. <?xml version="1.0"?>
  2. .<methodResponse>
  3. . <params>
  4. .  <param>
  5. .   <value><struct>
  6. .    <member><name>dateCreated</name>
  7. .   <value>
  8.      <dateTime.iso8601>20050208T15:38:33</dateTime.iso8601></value>
  9. .    </member>
  10. .    <member><name>userid</name>
  11. .     <value><string>1</string></value>
  12. .    </member>


 
Voilà la partie de mon appli qui fait l'appel et la réponse du client :

Code :
  1. //L'adresse du blog ou l'on se connecte
  2. xmlrpc = new XmlRpcClient(
  3.           "http://monurl" ) ;
  4. //les parametres à passer à la fonction que l'on appelle sur le blog
  5.   params = new Vector() ;
  6.   params.addElement("1" ) ; // blogId
  7.   params.addElement("monlogin" ) ;
  8.   params.addElement("monpasswd" ) ;
  9. //on execute la méthode que je souhaite : recuperer un post
  10.   reponse = (Object) xmlrpc.execute(blogMethode, params) ;
  11. //String s = (String) xmlrpc.execute(blogMethode, params) ;
  12.   System.out.println("DB1 : " + reponse.toString()) ;
  13.   response.setString( reponse.toString() );
  14.   display.setCurrent( response );


Lorsque je lance l'application sur l'émulateur, j'obtiens un java.lang.nullPointerException et dans mon moniteur, la trace que j'ai posté + haut.
 
Si quelqu'un à déjà utilisé kXML-RPC ou a déjà rencontré ce problème...
Ou peut-être cela vient que J2ME est limité en taille mémoire ?
 
Bref, je suis preneur de toutes vos suggestions  :jap:
 
Merci pour vos réponses.
 
Julien
 
PS : Je peux mettre mon répertoire (WTK>monappli) en téléchargement si vous voulez voir le code en entier (y'a vraiment pas beaucoup de lignes) et tester vite fait (+ pratique si vous avez WTK installé) :p


Message édité par jultey le 13-02-2005 à 01:46:36
Reply

Marsh Posté le 13-02-2005 à 01:29:52   

Reply

Marsh Posté le 13-02-2005 à 11:11:00    

Faudrait voir a quelle ligne de code correspond ton "java.lang.nullPointerException". En tout cas, c'est une exception qui met le thread par terre si elle n'est pas intercepter. C'est surement pour ça que ton applis ne renvoie pas tout ce qu'elle devrait.

Reply

Marsh Posté le 13-02-2005 à 13:17:38    

Ca doit venir de la méthode parseResponse()... mais où dans cette méthode. Elle fait partie du kxmlrpc.jar . Ce n'est pas moi qui l'ai faite, elle est un peu complexe pour moi...
 
Voici la classe XmlRpcClient (qui contient donc la méthode execute() )

Code :
  1. public class XmlRpcClient {
  2.   public Object execute ( String method, Vector params) throws Exception {
  3.   //[Là, j'ai l'envoi qui se passe correctement]
  4.   //[...]
  5.  
  6.     // Parse response from server
  7.       parser = new XmlRpcParser( new XmlParser( new InputStreamReader( in ) ) );
  8.       result = parser.parseResponse();
  9.     //Apparemment, c'est là que ça pose PB, donc de la méthode parseResponse() de
  10.     //la classe XmlRpcParser
  11.  
  12.   //[Et là j'ai la fermeture des connexions)]
  13.   //[...]
  14.   }
  15. }


 
Et voici le code de la méthode parseResponse() de la classe XmlRpcParser (comment je fais pour savoir où l'erreur est levée ?) :
Et le AbstractXmlParser (2ème ligne ci-dessous), je n'ai pas trouvé sa doc : ni dans la doc fournie avec kxmlrpc, ni dans la doc java...  
 

Code :
  1. public class XmlRpcParser{
  2.     AbstractXmlParser parser ;
  3.     String methodName ;
  4.     Vector params = new Vector() ;
  5. // [...]
  6.    /**
  7.      * Called by a client to parse an XML-RPC response returned by a server.
  8.      *
  9.      * @return The return parameter sent back by the server.
  10.      */
  11.     public Object parseResponse() throws IOException{
  12.         ParseEvent event ;
  13.         Object result ;
  14.         parser.skip() ;
  15.         parser.read(Xml.START_TAG, "", "methodResponse" ) ;
  16.         parser.skip() ;
  17.         event = parser.peek() ;
  18.         result = null ;
  19.         if(event.getType() == Xml.START_TAG){
  20.             // If an error occurred, the server will return a Fault
  21.             if("fault".equals(event.getName())){
  22.                 parser.read() ;
  23.                 // Fault's are returned as structs (which are mapped to Hashtables)
  24.                 Hashtable fault = (Hashtable) parseValue() ;
  25.                 parser.skip() ;
  26.                 parser.read(Xml.END_TAG, "", "fault" ) ;
  27.                 // Ultimately, a client-side exception object is generated
  28.                 result = new XmlRpcException
  29.                          ( ( (Integer) fault.get("faultCode" )).intValue(),
  30.                           (String) fault.get("faultString" )) ;
  31.             }
  32.               /* The current version of the XML-RPC spec -- http://www.xmlrpc.org/spec
  33.              does not permit multiple parameter values to be returned, although
  34.                a complex type (struct or array) containing multiple values (and even
  35.                other complext types) is permitted.  This aspect of the spec is currently
  36.               being debated and may be changed in the future. */
  37.             else if("params".equals(event.getName())){
  38.                 parseParams() ;
  39.                 if(params.size() > 1){
  40.                     throw new IOException("too many return parameters" ) ;
  41.                 }
  42.                 else if(params.size() == 1) {
  43.                     result = params.elementAt(0) ;
  44.                 }
  45.             }
  46.             else{
  47.                 throw new IOException
  48.                   ("<fault> or <params> expected instead of " + event) ;
  49.             }
  50.         } //end if( event.getType() == Xml.START_TAG ) {
  51.         parser.skip() ;
  52.         parser.read(Xml.END_TAG, "", "methodResponse" ) ;
  53.         parser.skip() ;
  54.         parser.read(Xml.END_DOCUMENT, null, null) ;
  55.         return result ;
  56.     } //end parseResponse()
  57. // [...]
  58. }



Message édité par jultey le 13-02-2005 à 21:45:32
Reply

Marsh Posté le 13-02-2005 à 21:46:50    

Pour ceux qui sont dans le même cas que moi pour l'utilisation de kXmlRpc, il semblerait que le bug ait été découvert et corrigé...
Plus d'infos ici : http://blog.gmane.org/gmane.comp.java.enhydra.kxmlrpc

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed