gpt4 book ai didi

java - "wrong"使用 java Apache XML RPC 3.1.3 服务器响应的数组类型

转载 作者:行者123 更新时间:2023-11-30 03:57:29 25 4
gpt4 key购买 nike

我正在尝试使用 apache xmlrpc (3.1.3) 库运行 XML RPC 服务器。

我按照 XML RPC 规范 ( http://xmlrpc.scripting.com/spec ) 的要求在此服务器上实现了方法“system.listMethods”。

为了检查该服务器是否遵循 XML RPC 规范,我创建了一个客户端,使我能够向服务器发出 Post 请求,发送我想要的 XML 文件(我将其编写为 Sring,客户端发送它) .

然后,我的客户端打印服务器 XML 响应。

它有效,但是当我发布此请求时:

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>

它返回给我这个响应:

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
<params>
<param>
<value><array><data>
<value>system.listMethods</value>
<value>system.methodSignature</value>
<value>system.methodHelp</value>
<value>Calculator.add</value>
<value>Calculator.subtract</value>
</data></array></value>
</param>
</params>
</methodResponse>

根据规范,这是“错误的”。这是我的方法列表,但它们的结构中缺少一些东西。例如,它们应该是:

<value><string>system.listMethods</string></value>

已安装

<value>system.listMethods</value>

在我的服务器中,“system.listMethods”方法返回一个Object[]类型的java对象(我尝试将其更改为String[],但它不影响结果)。根据 apache 文档 ( http://ws.apache.org/xmlrpc/types.html ),这个 java 类型应该转换为 XML-RCP 数组类型,我应该使用它。

怎样才能使我的服务器遵循 XML-RCP 规范?

在这种情况下,我只需在某处添加“<string> ”或“</string> ”,但如规范数组类型示例所示,我应该能够混合数据类型:

<array>
<data>
<value><i4>12</i4></value>
<value><string>Egypt</string></value>
<value><boolean>0</boolean></value>
<value><i4>-31</i4></value>
</data>
</array>

因此,我尝试找到一种解决方案,让我也能做到这一点。

最佳答案

我终于找到了如何做到这一点,所以如果有人感兴趣,我是这样做的:

我创建了一个“自定义数据类型”,如此处同名部分中所述: http://ws.apache.org/xmlrpc/advanced.html

我还必须查看 org.apache.xmlrpc.serializer.StringSerializer 和 org.apache.xmlrpc.common.TypeFactoryImpl 的来源(在此处的 GrepCode 上找到: http://grepcode.com/file/repo1.maven.org/maven2/org.apache.xmlrpc/xmlrpc-common/3.1.3/org/apache/xmlrpc/common/TypeFactoryImpl.java#TypeFactoryImpl.0STRING_SERIALIZER )

我必须创建两个类:

MyStringSerializer:

import org.apache.xmlrpc.serializer.*;<br>
import org.xml.sax.ContentHandler;<br>
import org.xml.sax.SAXException;

public class MyStringSerializer extends TypeSerializerImpl {
// Tag name of an string.
public static final String STRING_TAG = "string";

public void write(ContentHandler pHandler, Object pObject) throws SAXException {
write(pHandler, STRING_TAG, pObject.toString());
}
}


MyTypeFactory(代替 TypeFactoryImpl 调用的方法):

import org.apache.xmlrpc.common.TypeFactoryImpl;<br>
import org.apache.xmlrpc.common.XmlRpcController;<br>
import org.apache.xmlrpc.common.XmlRpcStreamConfig;<br>
import org.apache.xmlrpc.serializer.TypeSerializer;<br>
import org.xml.sax.SAXException;<br>

public class MyTypeFactory extends TypeFactoryImpl {
public MyTypeFactory(XmlRpcController pController) {
super(pController);
}

public TypeSerializer getSerializer(XmlRpcStreamConfig pConfig, Object pObject) throws SAXException {
if (pObject instanceof String){
return new MyStringSerializer();
}else{
return super.getSerializer(pConfig, pObject);
}
}
}

关于java - "wrong"使用 java Apache XML RPC 3.1.3 服务器响应的数组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22817343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com