XML aus Array mit SOAP::Data fürRequest bauen
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:
<wsdl:part name="AltNames" type="tns1:ArrayOfString"/>
ArrayOfString ist wie folgt definiert:
<complexType name="ArrayOfString">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType"
wsdl:arrayType="soapenc:string[]"/>
</restriction>
</complexContent>
</complexType>
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" => [at] alt_names)
->type("xsd:string"))
)->type("tsn1:ArrayOfString") );
Der SOAP-Client sendet dann aber merkwürdigerweise Folgendes an den
Server:
<AltNames xsi:nil="true" xsi:type="tns1:ArrayOfString" />
Auf Javaseite wird an entsprechender Stelle im XML-String Folgendes
generiert:
<AltNames SOAP-ENC:arrayType="xsd:string[1]" xsi:type="SOAP-ENC:Array">
<item xsi:type="xsd:string">email:bla [at] blubb.de</item>
</AltNames>
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" => [at] alt_names)
->type("xsd:string"))
)->attr({ 'SOAP-ENC:arrayType' => 'xsd:string[1]'})
->attr({ 'xsi:type' => 'SOAP-ENC:Array'})
);
Das gibt als Resultat ebenfalls
<AltNames xsi:nil="true" xsi:type="tns1:ArrayOfString" />
Wo steckt mein Denkfehler? Ich stehe gerade ziemlich auf dem
Schlauch...
--
Gregor Goldbach
Re: XML aus Array mit SOAP::Data fürRequestbauen
manchmal ist SOAP::Lite schlauer als man glaubt und das basteln der SOAP Daten einfach,
versuch mal sowas (ungetestet):
[at] soapNames = map{SOAP::Data->type('string')->value($_)} [at] alt_names;
$alt_names = SOAP::Data->name("AltNames")->value(\ [at] 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 <pan.2007.07.19.08.54.47.755603 [at] dfn-cert.de>, 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:
>
> <wsdl:part name="AltNames" type="tns1:ArrayOfString"/>
>
> ArrayOfString ist wie folgt definiert:
><complexType name="ArrayOfString">
> <complexContent>
> <restriction base="soapenc:Array">
> <attribute ref="soapenc:arrayType"
> wsdl:arrayType="soapenc:string[]"/>
> </restriction>
> </complexContent>
></complexType>
>
> 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" => [at] alt_names)
> ->type("xsd:string"))
> )->type("tsn1:ArrayOfString") );
>
....
Re: XML aus Array mit SOAP::Data fürRequest bauen
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):
>
> [at] soapNames = map{SOAP::Data->type('string')->value($_)} [at] alt_names;
> $alt_names = SOAP::Data->name("AltNames")->value(\ [at] soapNames);
Nein, das funktioniert leider auch nicht. Es wird wie gehabt keine Liste
der Werte, sondern schlicht
<AltNames xsi:nil="true" xsi:type="tns1:ArrayOfString" />
generiert. Da sind wohl ganz viele Würmer drin. :(
--
Gregor Goldbach
Re: XML aus Array mit SOAP::Data fürRequestbauen
In article <pan.2007.07.24.09.25.20.75999 [at] dfn-cert.de>, 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):
>>
>> [at] soapNames = map{SOAP::Data->type('string')->value($_)} [at] alt_names;
>> $alt_names = SOAP::Data->name("AltNames")->value(\ [at] soapNames);
>
> Nein, das funktioniert leider auch nicht. Es wird wie gehabt keine Liste
> der Werte, sondern schlicht
>
> <AltNames xsi:nil="true" xsi:type="tns1:ArrayOfString" />
>
> generiert. Da sind wohl ganz viele Würmer drin. :(
>
Re: XML aus Array mit SOAP::Data fürRequestbauen
In article <pan.2007.07.24.09.25.20.75999 [at] dfn-cert.de>, 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):
>>
>> [at] soapNames = map{SOAP::Data->type('string')->value($_)} [at] alt_names;
>> $alt_names = SOAP::Data->name("AltNames")->value(\ [at] soapNames);
>
> Nein, das funktioniert leider auch nicht. Es wird wie gehabt keine Liste
> der Werte, sondern schlicht
>
> <AltNames xsi:nil="true" xsi:type="tns1:ArrayOfString" />
>
> 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 [at] alt_names = qw( name1 name2 name3 );
my [at] soapNames = map{SOAP::Data->type('string')->value($_)} [at] alt_names;
my $alt_names = SOAP::Data->name("AltNames")->value(\ [at] soapNames);
my $result = $soap->method($alt_names)->result;
das erzeugt bei mir:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope ....>
<SOAP-ENV:Body>
<namesp1:method xmlns:namesp1="urn://tempuri.org/myschema">
<AltNames xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[3]">
<item xsi:type="xsd:string">name1</item>
<item xsi:type="xsd:string">name2</item>
<item xsi:type="xsd:string">name3</item>
</AltNames>
</namesp1:method>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
das sieht für mich OK aus...
Re: XML aus Array mit SOAP::Data fürRequest bauen
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
>>
>> <AltNames xsi:nil="true" xsi:type="tns1:ArrayOfString" />
>>
>> 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:
>
> <?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope ....>
> <SOAP-ENV:Body>
> <namesp1:method xmlns:namesp1="urn://tempuri.org/myschema">
> <AltNames xsi:type="SOAP-ENC:Array"
> SOAP-ENC:arrayType="xsd:string[3]">
> <item xsi:type="xsd:string">name1</item> <item
> xsi:type="xsd:string">name2</item> <item
> xsi:type="xsd:string">name3</item>
> </AltNames>
> </namesp1:method>
> </SOAP-ENV:Body>
> </SOAP-ENV:Envelope>
>
> das sieht für mich OK aus...
Für mich auch. Ich kipp hier gleich vom Stuhl, danke!
--
Gregor Goldbach