【问题标题】:sending complex type with apache xml rpc client 3.1.3使用 apache xml rpc 客户端 3.1.3 发送复杂类型
【发布时间】:2012-01-15 13:52:15
【问题描述】:

所以我试图用 Java 向 moses xml-rpc 服务器发送一条 xml-rpc 消息,但一直出错:

org.apache.xmlrpc.XmlRpcException: Parameter that is supposed to be a structure is not

我正在使用来自http://ws.apache.org/xmlrpc/client.html 的 Apache xmlrpc 客户端 3.1.3。 我的猜测是参数定义不兼容,但是在尝试使用不同的类型作为输入后,输出仍然相同。我有一个客户端示例,但它是用 perl 编写的:

#!/usr/bin/env perl

use Encode;
use XMLRPC::Lite;
use utf8;

$url = "http://localhost:8080/RPC2";
$proxy = XMLRPC::Lite->proxy($url);

$text = "il a souhaité que la présidence trace à nice le chemin pour l' avenir .";

# Work-around for XMLRPC::Lite bug
$encoded = SOAP::Data->type(string => Encode::encode("utf8",$text));

my %param = ("text" => $encoded, "align" => "true");
$result = $proxy->call("translate",\%param)->result;
print $result->{'text'} . "\n";
if ($result->{'align'}) {
    print "Phrase alignments: \n";
    $aligns = $result->{'align'};
    foreach my $align (@$aligns) {
        print $align->{'tgt-start'} . "," . $align->{'src-start'} . "," 
            . $align->{'src-end'} . "\n"; 
    }
}

这是我的代码:

XmlRpcClientConfigImpl tConf = new XmlRpcClientConfigImpl();
try {
    tConf.setServerURL(new URL("http://127.0.0.1:8080/RPC2"));
    tConf.setBasicEncoding("UTF-8");
} catch (MalformedURLException ex) {
    ex.printStackTrace(System.out);
}
XmlRpcClient tClient = new XmlRpcClient();
tClient.setConfig(tConf);

List<List<String>> tInPar = new ArrayList<>();
tInPar.add(Arrays.asList(new String[]{"text", "hello"}));
tInPar.add(Arrays.asList(new String[]{"align", "true"}));

String tResult = null;
try {
    tResult = (String) tClient.execute("translate", tInPar);
} catch (XmlRpcException ex) {
    ex.printStackTrace(System.out);
}

对吗?

感谢您的帮助

【问题讨论】:

    标签: java perl xml-rpc moses


    【解决方案1】:

    在 moses 邮件列表中咨询后,我得到了 moses 服务器的这个 java 客户端示例:https://github.com/moses-smt/mosesdecoder/blob/master/contrib/server/SampleClient.java

    谢谢

    【讨论】:

      【解决方案2】:

      我不懂 Java,无法检查您的代码。如果您的客户端除了通过 SOAP 传输的 XML 之外还有其他连接方法,请使用它!我过去见过的任何 SOAP 和大多数 XML API 都是如此。

      您是否运行了该 Perl 代码并验证它是否正常工作?

      如果确实如此:添加一些调试以查看它的作用并将其与您的脚本进行比较。 XMLRPC::Lite 声称基于 SOAP::Lite,使用时有调试功能

      use SOAP::Lite +trace;

      三个机会:首先,添加这一行也可以调试 XMLRPC::Lite。第二:将“+trace”标志添加到“use XMLRPM::Lite”行以启用调试。第三:调用XMLRPC::Lite可能无法进行SOAP调试。

      查看这里了解更多信息:http://metacpan.org/pod/SOAP::Trace

      最后,像 tcpdump 这样的数据包嗅探器可以显示正在传输的内容。

      我怀疑您的 XML 结构与 Perl 的不同,或者它们仅在空格、换行符或元素顺序上有所不同,而另一端的服务器不接受真正的 XML,而是接受包含在 .

      【讨论】:

      • 首先感谢您的回复,抱歉回复晚了。不幸的是,服务器只提供 XML-RPC 作为通信协议。幸运的是,服务器创建者向我展示了 XML-RPC 的 java 客户端示例,因此这个问题得到了解答。我将在任何感兴趣的人的答案中发布指向 java 客户端示例的链接。干杯
      猜你喜欢
      • 1970-01-01
      • 2014-05-14
      • 2016-09-15
      • 2016-10-13
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      相关资源
      最近更新 更多