Отладка SOAP-вызова в PHP: в результате данных клиента возникла исключительная ситуация
Я работаю с API-интерфейсом UPS и испытываю трудности с отладкой. Я получаю следующую трассировку стека:
Details
Type: SoapFault
Message: An exception has been raised as a result of client data.
File: /Users/shawn/Documents/work/sites/Wingspan/kaleco/lib/SixString/Utilities/Ups.php
Line: 161
Trace
#0 /Users/shawn/Documents/work/sites/Wingspan/kaleco/lib/SixString/Utilities/Ups.php(161): SoapClient->__soapCall('ProcessShipment', Array)
#1 /Users/shawn/Documents/work/sites/Wingspan/kaleco/routes/ups.php(14): SixString\Utilities\Ups->getShipment()
#2 [internal function]: {closure}()
#3 /Users/shawn/Documents/work/sites/Wingspan/kaleco/vendor/slim/slim/Slim/Router.php(172): call_user_func_array(Object(Closure), Array)
#4 /Users/shawn/Documents/work/sites/Wingspan/kaleco/vendor/slim/slim/Slim/Slim.php(1222): Slim\Router->dispatch(Object(Slim\Route))
#5 /Users/shawn/Documents/work/sites/Wingspan/kaleco/vendor/slim/slim/Slim/Middleware/Flash.php(86): Slim\Slim->call()
#6 /Users/shawn/Documents/work/sites/Wingspan/kaleco/vendor/slim/slim/Slim/Middleware/MethodOverride.php(94): Slim\Middleware\Flash->call()
#7 /Users/shawn/Documents/work/sites/Wingspan/kaleco/vendor/slim/slim/Slim/Middleware/SessionCookie.php(116): Slim\Middleware\MethodOverride->call()
#8 /Users/shawn/Documents/work/sites/Wingspan/kaleco/vendor/slim/slim/Slim/Middleware/PrettyExceptions.php(67): Slim\Middleware\SessionCookie->call()
#9 /Users/shawn/Documents/work/sites/Wingspan/kaleco/vendor/slim/slim/Slim/Slim.php(1174): Slim\Middleware\PrettyExceptions->call()
#10 /Users/shawn/Documents/work/sites/Wingspan/kaleco/public/index.php(6): Slim\Slim->run()
#11 {main}
Вот блок кода:
try{
$mode = array('soap_version' => 'SOAP_1_1', 'trace' => 1,'exceptions' => true );
$client = new \SoapClient($wsdl , $mode);
$client->__setLocation($endpointurl);
$header = new \SoapHeader('http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0','UPSSecurity',$this->upss);
$client->__setSoapHeaders($header);
if(strcmp($operation,"ProcessShipment") == 0 ) {
$resp = $client->__soapCall('ProcessShipment',array($this->processShipment()));
echo "Response Status: " . $resp->Response->ResponseStatus->Description ."\n";
//print_r($client->__getLastRequest());
}
else if (strcmp($operation , "ProcessShipConfirm") == 0) {
$resp = $client->__soapCall('ProcessShipConfirm',array($this->processShipConfirm()));
echo "Response Status: " . $resp->Response->ResponseStatus->Description ."\n";
}
else {
$resp = $client->__soapCall('ProcessShipeAccept',array($this->processShipAccept()));
//get status
echo "Response Status: " . $resp->Response->ResponseStatus->Description ."\n";
echo "<pre>";
print_r($resp);
echo "</pre>";
}
}
catch(Exception $ex){
print_r ($ex);
}
Строка 161 в приведенном выше коде, это фактическая строка:
$resp = $client->__soapCall('ProcessShipConfirm',array($this->processShipConfirm()));
Я ищу способ отладить это. Кажется, он не достигает catch
блок, и я не могу определить причину исключения.
4 ответа
Попробуйте поймать исключение с SoapFault
и распечатать его detail
имущество.
try {
$response = $client->$call( $params );
} catch (\SoapFault $fault) {
//trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
var_dump($fault->faultcode);
var_dump($fault->faultstring);
var_dump($fault->detail);
die('Errore chiamata webservice UPS');
}
обратитесь к: http://php.net/manual/en/function.is-soap-fault.php
ПРИМЕЧАНИЕ. ИБП выдает эту ошибку за неверные номера отслеживания. Используйте хороший (действительный) номер отслеживания, и это исправило мою проблему.
UPS выдает эту ошибку также для неверного кода ShipFrom/CountryCode или ShipTo/CountryCode в Rates API. Например, Германия не может быть оценена. Это не может быть найдено в документации разработчиков UPS.
Я не знаю нюансов обработки исключений в PHP, но исключения в Soap также являются небольшими ошибками в C#. В отладчике Visual Studio вы можете получить подробную информацию о необработанных исключениях прямо в IDE. Если у вас есть возможность сделать это, ищите исключения "detail"
Элемент XML, так как он будет содержать сообщение веб-службы, сообщающее, что было скрыто в вашем запросе.
Что касается фактического перехвата исключения, то есть старая, но хорошая статья @Jeff Atwood, которая, хотя и написана для (задыхается) VB.NET, может все же дать некоторое представление о том, что делает исключения Soap такими, э... скользкими: Coding Horror | Бросать лучшие исключения SOAP