[PHP/Soap] Parameters worden niet meegegeven?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Drak0z
  • Registratie: November 2002
  • Laatst online: 02-02-2015
Enigszins opgelost, zie 2e post

Beste medetweakerts,

Ondertussen ben ik dik een week aan het pielen om een PHP Soap server/client aan de gang te krijgen en ben ik er spuug zat van :-)
Gisteren dacht ik de boel eindelijk aan de draai te hebben (ik kreeg in elk geval geen exceptions meer), maar na controle vanmorgen bleek dat mijn parameters in de aangeroepen (serverside) functie niet ingevuld worden. Het is vast iets kleins en doms wat ik over het hoofd zie, dus voel je vrij om mij uit te lachen :-)

Om het even kort samen te vatten, ik roep een functie getCard van mijn client op mijn server met een kaartnummer en een kaartcode op de volgende, korte manier:
PHP:
1
2
3
4
5
6
7
8
9
<?php
...
$params = array(
    "cardNumber"    => 12345,
    "cardCode"      => "ABCD"
);
...
$result = $soapClient->getCard($params);
?>


Hierbij controleer ik in mijn server op $cardCode == "ABCD" en return dan een $valid = true en een waarde van 1.0, anders return ik een false met een 0. Je zou dus zeggen dat bovenstaande request een respons zou moeten genereren van true en 1.0 .. Helaas vinden de phpgoden van niet.
Het resultaat wat ik krijg (var_dump van de $result variabele, waarbij de "debug" een string is die tussen de blokhaken het meegekregen nummer en code moet teruggeven).
code:
1
2
3
4
5
6
7
8
9
Result: 
object(stdClass)#2 (3) {
  ["isValid"]=>
  bool(false)
  ["cardValue"]=>
  float(0)
  ["debug"]=>
  string(27) "cardNumber: [] cardCode: []"
}

De functie wordt dus duidelijk wel aangeroepen, maar de parameters zijn leeg :?
Waar en/of waarom ga ik de mist in?

Hieronder de volledige code voor de liefhebber.
server.php
PHP:
1
2
3
4
5
6
7
<?php
require 'functions.php';
ini_set("soap.wsdl_cache_enabled", 0); // disabling WSDL cache
$server = new SoapServer("backend.wsdl");
$server->addFunction("getCard");
$server->handle();
?>


functions.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function getCard($cardNumber, $cardCode) {
    $cardValue = 0;
    $valid = false;
    if ($cardCode == "ABCD") {
        $valid = true;
        $cardValue = 1.00;
    }

    return array(
        'isValid' => $valid,
        'cardValue' => $cardValue,
        'debug' => "cardNumber: [" . $cardNumber . "] cardCode: [" . $cardCode . "]"
    );
}
?>


client.php
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
<?php //client-test.php
ini_set("soap.wsdl_cache_enabled", 0); // disabling WSDL cache
$soapClient = new SoapClient("http://localhost/soap_test/backend.wsdl");

/* [DEBUG] */
echo "<pre>";
echo "Functions: \n";
$functions = $soapClient->__getFunctions();
print_r($functions);
echo "\nTypes: \n";
$types = $soapClient->__getTypes();
print_r($types);
/* [/DEBUG] */

/* Create some test parameters */
$params = array(
    "cardNumber"    => 12345,
    "cardCode"      => "ABCD"
);

/* Try to call them at the soap server */
try {
    $result = $soapClient->getCard($params);
} catch (SoapFault $exception) {
    echo "EXCEPTION " . $exception;
}

/* Print out the result */
echo "\nResult: \n";
var_dump($result);
?>


Wsdl bestand

Eventueel kun je ook via http://peter.ropeit.nl:8080/soap_test/ de code testen.

Alvast bedankt, en nogmaals, voel vrij om me uit te lachen als het echt heel dom is, maar uit ervaring weet ik dat als je een week of meer met een (dom) programmeer probleem bezig bent je regelmatig ; en andere simpele zooi over het hoofd ziet :-)

*edit* sluithaakje vergeten

Acties:
  • 0 Henk 'm!

  • Drak0z
  • Registratie: November 2002
  • Laatst online: 02-02-2015
Ik heb het nu maar gewoon vies gedaan, een array heen en een array terug, en dat werkt wel. Blijkbaar had het kreng moeite met meer parameters in een functie-call... Nouja, kan ik in elk geval verder nu :)

Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 09-09 20:06
Is het niet zo dat jij getCard() aanroept met een array met daarin parameters, en je getCard() functie op de server 2 parameters verwacht. Dus dan zou het $soapclient->getCard(12345, "ABCD"); moeten zijn.

Verder zegt de PHP documentatie dat SOAPClient::__call() (de functie die wordt aangeroepen) deprecated is, hoewel het alternatief weer terugverwijst 8)7

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De documentatie van SoapClient is dan ook behoorlijk achterhaald, incompleet en waardeloos. :+ Kwaliteit van de docs van deze module is iig ver onder het gemiddelde.

Overigens zou ik best ook wel inhoudelijk willen helpen, maar dan is een stukje wsdl wel welkom. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Drak0z
  • Registratie: November 2002
  • Laatst online: 02-02-2015
Ha, reacties! :)

@hostname
Wanneer ik de functie getCard() aanriep met 12345, "ABCD" kreeg ik de melding dat SOAP een Array verwachtte. Na googlewerk (zal ik straks weer even proberen terug te vinden, zit nu op stage) kwam ik tegen dat als je een functie met meerdere parameters zou willen aanroepen (dus daadwerkelijk aan de 'server kant' een getCard($number, $code) ) je het in een named array moest meegeven, dus zoals boven:
PHP:
1
2
3
4
5
6
7
8
9
<?php
...
$params = array(
    "cardNumber"    => 12345,
    "cardCode"        => "ABCD"
);
...
$result = $soapClient->getCard($params);
?>

Soap zou zelf dan zo snugger moeten zijn om die keys in te vullen als parameters in de serverside functie. Helaas heeft mijn Soap een paar pillen morfine te veel gehad en snapte die dat niet meer blijkbaar :)

Dat __call zelf deprecated is is omdat het waarschijnlijk nu de bedoeling is om direct $client->functie() aan te roepen ipv $client->__call("functie", ""). Dat het achter de schermen de boel ombouwt van die eerste naar die tweede, so be it, het maakt 'mijn' code er wel netter door ;)

@Voutloos
De link naar de (nieuwe) wsdl staat onderaan de post, daar heb ik gebruik gemaakt van php2wsdl (bah vieze wsdl output, maar het werkt) en puur een array voor input en een array voor output. Mocht je lui zijn dan heb je 'm hier nog een keer ;) wsdl

Ik wou een functie getCard met 2 parameters, en dat kreeg ik niet aan de gang, dus heb ik er maar een getCard($card) van gemaakt, waar $card een array is. Liever heb ik natuurlijk dat ik mijn functie met meer dan 1 parameter aan kan roepen, gewoon omdat ik dat netter vind. Als een van jullie dus een stukje documentatie heeft waaruit blijkt hoe ik dit wel zou kunnen doen, GRAAG!

[ Voor 3% gewijzigd door Drak0z op 15-04-2010 10:51 ]


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Nu online
Handmatig aanroepen, dan werkt het wel:
PHP:
1
2
3
4
5
6
/* Try to call them at the soap server */ 
try { 
    $result = $soapClient -> __soapCall('getCard', $params); 
} catch (SoapFault $exception) { 
    echo "EXCEPTION " . $exception; 
}


Ben iets dergelijks al eerder tegengekomen (met .net servers), PHP's soapclient class is wat naar soms ;) Je kan trouwens ook __call gebruiken zoals ik in m'n blog schrijf, maar die is kennelijk ondertussen alweer deprecated :X

[ Voor 19% gewijzigd door FragFrog op 15-04-2010 13:07 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Drak0z
  • Registratie: November 2002
  • Laatst online: 02-02-2015
@FragFrog
Ik meen mij te herinneren dat ik het ook via __soapCall direct geprobeert heb, maar dat is alweer een paar stressvolle dagen geleden. Ik probeer het vanavond wanneer ik thuis ben nog wel een keertje. Het grootste euvel zit 'm bij mij in mijn wsdl bestand denk ik. Ik ben een 'vrij goede' php programmeur (jaartje of 5 professionele ervaring), maar in die tijd heb ik eigenlijk nog niks met wsdl bestanden gedaan. Ik zag dat de soapserver ook zonder wsdl zou moeten werken, maar daar begin ik maar niet aan :) Maargoed, als ik thuis ben mijn oude bestanden maar weer uit de repo trekken en kijken of het wel direct werkt met de __soapCall (hoewel ik dat betwijfel ;) )

Acties:
  • 0 Henk 'm!

  • stappel_
  • Registratie: Augustus 2000
  • Laatst online: 26-04 17:39
als je problemen heb met de wsdl kan je misschien beter de nusoap server gebruiken.
hij genereerd de wsdl realtime op basis van de functies die jij aan de server geeft.
voorbeeld:
PHP:
1
2
3
4
5
6
7
$l_oServer->register( 'checkLogin',
    array('username'     => 'xsd:string',
          'passwordhash' => 'xsd:string',
          'token'        => 'xsd:string'),
    array('return' => 'xsd:boolean'),
    $t_namespace
);

en hij maakt een soapAction met een operation en 2 messages aan (in en out)

Ubero: #2, Euler: #1, GOT: #1, Des: #1, Zeta: #1, Eon: #3, OGR-24: #3, OGR-25: #7,
LM: #7, AP: #5, DF: #19, D2OL: #37, SOB: #50, TSC: #63, RC5: #96


Acties:
  • 0 Henk 'm!

  • Drak0z
  • Registratie: November 2002
  • Laatst online: 02-02-2015
@stappel_
nuSoap begin ik liever niet aan. Ik heb er in het verleden ooit eens mee gewerkt (toen php 5 net uit was en 'onze hoster' nog aan de php 4 was, was nuSoap de enige oplossing). nuSoap was toen echt buggy as hell terwijl de php5 native soap server toen al prima draaide. Gezien de releasedate van de meest recente nuSoap versie (~2007) is dat niet een heel veel nieuwere versie van de versie die ik toen gebruikte. Daarbij kan de php native Soap server ook zonder voorgekauwde wsdl werken, maar omdat ik ook graag wsdl wil snappen én het gewoon netter is om vanaf wsdl te werken doe ik dit dus niet :)
Pagina: 1