Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3031[/thread]

SOAP Response: mehere Knoten mit gleichem Namen

Leser: 1


<< >> 10 Einträge, 1 Seite
einfach
 2006-09-14 16:28
#28631 #28631
User since
2006-09-14
6 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

Ersteinmal: ich bin relativ neu in Perl und Web Services inkl. SOAP... also seid nachsichtig ;-)

Ich benutze SOAP::Lite um bei einem Web Service einen Request abzusetzen. Ich erhalte die Nachricht auch und kann (fast) alles, was ich benötige auslesen.
Allerdings gibt es einen Konten in der Response, der mehrere Knoten mit gleichem Bezeichner beinhaltet. Dass diese auf jeden Fall da sein sollten sehe ich, da ich das debugging des HTTP-Verkehrs eingeschaltet habe und somit Request und Response sehen kann. Die Knoten sind also da! Nach dem Deserialisieren befindet sich von diesen Knoten allerdings immer nur mehr der letzte in meinem Result. Er nimmt also immer nur genau einen von diesen Knoten, die den gleichen bezeichner haben.

Zur Veranschaulichung hier die Response:
Code: (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
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<RouteShipmentResponse xmlns="http://xlogics.pl/xpack/webservices">
<RouteShipmentResult>false</RouteShipmentResult>
<aRoutingData>
<RoutingCode />
<RoutingCodeData />
</aRoutingData>
<aAddressCorrectionInfo>
<CorrectedName />
<CorrectedZIP />
<CorrectedCity />
<CorrectedDistrict />
<CorrectedStreet />

<Streets>
<string>Promenade</string>
<string>Promenadenstr.</string>
</Streets>

<Cities><string /></Cities>
<Districts><string /></Districts>
<ZIPs><string /></ZIPs>
</aAddressCorrectionInfo>
<aErrorMessage />
</RouteShipmentResponse>
</soap:Body>
</soap:Envelope>


Es handelt sich um den Bereich, den ich hervorgehoben habe: Streets.
in meinem Perlcode mache ich u.a. folgendes:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
[..blablabla..]

my ($som) = $service->call($method => @params, $envHeader);

[..blablabla..]

printf "\nStreets: ";
foreach $street ($som->valueof('//Streets')) {
printf "\n\t%s", $street->{string};
}


und die Ausgabe ist folgende:

Quote
Streets:
Promenadenstr.


Ich habe mir mittels Debugger auch den Inhalt von $som und von $som->result angeschaut und da war wirklich nur dieser eine String drin. Es muss also schon etwas beim Deserialisieren anders gelaufen sein, als ich es gerne gehabt hätte...

Kann mir da jmd. was raten? Ist das ein Bug? Or a feature? :-D

Gruß, Christophe :blush:
vayu
 2006-09-14 16:58
#28632 #28632
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
ich habe auch schon mit SOAP::Lite gearbeitet, um auf einen Webservice von Jira zuzugreifen.

Ich konnt mir die erhaltenen Daten in einen Hash geben lassen. Falls nun so etwas vorkommt, dass mehrere gleiche tag verwendet wurden, wurde der tagname als Key im hash verwendet und ein anonymes array unter dem tag mit den Daten gefüllt.

ich vermute da ja fast, das da was im soap-schema des webservice falsch läuft. weil bei mir gab es damit keine probleme.
einfach
 2006-09-14 17:24
#28633 #28633
User since
2006-09-14
6 Artikel
BenutzerIn
[default_avatar]
@vayu: Kannst du mir denn vielleicht mal ein Beispiel zeigen, wie du darauf zugegriffen hast? Vielleicht mach ich da ja was falsch.

Es wundert mich nur, dass in meinem @result-Array auch nur dieser eine String steht. Wie oben erwähnt: In der reinen Response, die noch nicht von SOAP::Lite geparst wurde ist dieser String drin. Das hab ich schon mit einer Paket-Sniffer kontrolliert. In der Grafik sieht man auch nochmal, dass in der Variable der String nur einmal drin steht

http://212.117.75.158/debugger.jpg

Danke, Christophe
vayu
 2006-09-14 17:34
#28634 #28634
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
hab da nicht viel anders gemacht. ausser dass ich es mit soap direkt gemacht hab. also ein wsdl file am anfang dem soap objekt übergeben, so konnte ich die funktionen direkt auf dem objekt aufrufen.

du machst das ganze per xmlrpc. aber müsste es so funktionieren

Code: (dl )
1
2
3
4
5
6
7
8
my $versions = $jira->call("jira1.getVersions", $auth, $project)->result;

foreach (@$versions) {
if ( $_->{'name'} eq $name ) {
#return $_->{'id'};
return $_;
}
}


hab das auch mal am anfang per xmlrpc gemacht und da direkt die ergebnisse in einen hash oder ein array-of-hashes bekommen. je nachdem wie die xml struktur die zurückkam aussah

hier ist es zB ein AoH


btw: mit was für einem editor arbeitest du? find diese anzeige in deinem post ja sehr schick\n\n

<!--EDIT|vayu|1158241002-->
einfach
 2006-09-14 19:57
#28635 #28635
User since
2006-09-14
6 Artikel
BenutzerIn
[default_avatar]
Danke, werde es mir morgen mal genauer anschauen. wundert mich alles ein wenig...

Ich benutze Eclipse und dafür dann das E.P.I.C.-Perl-Plugin. Damit du dir die Variablen während des Debuggens anzeigen lassen kannst musst du allerdings noch padwalker von der epic-Homepage downloaden

Gruß, Christophe
GwenDragon
 2006-09-14 21:05
#28636 #28636
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Was für ein XML-Parser wird denn verwendet? Oder welches Perl?
Vielleicht spinnen die?
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

einfach
 2006-09-15 11:33
#28637 #28637
User since
2006-09-14
6 Artikel
BenutzerIn
[default_avatar]
Quote
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 25 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 817 [257965] provided by ActiveState http://www.ActiveState.com
Built Mar 20 2006 17:54:25


Quote
SOAP-Lite-0.65_3


Wie kann ich denn überhaupt einen anderen Parser verwenden? Ich blick da nicht durch. Um an die Resultate zu kommen mache ich einfach folgendes:

Code: (dl )
1
2
3
4
5
6
7
my ($som) = $service->call($method => @params, $envHeader);

## Auswertung
if ($som->fault) {
printf "Ein Fehler (%s) ist aufgetreten: %s\n", $result->faultcode, $result->faultstring;
} else {
@result = $som->paramsout;


Mich würde sowieso mal interessieren, wie ich an das rohe XML ran komme. Kann mir in der Hinsicht jmd. helfen?

Ich finde die Dokumentation von SOAP::Lite unglaublich schlecht. Da sollte wirklich noch dran gearbeitet werden...

Gruß, Christophe
vayu
 2006-09-15 12:12
#28638 #28638
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
welche dokumentation? ^^

ich hab mir das ding erklärt, indem ich in die sourcen geschaut hab.

an die "rohen" XML Daten kommst glaub ich gar nicht ran, zumindest nicht über das Modul.

der server, auf den du zugreifst, ist das ein public, oder intern mit geheimen Daten? :)

sonst würd ich mal schauen, ob ich da was hinbekomme


edith sagt: hui ... grad gesehen, der hat die Doku erweitert. Als ich das Modul benutzt habe, stand da noch so gut wie nichts auf der cpan seite (falls ich jetzt nicht komplett senil bin)\n\n

<!--EDIT|vayu|1158308212-->
einfach
 2006-09-15 12:46
#28639 #28639
User since
2006-09-14
6 Artikel
BenutzerIn
[default_avatar]
Quote
welche dokumentation? ^^

hehe, fast genau so ist es auch noch

Quote
ich hab mir das ding erklärt, indem ich in die sourcen geschaut hab.

ich bin schon froh, wenn ich meine eigenen Quellen lesen kann :-P

Quote
der server, auf den du zugreifst, ist das ein public, oder intern mit geheimen Daten?

Es ist leider ein geschützter Server... kann also nicht einfach so die Daten rüberschmeissen. Danke trotzdem für den Vorschlag. Ich weiß ja, dass die Daten zurückgegeben werden, jetzt muss ich nur noch herausfinden, wie ich die aus SOAP herauskriege. Kann doch nicht so schwierig sein, heisst doch schliesslich Simple blablabla

Christophe
einfach
 2006-09-15 15:30
#28640 #28640
User since
2006-09-14
6 Artikel
BenutzerIn
[default_avatar]
Ohhhhhhhhhh, ich habs endlich :p

Es ist natürlich wie immer ein dummer Fehler. Zum einen habe ich den "Vaterknoten" von meinen Strings ausgelesen (also "Streets" statt "Streets/string") und zum anderen, und das ist natürlich richtig richtig blöde: ich habe die da erhaltenen Werte in eine skalare Variable statt in ein Array gesichert... Konnte also gar nicht gehen. Blöd nur, dass Perl da nicht meckert sondern stillschweigend annimmt, ich hätte das so gewollt. Naja, egal. Ich habs endlich. Wollte ich nur mitteilen :D

Vielen Dank für eure Hilfe und eure Tipps Merci merci merci :blush:
<< >> 10 Einträge, 1 Seite



View all threads created 2006-09-14 16:28.