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