2012-01-15 1 views
1

Так что я пытаюсь отправить сообщение XML-RPC с Моисеем сервер XML-RPC в Java, но постоянно получаю сообщение об ошибке:отправки сложного типа с клиентом RPC Apache XML 3.1.3

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); 
} 

Является ли это правильно?

Спасибо за вашу помощь

ответ

0

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

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

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

use SOAP::Lite +trace;

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

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

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

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

+0

Во-первых, спасибо за ваш ответ, и извините за поздний ответ. К сожалению, сервер предоставляет только XML-RPC в качестве протокола связи. К счастью, создатель сервера любезно показал мне пример java-клиента для XML-RPC, поэтому на этот вопрос ответил. Я отправлю ссылку на пример java-клиента в ответ всем, кто интересуется. ура – ndriks