Gegevens binnehalen via SOAP
Ik ben nieuw in SOAP en probeer een volgens mij redelijk simpele actie voor elkaar te krijgen.
Ik heb SOAPUI geinstalleerd en wanneer ik daar de aanroep doe, krijg ik netjes terug wat ik verwacht.
Maar wanneer dat ik probeer te programmeren krijg ik alleen maar foutmeldingen...
Dit is wat ik zie in SOAPUI als request:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Afas.Profit.Services">
<soapenv:Header/>
<soapenv:Body>
<urn:GetData>
<urn:token>
<![CDATA[
<token><version>1</version><data>hier_dus_een_token</data></token>
]]>
</urn:token>
<urn:connectorId>HIER_EEN_GET</urn:connectorId>
<urn:filtersXml></urn:filtersXml>
<urn:skip>0</urn:skip>
<urn:take>20</urn:take>
</urn:GetData>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Header/>
<soapenv:Body>
<urn:GetData>
<urn:token>
<![CDATA[
<token><version>1</version><data>hier_dus_een_token</data></token>
]]>
</urn:token>
<urn:connectorId>HIER_EEN_GET</urn:connectorId>
<urn:filtersXml></urn:filtersXml>
<urn:skip>0</urn:skip>
<urn:take>20</urn:take>
</urn:GetData>
</soapenv:Body>
</soapenv:Envelope>
en daar komt dus netjes XML op terug.
Hoe dit in PHP op te lossen? Wat ik nu heb is dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$URL = "https://een-wsdl-url";
$WebserviceClient = new SoapClient($URL);
$parameters= array(
"token"=> 'hier_dus_een_token',
'connectorId' => 'HIER_EEN_GET',
'filtersXml' => '',
'skip' => 0,
'take' => 20,
);
$WebmethodResult = $WebserviceClient->GetData($parameters) or die('FOUT!');
var_dump($WebmethodResult);
?>
$URL = "https://een-wsdl-url";
$WebserviceClient = new SoapClient($URL);
$parameters= array(
"token"=> 'hier_dus_een_token',
'connectorId' => 'HIER_EEN_GET',
'filtersXml' => '',
'skip' => 0,
'take' => 20,
);
$WebmethodResult = $WebserviceClient->GetData($parameters) or die('FOUT!');
var_dump($WebmethodResult);
?>
De foutmelding is deze:
Quote:
Fatal error: Uncaught SoapFault exception: [soap:Server]
Er is een onverwachte fout opgetreden. in /xxx.nl/afas-soap-request-2.php:19
Stack trace: #0 /xxx.nl/afas-soap-request-2.php(19):
SoapClient->__call('GetData', Array) #1 {main} thrown in /xxx.nl/afas-soap-request-2.php on line 19
Er is een onverwachte fout opgetreden. in /xxx.nl/afas-soap-request-2.php:19
Stack trace: #0 /xxx.nl/afas-soap-request-2.php(19):
SoapClient->__call('GetData', Array) #1 {main} thrown in /xxx.nl/afas-soap-request-2.php on line 19
Ik hoop dat iemand me kan helpen met mijn eerste soap-stapjes?
Edit:
Ik heb code-tags, en quotes geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 25/11/2019 15:44:33 door - Ariën -
Het algemene stramien om te werken met Exceptions, en het opvangen van fouten is als volgt:
Code (php)
Het tweede deel is uiteraard alleen voor debugging en ontwikkeling. Het zou niet netjes staan als deze informatie op een live omgeving op het scherm wordt gedumpt.
En dan nog een security aspect: omdat je de informatie meestal in een HTML-context dumpt is het zaak dat er geen HTML wordt weergegeven of JavaScript wordt uitgevoerd, dus je doet er mogelijk verstandig aan om deze informatie te ontdoen van een mogelijk speciale betekenis binnen deze context, oftewel, je zou deze moeten escapen.
Hiertoe kun je een hulpfunctie introduceren:
Het catch-blok wordt vervolgens:
Code (php)
In het algemeen is het een goede gewoonte om alle "output" te escapen, tenzij je hier een speciale -en gedocumenteerde- reden hebt om dit niet te doen.
NB: zoveel staat ook (nagenoeg letterlijk) in de oorspronkelijke foutmelding: Fatal error: Uncaught SoapFault exception. Het leren "lezen" van dit soort foutmeldingen kan je heel erg ver op weg helpen. Als je in staat bent om te debuggen zal het (leren) programmeren je ook stukken beter afgaan, want het dwingt je om op een analytische manier naar je code te kijken en dingen uit te zoeken. Dit vergroot op zijn beurt jouw inzicht in wat er gebeurt waardoor het begrip toeneemt.
Dus in zekere zin is hier het "probleem" (weer) niet het probleem, maar meer het interpreteren van de foutmelding en het formuleren van een aanpak voor het analyseren van wat er precies misgaat.
Gewijzigd op 20/11/2019 16:13:53 door Thomas van den Heuvel
Wanneer ik de try/catch er bij zet krijg ik dit terug:
Quote:
SoapFault: Er is een onverwachte fout opgetreden.
#0 E:\xxx\soap-request-2.php(20): SoapClient->__call('GetData', Array)
#1 {main}
#0 E:\xxx\soap-request-2.php(20): SoapClient->__call('GetData', Array)
#1 {main}
Dus daar worden we helaas niet wijzer van...
Gewijzigd op 25/11/2019 15:45:21 door - Ariën -
$WebserviceClient = new SoapClient($URL);
vervangt door
$WebserviceClient = new SoapClient($URL, ['trace' => 1]);
en dan eventueel via de info op https://stackoverflow.com/questions/14030228/how-to-dump-soapclient-request-for-debug/50847927 de aanroepen en parameters checkt?
Toevoeging op 21/11/2019 14:58:56:
Gewijzigd op 21/11/2019 14:59:24 door Ivo P
Ik ben er achter waarcom het niet werkte: de token was niet in de juiste form (er moest blijkbaar iets xml-erigs in staan).
Dus het werkt met deze code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$myParams = array(
'token' => new \SoapVar( '<ns1:token><![CDATA[<token><version>1</version><data>123321123</data ></token >]]></ns1:token>', XSD_ANYXML ),
'connectorId' => 'HIER_EEN_GET',
'filtersXml' => '',
'skip' => 0,
'take' => 20,
);
$webService = new \SoapClient( $URL,
array(
'cache_wsdl' => WSDL_CACHE_NONE,
'trace' => true,
)
);
$result = $webService->GetData( $myParams );
$resultXml = $result->GetDataResult;
?>
$myParams = array(
'token' => new \SoapVar( '<ns1:token><![CDATA[<token><version>1</version><data>123321123</data ></token >]]></ns1:token>', XSD_ANYXML ),
'connectorId' => 'HIER_EEN_GET',
'filtersXml' => '',
'skip' => 0,
'take' => 20,
);
$webService = new \SoapClient( $URL,
array(
'cache_wsdl' => WSDL_CACHE_NONE,
'trace' => true,
)
);
$result = $webService->GetData( $myParams );
$resultXml = $result->GetDataResult;
?>
Edit:
Ik heb code-tags geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 25/11/2019 15:45:04 door - Ariën -
Vergeet je try-catch blok niet.