当前位置: 首页 > 知识库问答 >
问题:

使用Java Apache XML RPC 3.1.3服务器响应的数组类型“错误”

左丘源
2023-03-14

我正在尝试使用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规范?

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

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

所以我试着找到一个解决方案,使我也能做到这一点。

共有1个答案

龚安民
2023-03-14

我终于找到了怎么做的方法,所以如果有人感兴趣的话,下面是我是怎么做的:

我创建了一个“自定义数据类型”,如此处同名部分所述: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);
        }
    }
}
 类似资料:
  • 我试图使用第三方Web服务(基于php)在asp.netc#应用程序,但失败的服务配置。已经尝试添加服务/Web引用-所有相同的错误: 响应消息的内容类型 text/html 与绑定的内容类型不匹配(text/xml;charset=utf-8)。如果使用自定义编码器,请确保正确实现 IsContentTypeSupport 方法。响应的前 402 个字节是:” [已手动编辑响应以正确显示 对我来

  • Response响应对象主要将JSP容器处理后的结果传回到客户端。可以通过response变量设置HTTP的状态和向客户端发送数据,如Cookie、HTTP文件头信息等。 一个典型的响应看起来就像下面这样: HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (空行) <!doctype ...> <ht

  • 问题内容: 我有一个新编码的GWT / GAE应用,该应用在客户端上使用RequestFactory和Editors,在背面使用自定义的Objectify DAO服务。 flush()然后persist()路径在成功时可以正常工作。客户端JSR 303也可以正常工作。 我的问题是如何触发服务器警告/错误并处理UI更新? 我在http://turbomanage.wordpress.com/2010

  • 错误响应 状态:400 消息:“用户ID和密码错误” 在这里,我可以获得或处理成功数据,但不能获得或处理错误数据,因为在catch函数中,只有错误对象被传递,而错误对象只包含来自服务器的响应代码,而不是响应数据

  • 这将返回有效用户的调用状态。例如,如果用户是有效的,并且存在状态,则以纯文本形式返回“Active”。如果没有有效用户,则返回#1005的错误代码 我可以像这样添加自定义转换器工厂(在web上找到) 但我没看到有什么不同。此外,它还可以很好地将JSON伪装成普通文本,并破坏所有现有服务。有没有更好的方法来处理这种情况?我想过为纯文本提供单独的改型实例,虽然有点脏。你还有其他的建议/解决办法吗?

  • 我正在尝试上传一个xml文件。当使用MultipartEntityBuilder将二进制格式的文件添加到HttpEntity时,我收到以下错误 我已经通过了链接 https://www.baeldung.com/httpclient-multipart-upload 我的理解是,该文件不被接受,因为http实体无法发送MultipartEntityBuilder,但我可能错了。