Thread Datenstruktur mit SOAP::Data (4 answers)
Opened by bianca at 2010-06-13 17:32

Gast bianca
 2010-06-14 08:36
#138300 #138300
Danke topeg!
Allerdings wird diese Variante vom Server so empfangen:
Code: (dl )
1
2
3
4
5
6
7
8
9
Array
(
[item] => Array
(
[0] => country
[1] => NL
)

)


Der Server scheint es nicht als key-value Paare sondern andres zu erkennen.

Als XML sieht diese Variante so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="ht
tp://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xml
soap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<foo>
<params><c-gensym3>
<item>
<key>country</key>
<value>NL</value>
</item>
</c-gensym3>
<c-gensym4>
<item>
<key>step</key>
<value>1</value>
</item>
</c-gensym4>
</params>
</foo>
</soap:Body>
</soap:Envelope>


Vielleicht erkennt der Server das jetzt anders wegen dieser c-gensym Tags oder der fehlenden xsd Bezeichnungen?

Den Request als XML kann man übrigens so provozieren:
use SOAP::Lite +trace => 'all'; als Aufruf
dann ein Objekt generieren mit einer bewusst falschen URL: my $soap = SOAP::Lite->proxy('binnichtda')->autotype(0);
und am Ende eine nicht existente Funktion aufrufen: $soap->call('foo',@params);

Komplett inkl. topeg's Vorschlag:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl -w
use strict;
use warnings;
use Data::Dumper;
use SOAP::Lite +trace => 'all';
my $soap = SOAP::Lite->proxy('http://binnicihtda:8080')->autotype(0);
my %data_to_send_in_soap_map = (
  'country' => 'NL',
  'step' => '1',
);

my (@soap_map,@params);
foreach my $key (keys %data_to_send_in_soap_map) {
  push @soap_map,
    \SOAP::Data->name('item')->value([
      SOAP::Data->name('key')->value($key),
      SOAP::Data->name('value')->value($data_to_send_in_soap_map{$key})
    ]);
}

@params = (
  SOAP::Data->name('params')->type('ns2:Map')->value(\@soap_map)
);

print Dumper (\@params);
$soap->call('foo',@params);


Ausgabe gekürzt:
Code: (dl )
1
2
3
4
5
6
7
SOAPAction: "#foo"

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="ht
tp://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xml
soap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><foo><params><c-gensym3><item><ke
y>country</key><value>NL</value></item></c-gensym3><c-gensym4><item><key>step</key><value>1</value></item></c-gensym4></para
ms></foo></soap:Body></soap:Envelope>

Last edited: 2010-06-14 08:51:09 +0200 (CEST)

View full thread Datenstruktur mit SOAP::Data