Может быть, вы попытаетесь заменить
my% data = (description => 'updated description');
с
my $ data = SOAP :: Data-> name (description => 'updated description');
У нас есть похожие проблемы при работе с нашим SOAP API, и он был решен с помощью чего-то подобного, упаковав сложные данные в SOAP :: Data. Надеюсь, это поможет. )
UPDATE:
Предыдущий совет не помог: похоже, это действительно ошибка SOAP :: Lite, которая вообще игнорирует определение soap-enc: Array в файле WSDL.
Наконец-то нашли обходной путь. Это не красиво, но в качестве последнего средства это может сработать.
Во-первых, я вручную загрузил файл WSDL с сайта Delcampe, сохранил его в локальном каталоге и назвал его ...
my $service = SOAP::Lite->service('file://...delcampe.wsdl')
... поскольку требуется абсолютный путь.
Затем я прокомментировал «строку arrData» в определении WSDL updateItem.
И, наконец, я сделал это:
my $little_monster = SOAP::Data->name(arrData =>
\SOAP::Data->value((
SOAP::Data->name(item =>
\SOAP::Data->value(
SOAP::Data->name(key => 'personal_reference'),
SOAP::Data->name(value => 'Some Personal Reference')->type('string'),
)
),
SOAP::Data->name(item =>
\SOAP::Data->value(
SOAP::Data->name(key => 'title'),
SOAP::Data->name(value => 'Some Amazing Title')->type('string'),
)
),
# ...
))
)->type('ns1:Map');
... и, признаюсь, успешно выпустил его в пустыню ...
$service->updateItem($key, 123456, $little_monster);
... который, по крайней мере, породил более-менее привлекательный конверт.
Я искренне надеюсь, что это спасет хотя бы какую-нибудь бедную душу от удара головой о стену так же, как я работал над всем этим. )