使用apache xml rpc client 3.1.3发送复杂类型

时间:2012-01-15 13:52:15

标签: java perl xml-rpc moses

所以我试图用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);
}

这是对的吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

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

由于

答案 1 :(得分:0)

我不懂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,而是一个包含在&lt中的关键字的文本块; &GT;