Como posso lidar com várias Falhas SOAP durante php Sabão solicitação do Cliente?
-
12-12-2019 - |
Pergunta
Eu estou interessado em fazer um sabão de chamada através do php soapClient para um serviço da web para obter o nível de água a partir de uma estação de monitoramento.Eu quero lidar com dois soapfaults que ocorreram durante a execução.O primeiro defeito é o seguinte :
SoapFault exception: [soapenv:Server.userException] java.rmi.RemoteException: We are sorry, but no data is available from this station at this time in C:\xampp\htdocs\NOAA\LogWriter.php:214 Stack trace: #0 C:\xampp\htdocs\NOAA\LogWriter.php(214): SoapClient->__soapCall('getWaterLevelRa...', Array, Array) #1 C:\xampp\htdocs\NOAA\LogWriter.php(188): getLevel('8531680', '20120726 15:19') #2 {main}
Este erro é esperado ocorrer várias vezes durante o script se os dados de um determinado período de tempo não está disponível.Eu preciso pegar essa falha, a fim de dizer o script para tentar novamente com um novo tempo.Eu usei um bloco catch para fazê-lo.
Eu também preciso pegar uma segunda falha que ocorre se o webservice não é carregar o arquivo wsdl ou o servidor é timedout.Para testar esta tiver dei o meu script de um faultly local para gerar o mesmo erro que eu havia recebido, anteriormente, e é como segue:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://opendap.co-ops.nos.noaa.gov/axis/services/WaterLevelRawOneMin?wsdl' : Extra content at the end of the document in C:\xampp\htdocs\NOAA\LogWriter.php:210 Stack trace: #0 C:\xampp\htdocs\NOAA\LogWriter.php(210): SoapClient->SoapClient('http://opendap....', Array) #1 C:\xampp\htdocs\NOAA\LogWriter.php(171): getLevel('8531680', '20120726 12:35') #2 {main} thrown in C:\xampp\htdocs\NOAA\LogWriter.php on line 210
O segundo erro permanece não identificada e termina o meu script.No entanto eu preciso pegá-lo e exibir uma mensagem.
Eu ter postado a minha função em php que faz o sabão chamada abaixo.
Alguém poderia me dar alguma idéia de como fazer isso?
function getLevel($id, $date) {
$client = new SoapClient("http://opendap.co-ops.nos.noaa.gov/axis/services/WaterLevelRawOneMin?wsdl", array('trace' => false));
$Parameters = array("stationId" => $id, "beginDate" => $date, "endDate" => $date, "datum" => "MLLW",
"unit" => 1, "timeZone" => 1);
try {
return $client->__soapCall(
"getWaterLevelRawOneMin", array('Parameters' => $Parameters),
array('location' => "http://opendap.co-ops.nos.noaa.gov/axis/services/WaterLevelRawOneMin")
);
} catch (SoapFault $e) {
if (
$e->faultcode == "soapenv:Server.userException"
and $e->faultstring == "java.rmi.RemoteException: We are sorry, but no data is available from this station at this time"
) {
return "FAULT";
} else {
echo "Could not connect to the server";
}
} // end of catch blocK
}// end of function
Solução
Exceção quanto quebrado WSDL pode ocorrer somente quando você chamar SoapClient::construtor de modo a
try {
$client= new SoapClient($wsdlUrl ,array('trace'=>false));
}catch(Exception $e) {
// your loging regarding this case
}
SoapFault exceção pode ocorrer quando você faz um webservice todos assim:
try {
$client= new SoapClient($wsdlUrl ,array('trace'=>false));
try {
return $client->_call('....');
} catch (SoapFault $sp) {
//your logic rearding soap fault
}
}catch(Exception $e) {
// your loging regarding this case
}
return false;