отправка сложного типа с помощью Apache xml rpc client 3.1.3 - PullRequest
1 голос
/ 15 января 2012

Поэтому я пытаюсь отправить сообщение xml-rpc на сервер moses xml-rpc в Java, но продолжаю получать сообщение об ошибке:

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

Я использую клиент Apache xmlrpc 3.1.3 из http://ws.apache.org/xmlrpc/client.html. Я предполагаю, что определение параметра несовместимо, но после экспериментов с другим типом для использования в качестве входных данных выходной сигнал остается тем же.У меня есть пример клиента, но он написан на 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 ]

1 голос
/ 17 января 2012

После ознакомления со списком рассылки moses, я получил пример java-клиента для сервера moses: https://github.com/moses-smt/mosesdecoder/blob/master/contrib/server/SampleClient.java

Спасибо

0 голосов
/ 16 января 2012

Я не знаю Java и не могу проверить ваш код. Если у вашего клиента есть какой-либо другой метод соединения, кроме XML, передаваемого через SOAP, используйте его! Это верно для любого SOAP и большинства XML API, которые я видел в прошлом.

Вы запускали этот Perl-код и проверяли, что он работает?

Если это так: добавьте отладку, чтобы посмотреть, что он делает, и сравните это с вашим скриптом. XMLRPC :: Lite утверждает, что основан на SOAP :: Lite, который имеет отладку при использовании

use SOAP::Lite +trace;

Три шанса. Во-первых, добавление этой строки позволяет отлаживать также XMLRPC :: Lite. Второе: добавьте флаг «+ trace» в строку «use XMLRPM :: Lite», чтобы включить отладку. Третье: возможно, отладка SOAP невозможна, если ее называют XMLRPC :: Lite.

Смотрите здесь для получения дополнительной информации: http://metacpan.org/pod/SOAP::Trace

Наконец, анализатор пакетов, такой как tcpdump, может показать вам, что передается.

Я подозреваю, что либо ваша структура XML отличается от структуры Perl, либо они отличаются только пробелами, переносами строк или порядком элементов, и сервер на другой стороне принимает не настоящий XML, а текстовый блок с ключевыми словами, включенными в < >.

...