2015-03-26 11 views
13

używam moją usługę XMLRPC wykorzystaniem biblioteki Apache XMLRPC ale w réponse z XMLRPC ma charakter śmieci więc biblioteka nie można analizować wynikApache Java XMLRPC biblioteka

Tu jest mój program XMLRPC :

 
import java.net.URL; 

import org.apache.xmlrpc.client.XmlRpcClient; 
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; 


public class XMLRpcExample { 

    public static void main(String[] args) throws Exception{ 
     // TODO Auto-generated method stub 

     XmlRpcClientConfigImpl cf = new XmlRpcClientConfigImpl(); 
     cf.setServerURL(new URL("/xmlrpc/object")); 
     cf.setBasicUserName("admin"); 
     cf.setBasicPassword("m_demo"); 
     cf.setConnectionTimeout(60000); 
     XmlRpcClient client = new XmlRpcClient(); 
     client.setConfig(cf); 
     Object[] params = new Object[] {"dbname",1,"m_demo","res.partner","partner_sync_openerp","[email protected]z","22"}; 
     String s =(String)client.execute("execute", params); 
     System.out.println(s); 
    } 

} 

Ale ja dostaję ten błąd w odpowiedzi, która wygląda tak:

 
[Fatal Error] :16:16: An invalid XML character (Unicode: 0xc) was found in the element content of the document. 
Exception in thread "main" org.apache.xmlrpc.client.XmlRpcClientException: Failed to parse server's response: An invalid XML character (Unicode: 0xc) was found in the element content of the document. 
    at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:202) 
    at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:165) 
    at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:125) 
    at org.apache.xmlrpc.client.XmlRpcSunHttpTransport.sendRequest(XmlRpcSunHttpTransport.java:69) 
    at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56) 
    at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167) 
    at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:137) 
    at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:126) 
    at XMLRpcExample.main(XMLRpcExample.java:21) 
Caused by: org.xml.sax.SAXParseException; lineNumber: 16; columnNumber: 16; An invalid XML character (Unicode: 0xc) was found in the element content of the document. 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1237) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:551) 
    at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:200) 
    ... 8 more 

XML-RPC daje znak śmieci w réponse.

I sama biblioteka nie analizuje odpowiedzi.

Oznacza to, że biblioteka Apache XML-RPC nie jest w stanie przeanalizować odpowiedzi.

Czy jakiekolwiek ciało może mi pomóc w tym, co muszę zrobić?

Próbowałem również rozwiązać ten problem przez Internet, ale nie jestem w stanie go rozwiązać.

+0

Mam ten sam problem. Czy byłeś w stanie rozwiązać problem? –

+0

Czy znasz odpowiedź, która została odesłana w odpowiedzi na twoje pytanie? (Możesz spróbować powąchać ruch za pomocą wireshark, aby zobaczyć, co jest odesłane.) Być może jest skompresowany w jakiś sposób lub w ogóle nie korzysta z XML ... –

+0

@ AndréSchild Nie, właściwie większość wywołań zdalnej procedury przebiega poprawnie. To zdarza się rzadko w przypadku niektórych połączeń. Należy pamiętać, że zdalna procedura pochodzi od strony trzeciej i nie można jej zmienić. Zmiana musi zostać dokonana na naszym końcu, aby uniknąć tego błędu. –

Odpowiedz

2

Oto przykład pracy dla swoich parametrów, które mogą pomóc


Handler Class:

public class Handler { 
    public String execute(String dbName, Integer i, String a, String b, String c, String d, String e){ 
     System.out.println("Got inputs: "+dbName+", "+i+", "+a+", "+b+", "+c+", "+d+", "+e); 
     return "<?xml version=\"1.0\"> <test>[email protected]</test>"; 
    } 
} 

więcej takich teleskopowe mogą być dodawane za pomocą phm.addHandler("handler",Handler.class); do kodu serwera. Do tej klasy można dodać więcej metod i można ją wywołać z klienta.


XMLRPC Serwer:

import org.apache.xmlrpc.server.PropertyHandlerMapping; 
import org.apache.xmlrpc.server.XmlRpcServer; 
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl; 
import org.apache.xmlrpc.webserver.WebServer; 

public class Server { 
    private static final int port = 8080; 

    public static void main(String[] args) throws Exception { 
     WebServer webServer = new WebServer(port); 
     XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer(); 
     PropertyHandlerMapping phm = new PropertyHandlerMapping(); 
     phm.addHandler("handler",Handler.class); 
     xmlRpcServer.setHandlerMapping(phm); 
     XmlRpcServerConfigImpl serverConfig = 
       (XmlRpcServerConfigImpl) xmlRpcServer.getConfig(); 
     serverConfig.setEnabledForExtensions(true); 
     serverConfig.setContentLengthOptional(false); 
     webServer.start(); 
    } 
} 

XMLRPC Klient:

import org.apache.xmlrpc.client.XmlRpcClient; 
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; 

import java.net.URL; 

public class Client { 
    public static void main(String args[])throws Exception{ 
     XmlRpcClientConfigImpl cf = new XmlRpcClientConfigImpl(); 
     cf.setServerURL(new URL("http://localhost:8080/xmlrpc/object")); 
     cf.setBasicUserName("admin"); 
     cf.setBasicPassword("m_demo"); 
     cf.setConnectionTimeout(60000); 
     XmlRpcClient client = new XmlRpcClient(); 
     client.setConfig(cf); 
     Object[] params = new Object[] {"dbname",1,"m_demo","res.partner","partner_sync_openerp","[email protected]","22"}; 
     String s =(String)client.execute("handler.execute", params); 
     System.out.println(s); 
    } 
} 
+0

Co się stanie, jeśli dany serwer jest serwerem innej firmy i wysyła nieprawidłowy znak XML w odpowiedzi na wywołanie rpc? Czy możemy w jakiś sposób znieść/zignorować tę postać? –

+0

edytował przykład, aby wysłać znaki specjalne z serwera. Jest to zakodowane podczas przesyłania przez bibliotekę i nie trzeba się tym martwić. –

+0

Po zwrocie 'return" "+ Character.toString ((char) 3) +" ";' z serwera w klasie Handler, klient zawiesza się dając błąd: 'Nieprawidłowy Znak XML (Unicode: 0x3) został znaleziony w treści elementu dokumentu. "Czy wiesz, jak rozwiązać ten problem u klienta bez zmiany kodu serwera? –