soap request
Ik probeer dmv een soapcall de huidige voorraad op te halen.
Getest in Soapui > werkt
Maar de truc om het te vertalen naar een soapclient in php valt niet mee.
Voorbeeld request
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://java_stock/Trade_stock.wsdl/types/">
<soapenv:Header/>
<soapenv:Body>
<typ:getstockElement>
<typ:iXml>
<Root>
<Input>
<Article>415660</Article>
</Input>
</Root>
</typ:iXml>
</typ:getstockElement>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Header/>
<soapenv:Body>
<typ:getstockElement>
<typ:iXml>
<Root>
<Input>
<Article>415660</Article>
</Input>
</Root>
</typ:iXml>
</typ:getstockElement>
</soapenv:Body>
</soapenv:Envelope>
Ik loop steeds vast in de arrays volgens mij;
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
35
36
37
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
35
36
37
<?php
require_once('../lib/nusoap.php');
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$client = new nusoap_client('http://padnaarwsdl?WSDL');
$err = $client->getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
// Doc/lit parameters get wrapped
$param = array('article' => '104250');
$result = $client->_call('getstockElement', array('íXml' => array('root' => array('input' => $param))), '', '', false, true);
// Check for a fault
if ($client->fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>
require_once('../lib/nusoap.php');
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$client = new nusoap_client('http://padnaarwsdl?WSDL');
$err = $client->getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
// Doc/lit parameters get wrapped
$param = array('article' => '104250');
$result = $client->_call('getstockElement', array('íXml' => array('root' => array('input' => $param))), '', '', false, true);
// Check for a fault
if ($client->fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>
Wat doe ik verkeerd?
Thanks, Michiel
Persoonlijk vind ik dat de SOAPClient van PHP zelf een fijnere WSDL implementatie heeft..!
Dan is het na het inladen van de wsdl (new SOAPClient("wsdl")), gewoon $client->methode(params), met als antwoord je zooi ;)
En de params is meestal (ligt aan je wsdl) een StdClass met veldjes er in met je params..
Nu met StdClass, maar zonder resultaat;
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$client = new SoapClient("http://ws.retailbizz.nl/gateway/services/SID0003006?WSDL", array( trace=>1 ) );
$params = new stdClass;
$params->iXml = new stdClass;
$params->iXml->Root = new stdClass;
$params->iXml->Root->Input = new stdClass;
$params->iXml->Root->Input->Article = '415660';
echo $client->getstock( $params );
highlight_string( $client->__getLastRequest() );
highlight_string( $client->__getLastResponse() );
?>
$client = new SoapClient("http://ws.retailbizz.nl/gateway/services/SID0003006?WSDL", array( trace=>1 ) );
$params = new stdClass;
$params->iXml = new stdClass;
$params->iXml->Root = new stdClass;
$params->iXml->Root->Input = new stdClass;
$params->iXml->Root->Input->Article = '415660';
echo $client->getstock( $params );
highlight_string( $client->__getLastRequest() );
highlight_string( $client->__getLastResponse() );
?>
Werkt echo $client->getstock(415660); niet gewoon? Of $client->getstock(array('Article' => 415660));
Hiermee krijg ik keurig response;
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$client = new SoapClient("http://ws.retailbizz.nl/gateway/services/SID0003006?WSDL", array( trace=>1 ) );
echo "<pre>";
// Toon de beschikbare functies van de webservice
print_r( $client->__getFunctions() );
// Toon de gedefinieerde datatypes (complexeTypes) van de webservice
print_r( $client->__getTypes() );
echo "</pre>";
?>
$client = new SoapClient("http://ws.retailbizz.nl/gateway/services/SID0003006?WSDL", array( trace=>1 ) );
echo "<pre>";
// Toon de beschikbare functies van de webservice
print_r( $client->__getFunctions() );
// Toon de gedefinieerde datatypes (complexeTypes) van de webservice
print_r( $client->__getTypes() );
echo "</pre>";
?>
Kijk anders ook even naar SOAPVar. Echter, een stdclass zou moeten werken, al vind ik de WSDL een beetje vaag?
Het is met SOAP altijd een beetje prutsen, omdat PHP je niet direct goed kan presenteren hoe je het kan/moet aanroepen. Daar moet je dan een goede IDE voor hebben
Ik zit met precies hetzelfde probleem, en dezelfde webservice!