powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / SOAP. Java - server, Perl - client. ох, уж эти кодировки...
8 сообщений из 8, страница 1 из 1
SOAP. Java - server, Perl - client. ох, уж эти кодировки...
    #34902312
i'm_novice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
доброе время суток!

есть веб-сервис написанный на java, который локально работает замечательно. есть перловый скрипт
в роли клиента. при вызове метода удалённого класса через soap протокол, параметром которого
является xml-документ в виде строки, вылетает ошибка:

env:Client org.xml.sax.SAXParseException: Invalid byte 2 of 3-byte UTF-8 sequence.

и я не знаю в чей огород кидать камень: то ли клиент отдаёт в неправильной кодировке, то ли
веб-сервис понимает неправильно. помогите, пожалуйста разобраться.

"вырезки".
wsdl:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<types>
  <schema targetNamespace='http://localhost/services/service' 
     xmlns='http://www.w3.org/2001/XMLSchema' 
     xmlns:soap11-enc='http://schemas.xmlsoap.org/soap/encoding/' 
     xmlns:tns='http://localhost/services/service' 
     xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
   <complexType name='parseXML'>
    <sequence>
     <element name='String_1' nillable='true' type='string'/>
    </sequence>
   </complexType>
   <complexType name='parseXMLResponse'>
    <sequence>
     <element name='result' nillable='true' type='string'/>
    </sequence>
   </complexType>
   <element name='parseXML' type='tns:parseXML'/>
   <element name='parseXMLResponse' type='tns:parseXMLResponse'/>
  </schema>
 </types>

perl:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
use SOAP::Lite;
my $xml = '<?xml version="1.0"?>
		<корень>
			<элемент атрибут="PPPPP123123123123"/>
		</корень>';

my $string = SOAP::Data->type(string => $xml);
my $service = new SOAP::Lite
	-> uri('http://localhost/services/service')
	-> proxy('http://host:8080/Ejb/service?wsdl');
	
my $content = $service->parseXML(SOAP::Data->name('String_1' => $string));

з.ы. веб-сервис написан не мной, его код привести не могу (во всяком случае пока, ибо доступа до
самого кода нет).
...
Рейтинг: 0 / 0
SOAP. Java - server, Perl - client. ох, уж эти кодировки...
    #34903443
scrip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а какая кодировка у перловой переменной $xml ? (perldoc encoding)
...
Рейтинг: 0 / 0
SOAP. Java - server, Perl - client. ох, уж эти кодировки...
    #34903606
i'm_novice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
scripа какая кодировка у перловой переменной $xml ? (perldoc encoding)
сам файл скрипта в cp1251. получается, что и $xml будет в cp1251. правильно я понимаю?
...
Рейтинг: 0 / 0
SOAP. Java - server, Perl - client. ох, уж эти кодировки...
    #34904039
Фотография Roman V Tchemisov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
i'm_novice scripа какая кодировка у перловой переменной $xml ? (perldoc encoding)
сам файл скрипта в cp1251. получается, что и $xml будет в cp1251. правильно я понимаю?
SOAP Cookbook , раздел Internationalization and encoding
...
Рейтинг: 0 / 0
SOAP. Java - server, Perl - client. ох, уж эти кодировки...
    #34904421
i'm_novice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman V Tchemisov
SOAP Cookbook , раздел Internationalization and encoding
читал, конечно. пробовал.
в первом случае выдает:
env:Client org.jboss.ws.core.jaxrpc.binding.BindingException: org.jboss.ws.core.jaxrpc.binding.jbossxb.UnmarshalException: Failed to parse source: Requested element {http://localhost/services/service}String_1 is not allowed in this position in the sequence. The next element should be String_1
во втором:
syntax error near "tr/\0-\x{ff}//CU" Compilation failed in require
для второго случая в cookbook написано
# convert to UTF (if you're using Perl 5.6)
а у меня 5.8.8, в котором, я так понимаю модификатора U нет, оттого и ошибка.

You may need to use Unicode::String or Unicode::Map8 to convert from your encoding to UTF-8.
и так пробовал
Unicode::String
Код: plaintext
1.
2.
3.
use Unicode::String;
my $us = new Unicode::String('cp1251');
my $string = $us->utf8($xml);
и так
Unicode::Map8
Код: plaintext
1.
2.
3.
use Unicode::Map8;
my $cp_map = new Unicode::Map8('cp1251');
my $string = $cp_map->to8($xml);
результат: ошибка как в первом случае.
что не так в моих действиях?
...
Рейтинг: 0 / 0
SOAP. Java - server, Perl - client. ох, уж эти кодировки...
    #34906152
Фотография Roman V Tchemisov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно посмотреть код Ваших попыток?
Что будет, если скрипт на Perl перевести в UTF-8?
=======================
Роман Чемисов
Тел.: +79149052257
ICQ: 157070721
Skype: gangabass
...
Рейтинг: 0 / 0
SOAP. Java - server, Perl - client. ох, уж эти кодировки...
    #34906585
i'm_novice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да собственно весь код попыток я привёл.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
use SOAP::Lite;
my $xml = '<?xml version="1.0"?>
		<корень>
			<элемент атрибут="PPPPP123123123123"/>
		</корень>';

#use Unicode::String;
#my $us = new Unicode::String('cp1251');
#my $string = $us->utf8($xml);
# или
#use Unicode::Map8;
#my $cp_map = new Unicode::Map8('cp1251');
#my $string = $cp_map->to8($xml);
# или
my $string = SOAP::Data->type(string => $xml);
my $service = new SOAP::Lite
	-> uri('http://localhost/services/service')
	-> proxy('http://host:8080/Ejb/service?wsdl');

	
my $content = $service->parseXML(SOAP::Data->name('String_1' => $string));

если скрипт перевести в utf8, то получается String_1 is not allowed......
хотя, я так подозреваю, что он встречает элемент с namespace:
{http://localhost/services/service}String_1
а хочет увидеть без оного
...
Рейтинг: 0 / 0
SOAP. Java - server, Perl - client. ох, уж эти кодировки...
    #34908596
i'm_novice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
решено. если кому пригодиться, пожалуйста...

проблема была именно в namespace. точнее в их наличии.

soap::lite подставляет ns во все элементы, принадлежащие soap:env.
Код: plaintext
1.
2.
3.
my $service = new SOAP::Lite
	-> uri('http://localhost/services/service') # вот это вот
	-> proxy('http://host:8080/Ejb/service?wsdl');
а по wsdl, ns должно быть только у метода parselXML
Код: plaintext
<element name='parseXML' type='tns:parseXML'/>
у параметра метода, т.е. у элемента String_1 ns не должно быть
Код: plaintext
1.
2.
3.
<sequence>
     <element name='String_1' nillable='true' type='string'/>
</sequence>
соответственно необходимо убрать ns у элемента String_1 при передаче
Код: plaintext
1.
my $content = $service->parseXML(SOAP::Data->name('String_1')->type('string' => $xml)->uri(''));

ну, и плюс кодировка $xml должна быть utf-8. я просто перевёл скрипт в utf-8, а можно заюзать
Encode::encode_utf8(...);

з.ы. дело оказалось, как в большинстве случаев, в невнимательности))
з.ы.ы. спасибо откликнувшимся
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / SOAP. Java - server, Perl - client. ох, уж эти кодировки...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]