Как я могу обрабатывать несколько неисправностей SOAP во время запроса клиента PHP SOAP?

StackOverflow https://stackoverflow.com//questions/11679432

Вопрос

Я заинтересован в том, чтобы сделать мыльный вызов через SOAPClient PHP к веб-сервису, чтобы получить уровень воды с станции мониторинга. Я хочу обрабатывать два мыльных, которые произошли во время выполнения. Первая ошибка заключается в следующем:

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}
. Ожидается, что эта ошибка будет продолжаться несколько раз во время сценария, если данные в течение определенного времени недоступны. Мне нужно поймать эту ошибку, чтобы сообщить сценарию, чтобы снова попробовать с новым временем. Я использовал блок Catch для этого.

Мне также нужно ловить вторую неисправность, которая возникает, если WebService не загружается, файл WSDL или сервер TimEdout. Чтобы проверить для этого, дал мой скрипт небое место для создания той же ошибки, которую я получил ранее, и это выглядит следующим образом:

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  
.

Вторая ошибка остается беспрепятственной и завершает мой скрипт. Однако мне нужно поймать его и отобразить сообщение.

Я опубликовал свою функцию PHP, которая делает SOAP CALL ниже.

Может ли кто-нибудь дать мне любые идеи о том, как это сделать?

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
.

Это было полезно?

Решение

Исключение, касающееся сломанного WSDL, может происходить только при вызове SoapClient :: Constructor так

try {
    $client= new SoapClient($wsdlUrl ,array('trace'=>false));
}catch(Exception $e) {
    // your loging regarding this case 
}
.

Исключение SOAPFAULT может возникнуть, когда вы делаете WebService все так:

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;
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top