SOAP array van complexTypes returnen (WSDL 1.x)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

Topicstarter
Hi,

Ik heb een WSDL, te vinden: https://services.signet.nl/webservice.wsdl

Nou moet ik daar, zoals je kan zien, 2 "arrays" returnen (fiberRows en dslRows).

Simpele vraag: Hoe doe ik dit?

Als ik een multi dimensionale array maak (in het grof):
code:
1
2
3
4
5
6
7
8
9
Array (
  [0] => Array (
    [network] => "bla",
    [bla] => "blabla", etc
  )
  [1] => Array (
    etc...
  )
)

En die dan simpelweg ga returnen in mijn functie (die ik met addFunction() toe heb gevoegd), dan is het resultaat dit:
SOAP-ERROR: Encoding: object hasn't 'network' property

PHP:
1
return array("fiberRows" => $fiber, "dslData" => $dslData);

$fiber is dan de boven genoemde array.

Dus ik pas de code een stukje aan:
PHP:
1
2
$fiber = new SoapVar($fiber, SOAP_ENC_ARRAY);
return array("fiberRows" => $fiber, "dslData" => $dslData);


Dan krijg ik het resultaat dat het wel binnenkomt op de client, met deze code:
PHP:
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
30
31
32
33
34
<?php
ini_set('display_errors', 1);
ini_set('soap.wsdl_cache_ttl', 1); // Alleen in de test fase aan laten staan!!

error_reporting(E_ALL);

$auth = new StdClass();
$auth->username = "******";
$auth->password = "*******";

$check = new StdClass();
$check->postcode = "1234AB";
$check->number = "9";

try {
    // Maak een Client aan
    $client = new SoapClient("https://services.signet.nl/webservice.wsdl", array("trace" => 1));

    $auth = new SoapHeader("urn:signet", "authentication", $auth, false);

    $client->__setSoapHeaders(array($auth));

    // Doe een postcode check
    $res = $client->postcodeCheck($check);

    // En zet de data op het scherm
    echo '<pre>'.print_r($res, true).'</pre>';
} catch (Exception $e) {
    // Oops! Er is iets fout gegaan.
    echo '<h1>Caught Exception</h1>';
    echo '<pre>'.htmlentities($e).'</pre>';
}
echo $client->__getLastResponse();
?>


Het resultaat is dan een lege fiberRows array:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Array
(
    [fiberRows] => stdClass Object
        (
        )

    [dslRows] => stdClass Object
        (
        )

    [dslData] => stdClass Object
        (
            [location] => *knip*
            [bname] => *knip*
            [distance] => 90
        )

)


Terwijl het als volgt binnenkomt (met dank aan de laatste regel):
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<fiberRows>
<ns1:Map>
<item>
<key>available</key>
<value>true</value>
</item>
<item>
<key>distance</key>
<value>107</value>
</item>
(.. ETC ..)


Dus: het komt wel binnen dan; maar PHP snapt het niet helemaal?
Enig idee hoe dit opgelost moet worden?

PS: De dslRows heb ik er nog even uit gelaten in de server, omdat ik eerst de fiberRows wil laten werken.
Oh, en bepaalde data (postcodes) zijn verranderd vanwege privacy.

Groetjes

Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

Topicstarter
Opgelost; de data zelf was gewoon fout...

Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

Topicstarter
Nou wil iemand mijn WSDL gaan gebruiken met .NET.. en het geluk is blijkbaar weer niet aan mijn kant,
mijn WSDL: https://services.signet.nl/webservice.wsdl

Deze persoon geeft aan dat de operation niet zichtbaar is, en dat hij ook geen 'parameters' type heeft in .NET (ik weet niet hoe dat werkt in .NET omdat ik geen .NET gebruik).

Echter, deze WSDL: http://my.eurofiber.com/ws/wsdl werkt bij hem wel. Deze WSDL lijkt sterk op mijn WSDL.

Maar.. Welke verschillen zorgen er nou voor dat .NET het niet slikt ( en PHP wel trouwens, en validators valideren mijn WSDL ook prima ) ?

Ik heb het ook in een ander topic van me gepost over hetzelfde onderwerp, maar bedacht me dat het beter in dit topic kan omdat het om de nieuwe wsdl gaat..

Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

Topicstarter
Bumpje?

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:32

Haan

dotnetter

In je webservice zijn twee classes beschikbaar, authentication, waar je een username en password in kan vullen en wsPortService, die er als volgt uitziet:
Afbeeldingslocatie: http://tweakers.net/ext/f/UD5yNPmDepFWJOheCX9DO7YE/full.png

Je mist hierin dus inderdaad een functie om aan te roepen.

Als ik die andere webservice er naast leg, zie ik wel wat verschillen, zo probeer jij volgens mij nog een postcodeRequest class te definiëren, maar ben je vergeten die in een xsd:element te wrappen, die zou zo moeten zijn:
XML:
1
2
3
4
5
6
7
8
  <xsd:element name="postcodeRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="postcode" type="xsd:string" />
          <xsd:element name="number" type="xsd:string" />
        </xsd:sequence>
      </xsd:complexType>
  </xsd:element>


Het zou kunnen dat de rest dan ook niet goed werkt omdat deze class als parameter wordt gebruikt in je postcodeCheck functie.

[ Voor 51% gewijzigd door Haan op 04-05-2010 09:29 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

Topicstarter
Dankje voor je reactie!
Ik heb het aangepast naar hoe jij daar vermeld, en zie dat PHP het verder niet uitmaakt. Al mijn applicaties draaien nog prima (nadat ik de caches had verwijderd).

Zou je kunnen kijken of .NET het nu wel slikt?

het probleem van dit project is dat PHP blijkbaar een parser heeft die wat "liever" is, wat minder "gevoelig"..
Hierdoor kan ik nooit weten of .NET het wel slikt..

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:32

Haan

dotnetter

Misschien dat je een Visual Studio trial kan installeren, zodat je zelf kan testen. Je webservice geeft nu namelijk een foutmelding
unable to import binding 'dwp' from namespace 'urn:signet'

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

Topicstarter
Inderdaad een goed idee.

Dankjewel voor al je hulp, ik ga er mee aan de slag! :)
Pagina: 1