Apache 的 Java XMLRPC 库

Posted

技术标签:

【中文标题】Apache 的 Java XMLRPC 库【英文标题】:Apache's Java XMLRPC library 【发布时间】:2015-05-30 12:50:30 【问题描述】:

我正在使用我的 XML-RPC 服务,使用 Apache XML-RPC 库,但响应 XML-RPC 有垃圾字符,所以库无法解析结果

这是我的 XML-RPC 程序:

导入 java.net.URL; 导入 org.apache.xmlrpc.client.XmlRpcClient; 导入 org.apache.xmlrpc.client.XmlRpcClientConfigImpl; 公共类 XMLRpcExample 公共静态 void main(String[] args) 抛出异常 // TODO 自动生成的方法存根 XmlRpcClientConfigImpl cf = new XmlRpcClientConfigImpl(); cf.setServerURL(新 URL("/xmlrpc/object")); cf.setBasicUserName("admin"); cf.setBasicPassword("m_demo"); cf.setConnectionTimeout(60000); XmlRpcClient 客户端 = 新 XmlRpcClient(); client.setConfig(cf); 对象[] 参数 = 新对象[] "dbname",1,"m_demo","re​​s.partner","partner_sync_openerp","kapil5drd@bxiz","22"; String s =(String)client.execute("execute", params); System.out.println(s);

但我收到此错误作为响应,如下所示:

[致命错误]:16:16:在文档的元素内容中发现了无效的 XML 字符(Unicode:0xc)。 线程“主”org.apache.xmlrpc.client.XmlRpcClientException 中的异常:无法解析服务器的响应:在文档的元素内容中发现了无效的 XML 字符(Unicode:0xc)。 在 org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:202) 在 org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:165) 在 org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:125) 在 org.apache.xmlrpc.client.XmlRpcSunHttpTransport.sendRequest(XmlRpcSunHttpTransport.java:69) 在 org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56) 在 org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167) 在 org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:137) 在 org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:126) 在 XMLRpcExample.main(XMLRpcExample.java:21) 引起:org.xml.sax.SAXParseException;行号:16;列号:16;在文档的元素内容中发现了无效的 XML 字符 (Unicode: 0xc)。 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1237) 在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:551) 在 org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:200) ... 8 更多

XML-RPC 给出一个垃圾字符作为响应。

并且库本身无法解析响应。

所以这意味着,Apache XML-RPC 库是它自己无法解析响应。

任何机构都可以帮助我完成我需要做的事情吗?

我也尝试通过互联网解决此问题,但无法解决。

【问题讨论】:

我也遇到了同样的问题。你能解决问题吗? 您知道响应是什么,它会被发回以回答您的问题吗? (您可能会尝试使用wireshark 嗅探流量以查看发回的内容。)也许它以某种方式被压缩或根本不使用XML... @AndréSchild 不,实际上大多数对远程过程的调用都正常。对于某些特定的呼叫,这种情况很少发生。请注意,远程过程来自第三方,无法更改。需要在我们端进行更改以避免此错误。 所以基本问题是:为什么远程服务有时会返回无效的 XML 答案。除非您可以跟踪此类无效消息,否则处理它的唯一方法是将 client.execute(...) 包装在 try/catch 块中,当抛出异常时,只需以某种“优雅”的方式处理它. (也许稍后重试,或者任何合适的方法) @AndréSchild 感谢您跟进先生。具体来说,我正在使用Bugzilla::Webservice::Bug::search 远程过程从Bugzilla@Mozilla 的部署中获取错误,并使用以下代码search(searchCriteria, offset, limit); 在以下情况下失败:标准为product=firefoxoffset21900 和@987654327 @ 是 100 而对于 offset 的其他值,它工作正常。 【参考方案1】:

这是您的参数的工作示例,可以帮助您


处理程序类:

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>testmail@testdomain.com</test>";
    

可以使用phm.addHandler("handler",Handler.class); 将更多此类处理程序添加到服务器代码中。 这个类可以添加更多的方法,并且可以从客户端调用。


XMLRPC 服务器:

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 客户端:

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","kapil5drd@bxiz","22";
        String s =(String)client.execute("handler.execute", params);
        System.out.println(s);
    

【讨论】:

如果有问题的服务器是第三方服务器并且正在发送无效的 XML 字符以响应 rpc 调用怎么办?我们可以以某种方式处理/忽略该字符吗? 编辑了示例以从服务器发送特殊字符。这是通过库传输时编码的,无需担心。 在Handler类中从服务器返回return "&lt;?xml version=\"1.0\"&gt; &lt;test&gt;" + Character.toString((char)3) + "&lt;/test&gt;";时,客户端崩溃报错:An invalid XML character (Unicode: 0x3) was found in the element content of the document.你知道如何在客户端解决这个问题而不改变服务器代码吗?

以上是关于Apache 的 Java XMLRPC 库的主要内容,如果未能解决你的问题,请参考以下文章

Apache XML-RPC 似乎无法解析 android-xmlrpc 传递给它的长类型

apache xmlrpc示例

Apache POI - Java Excel APIs

使用哪个 Java XML RPC 库

apache_conf 阻止Apache .htaccess中的xmlrpc.php

apache_conf xmlrpc-Schnittstelle deaktivieren