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","res.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=firefox
,offset
为21900
和@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 "<?xml version=\"1.0\"> <test>" + Character.toString((char)3) + "</test>";
时,客户端崩溃报错:An invalid XML character (Unicode: 0x3) was found in the element content of the document.
你知道如何在客户端解决这个问题而不改变服务器代码吗?以上是关于Apache 的 Java XMLRPC 库的主要内容,如果未能解决你的问题,请参考以下文章
Apache XML-RPC 似乎无法解析 android-xmlrpc 传递给它的长类型