[PHP / SOAP] via een request data ophalen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Loadichus
  • Registratie: November 2002
  • Laatst online: 01-06-2021
Beste Tweakers,

Vandaag mag ik mijn eerste ervaring opdoen met PHP & SOAP, iets waar ik hoop meer over te leren.
Online kan ik helaas weinig goeie voorbeelden vinden over wat ik wil.

Ik wil een voorraad opvraag doen per EAN nummer waar ik return krijg van locatie, eannummer en hoeveelheid.

XML Server
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<wsdl:operation name="GetStockInfo">
    <wsdl:input wsaw:Action="http://tempuri.org/IVRCGateway/GetStockInfo" message="tns:IVRCGateway_GetStockInfo_InputMessage" />
    <wsdl:output wsaw:Action="http://tempuri.org/IVRCGateway/GetStockInfoResponse" message="tns:IVRCGateway_GetStockInfo_OutputMessage" />
</wsdl:operation>

<wsdl:message name="IVRCGateway_GetStockInfo_InputMessage">
    <wsdl:part name="parameters" element="tns:GetStockInfo"/>
</wsdl:message>

<wsdl:message name="IVRCGateway_GetStockInfo_OutputMessage">
    <wsdl:part name="parameters" element="tns:GetStockInfoResponse"/>
</wsdl:message>

<xs:element name="GetStockInfo">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="Identifier" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="EANCodes" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>


Eerst de functions & complextypes opgevraagd, en het benodigde gevonden

Functions:
code:
1
[5] => GetStockInfoResponse GetStockInfo(GetStockInfo $parameters)


Complextypes:
code:
1
2
3
4
5
6
7
8
[4] => struct ArrayOfStockInfo {
 StockInfo StockInfo;
}
[5] => struct StockInfo {
 string EANCode;
 double Quantity;
 string Store;
}


Nu moet ik dus een EANcode aan de server geven om results terug te krijgen. Aan de hand van voorbeelden kwam ik tot volgende code, die uiteraard niet werkt.

Heeft iemand toevallig een goed voorbeeld waar je data meegeeft en een resultaat terug krijgt? Of tips die mij verder op weg helpen?
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

$wsdl_url ="http://www.hosting.nl/VRCGateway.svc?wsdl";
$client = new SoapClient($wsdl_url);

$obj = array( 'Identifier' => '', 'EANCodes' =>'8714758000015');

$result = $client->GetStockInfo('', '8714758000015');

var_dump($result);

?>


Ik ben al iets verder maar krijg met bovenstaande code de volgende error
code:
1
2
3
4
5
6
7
Fatal error: Uncaught SoapFault exception: [a:DeserializationFailed] The formatter threw an exception while
trying to deserialize the message: Error in deserializing body of request message for operation
'GetStockInfo'. End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected.
Found element 'param1' from namespace ''. Line 2, position 153. in /home/%hosting%/public_html/stoc
/index.php:17 Stack trace: #0 [internal function]: SoapClient->__call('GetStockInfo', Array) #1
/home/%hosting%/public_html/stock/index.php(17): SoapClient->GetStockInfo('', '') #2 {main} thrown in
/home/%hosting%/public_html/stock/index.php on line 17

[ Voor 18% gewijzigd door Loadichus op 27-08-2012 15:41 . Reden: error erbij ]


Acties:
  • 0 Henk 'm!

Verwijderd

In principe wordt er al duidelijk gemaakt wat je nodig hebt. Het is even wennen als je het voor het eerst ziet. Kijk maar eens naar deze link: http://www.php.net/manual/en/soapvar.soapvar.php
Hier wordt een complex type meegestuurd in het request(bij de examples).

Deze struct dien je zelf aan te maken als class en de parameters te zetten. Voor jou zal dit dus zijn:
code:
1
2
3
4
5
6
7
8
class StockInfo {
    function StockInfo($s, $i, $f) 
    {
        $this->EANCode = $s;
        $this-> Quantity = $i;
        $this->Store = $f;
    }
}


Daarna moet je met soapvar en soapparam er een soapobject van maken alvorens je het mee kan sturen. :)

Acties:
  • 0 Henk 'm!

  • Loadichus
  • Registratie: November 2002
  • Laatst online: 01-06-2021
Thanks voor de input het was wel het zetje naar de juiste richting
Achteraf was het ook heel simpel ....

Ik druk dus wat spul in een array, maar haal deze in het resultaat gewoon niet op.
In plaats daarvan wil ik het 2x benoemen.
quote: Oude code
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

$wsdl_url ="http://www.hosting.nl/VRCGateway.svc?wsdl";
$client = new SoapClient($wsdl_url);

$obj = array( 'Identifier' => '', 'EANCodes' =>'8714758000015');

$result = $client->GetStockInfo('', '8714758000015');

var_dump($result);

?>
Deze code werkt dus wel:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

$wsdl_url ="http://www.hosting.nl/VRCGateway.svc?wsdl";
$client = new SoapClient($wsdl_url);

$obj = array( 'pid' => NULL, 'EANCodes' =>'8714758000015');

$result = $client->GetStockInfo($obj);

var_dump($result);

?>


Oh en het feit dat Identifier eigenlijk pid wordt genoemd heeft ook geholpen ;)

[ Voor 5% gewijzigd door Loadichus op 28-08-2012 11:58 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Mooi :) Als je in de toekomst hier problemen mee hebt kun je de trace optie aanzetten bij het aanmaken van je soap client. Dan kun je de verstuurde soap-envelopes bekijken. Scheelt wat debug werk :D

Acties:
  • 0 Henk 'm!

  • Loadichus
  • Registratie: November 2002
  • Laatst online: 01-06-2021
Heb inmiddels de code alweer wat getuned en heb ook de trace er in verwerkt. Dit is inderdaad een goeie tip.

In het voorbeeld vul ik nu zelf 'hard' de EANCode (als input). Hoe zou ik dit variabel kunnen maken met bijvoorbeeld een form / invoerveld?

Dus eigenlijk hoe transporteer je de waarde van een invoerveld naar de input?

code:
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
<?php

$wsdl_url ="http://www.hosting.nl/VRCGateway.svc?wsdl";

    try {
        $client = new SoapClient($wsdl_url, array('exeptions' => true), array('trace' => 1));
    }                
    catch( Exception $e)                                
    {
        echo $e->getMessage();
    }

                
    $obj = array( 
        "pid" => null, 
        "EANCodes" => '8714758000015'
    );
                
    $result = $client->GetStockInfo($obj);

//  echo '<pre>'. print_r($result, true) .'</pre>';
    
    
    foreach ( $result->GetStockInfoResult->StockInfo as $res) {
        echo $res->EANCode . '<br/>';
        echo $res->Quantity . '<br/>';
        echo $res->Store . '<br/>';
    }

?>

Acties:
  • 0 Henk 'm!

  • Loadichus
  • Registratie: November 2002
  • Laatst online: 01-06-2021
Wederom weer wat stappen verder gekomen. Nu via een simpele form een variabele input voor elkaar gekregen. Als ik nu verschillende EAN nummers invul krijg ik netjes de voorraad en voorraadlocatie naar voren.

Alleen bij het laden krijg ik natuurlijk een error over de foreach.
code:
1
Warning: Invalid argument supplied for foreach() in /home/hosting.nl/public_html/stock/input.php on line 32


Dit komt natuurlijk omdat de variabele waarde leeg is bij het laden. Ik zal me even verdiepen over hoe ik deze kan afvangen.

code:
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
38
39
40
41
<html>
<body>

<form method="post" action="<?php echo $PHP_SELF;?>">
EANnr:<input type="text" size="13" maxlength="13" name="EAN"><br />
<input type="submit" />
</form>

<?php

$wsdl_url ="http://www.hosting.nl/VRCGateway.svc?wsdl";
$EAN = $_POST["EAN"];

    try {
        $client = new SoapClient($wsdl_url, array('exeptions' => true));
    }                
    catch( Exception $e)                                
    {
        echo $e->getMessage();
    }

                
    $obj = array( 
        "pid" => null, 
        "EANCodes" => "$EAN"
    );
                
    $result = $client->GetStockInfo($obj);

//  echo '<pre>'. print_r($result, true) .'</pre>';
    
    
    foreach ( $result->GetStockInfoResult->StockInfo as $res) {
        echo $res->EANCode . '<br/>';
        echo $res->Quantity . '<br/>';
        echo $res->Store . '<br/>';
    }

?>
</body>
</html>
Pagina: 1