PHP Sapone chiamata non WSDL: come si fa a passare i parametri?
-
06-09-2019 - |
Domanda
Sto cercando di fare una chiamata non WSDL in PHP (5.2.5) come questo. Sono sicuro che mi manca qualcosa di semplice. Questa chiamata ha un parametro, una stringa, chiamato "fuso orario":
$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';
$client = new SoapClient(null, array(
'location' => $URL,
'uri' => "http://www.Nanonull.com/TimeService/",
'trace' => 1,
));
// First attempt:
// FAILS: SoapFault: Object reference not set to an instance of an object
$return = $client->__soapCall("getTimeZoneTime",
array(new SoapParam('ZULU', 'timezone')),
array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);
// Second attempt:
// FAILS: Generated soap Request uses "param0" instead of "timezone"
$return = $client->__soapCall("getTimeZoneTime",
array('timezone'=>'ZULU' ),
array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);
Grazie per qualsiasi suggerimento
-Dave
Soluzione 2
Grazie. Ecco l'esempio completo che ora funziona:
$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';
$client = new SoapClient(null, array(
'location' => $URL,
'uri' => "http://www.Nanonull.com/TimeService/",
'trace' => 1,
));
$return = $client->__soapCall("getTimeZoneTime",
array(new SoapParam('ZULU', 'ns1:timezone')),
array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);
Altri suggerimenti
di @ Dave C non ha funzionato per me. Guardandomi intorno mi si avvicinò con un'altra soluzione:
$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';
$client = new SoapClient(null, array(
'location' => $URL,
'uri' => "http://www.Nanonull.com/TimeService/",
'trace' => 1,
));
$return = $client->__soapCall("getTimeZoneTime",
array(new SoapParam(new SoapVar('ZULU', XSD_DATETIME), 'timezone')),
array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);
Spero che questo possa aiutare qualcuno.
Il problema sta da qualche parte nella mancanza di informazioni namespace nel parametro. Ho usato il primo caso di vostro esempio dal momento che era più vicino a quello che mi è venuta.
Se si modifica la riga:
array(new SoapParam('ZULU', 'timezone')),
a:
array(new SoapParam('ZULU', 'ns1:timezone')),
dovrebbe dare il risultato che vi aspettavate.
Si potrebbe provare per aggiungere un'altra chiamata array()
intorno ai vostri params in questo modo:
$params = array('timezone'=>'ZULU' );
$return = $client->__soapCall("getTimeZoneTime",
array($params),
array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);
Non riesco a provare questo, ma si potrebbe.