XML aus Array mit SOAP::Data fürRequest bauen

XML aus Array mit SOAP::Data fürRequest bauen

am 19.07.2007 10:54:48 von Gregor Goldbach

Moin,

ich habe ein mittelschweres Problem mit SOAP::Lite.

Ausgangslage: Ich möchte per SOAP eine Methode aufrufen, die als Argument
unter anderem eine Liste von Zeichenketten erwartet.

In der WSDL steht für den entsprechenden Parameter Folgendes:



ArrayOfString ist wie folgt definiert:



wsdl:arrayType="soapenc:string[]"/>




Einer meiner Versuche, das Argument mit SOAP::Data zu bearbeiten, sieht so
aus:

$alt_names=\SOAP::Data->value(
SOAP::Data->name("AltNames" => \SOAP::Data->value(
SOAP::Data->name("item" => @alt_names)
->type("xsd:string"))
)->type("tsn1:ArrayOfString") );

Der SOAP-Client sendet dann aber merkwürdigerweise Folgendes an den
Server:



Auf Javaseite wird an entsprechender Stelle im XML-String Folgendes
generiert:


email:bla@blubb.de


Das versuche ich mit folgendem Konstrukt zu bauen:
my $alt_names=\SOAP::Data->value(
SOAP::Data->name("AltNames" => \SOAP::Data->value(
SOAP::Data->name("item" => @alt_names)
->type("xsd:string"))
)->attr({ 'SOAP-ENC:arrayType' => 'xsd:string[1]'})
->attr({ 'xsi:type' => 'SOAP-ENC:Array'})
);

Das gibt als Resultat ebenfalls



Wo steckt mein Denkfehler? Ich stehe gerade ziemlich auf dem
Schlauch...

--
Gregor Goldbach

Re: XML aus Array mit SOAP::Data fürRequestbauen

am 20.07.2007 11:17:30 von highKO Moye

manchmal ist SOAP::Lite schlauer als man glaubt und das basteln der SOAP Daten einfach,
versuch mal sowas (ungetestet):

@soapNames = map{SOAP::Data->type('string')->value($_)}@alt_names;
$alt_names = SOAP::Data->name("AltNames")->value(\@soapNames);

SOAP::Lite sollte den Rest dann schon machen,
wenn die URI und der Namespace auch richtig gesetzt wurde

allerdings musst Du das bei leeren Arrays selber machen,
weil SOAP::Lite ja den Typ der elemente nicht kennt wenn keins drin ist:
SOAP::Data->value([])
->attr({'SOAP-ENC:arrayType' => 'ns:'.$Type.'[0]'})
->uri( $Uri )
->prefix('ns');

Viel Spass beim einseifen
...highKO..

In article , Gregor Goldbach wrote:
> Moin,
>
> ich habe ein mittelschweres Problem mit SOAP::Lite.
>
> Ausgangslage: Ich möchte per SOAP eine Methode aufrufen, die als Argument
> unter anderem eine Liste von Zeichenketten erwartet.
>
> In der WSDL steht für den entsprechenden Parameter Folgendes:
>
>
>
> ArrayOfString ist wie folgt definiert:
>
>
>
> > wsdl:arrayType="soapenc:string[]"/>
>

>

>

>
> Einer meiner Versuche, das Argument mit SOAP::Data zu bearbeiten, sieht so
> aus:
>
> $alt_names=\SOAP::Data->value(
> SOAP::Data->name("AltNames" => \SOAP::Data->value(
> SOAP::Data->name("item" => @alt_names)
> ->type("xsd:string"))
> )->type("tsn1:ArrayOfString") );
>
....

Re: XML aus Array mit SOAP::Data fürRequest bauen

am 24.07.2007 11:25:21 von Gregor Goldbach

Am Fri, 20 Jul 2007 09:17:30 +0000 schrieb highKO Moye:

> manchmal ist SOAP::Lite schlauer als man glaubt und das basteln der SOAP
> Daten einfach, versuch mal sowas (ungetestet):
>
> @soapNames = map{SOAP::Data->type('string')->value($_)}@alt_names;
> $alt_names = SOAP::Data->name("AltNames")->value(\@soapNames);

Nein, das funktioniert leider auch nicht. Es wird wie gehabt keine Liste
der Werte, sondern schlicht



generiert. Da sind wohl ganz viele Würmer drin. :(

--
Gregor Goldbach

Re: XML aus Array mit SOAP::Data fürRequestbauen

am 25.07.2007 11:51:21 von highKO Moye

In article , Gregor Goldbach wrote:
> Am Fri, 20 Jul 2007 09:17:30 +0000 schrieb highKO Moye:
>
>> manchmal ist SOAP::Lite schlauer als man glaubt und das basteln der SOAP
>> Daten einfach, versuch mal sowas (ungetestet):
>>
>> @soapNames = map{SOAP::Data->type('string')->value($_)}@alt_names;
>> $alt_names = SOAP::Data->name("AltNames")->value(\@soapNames);
>
> Nein, das funktioniert leider auch nicht. Es wird wie gehabt keine Liste
> der Werte, sondern schlicht
>
>
>
> generiert. Da sind wohl ganz viele Würmer drin. :(
>

Re: XML aus Array mit SOAP::Data fürRequestbauen

am 25.07.2007 12:10:17 von highKO Moye

In article , Gregor Goldbach wrote:
> Am Fri, 20 Jul 2007 09:17:30 +0000 schrieb highKO Moye:
>
>> manchmal ist SOAP::Lite schlauer als man glaubt und das basteln der SOAP
>> Daten einfach, versuch mal sowas (ungetestet):
>>
>> @soapNames = map{SOAP::Data->type('string')->value($_)}@alt_names;
>> $alt_names = SOAP::Data->name("AltNames")->value(\@soapNames);
>
> Nein, das funktioniert leider auch nicht. Es wird wie gehabt keine Liste
> der Werte, sondern schlicht
>
>
>
> generiert. Da sind wohl ganz viele Würmer drin. :(


Oder es ist gar nichts drin im Array?
Also hier mal ein komplettes Perl Bsp. incl. Daten:

use SOAP::Lite +trace => 'debug';
use strict;

my $soap = SOAP::Lite
->uri('urn://tempuri.org/myschema')
->proxy('http://localhost:8080/test.soap')
->xmlschema('2001');

my @alt_names = qw( name1 name2 name3 );
my @soapNames = map{SOAP::Data->type('string')->value($_)}@alt_names;
my $alt_names = SOAP::Data->name("AltNames")->value(\@soapNames);
my $result = $soap->method($alt_names)->result;

das erzeugt bei mir:






name1
name2
name3





das sieht für mich OK aus...

Re: XML aus Array mit SOAP::Data fürRequest bauen

am 26.07.2007 14:16:53 von Gregor Goldbach

Am Wed, 25 Jul 2007 10:10:17 +0000 schrieb highKO Moye:

>> Nein, das funktioniert leider auch nicht. Es wird wie gehabt keine Liste
>> der Werte, sondern schlicht
>>
>>
>>
>> generiert. Da sind wohl ganz viele Würmer drin. :(
>
>
> Oder es ist gar nichts drin im Array?

Nee, nee, ein von Hand geklöppeltes Array mit Dingen drin habe ich schon
verwendet.

> Also hier mal ein komplettes Perl Bsp. incl. Daten:
[...]
> das erzeugt bei mir:
>
>
>
>
> > SOAP-ENC:arrayType="xsd:string[3]">
> name1 > xsi:type="xsd:string">name2 > xsi:type="xsd:string">name3
>

>

>

>

>
> das sieht für mich OK aus...

Für mich auch. Ich kipp hier gleich vom Stuhl, danke!

--
Gregor Goldbach