Проверка правильности URL-адреса (из php soap-клиента)

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Я пишу веб-приложение, которое позволит пользователю указывать URL-адрес для SoapClient.Я хотел проверить, что php может подключаться к клиенту, когда пользователь отправляет форму.Я думаю, что мог бы сделать это с помощью try catch или set_error_handler (или какой-либо комбинации этих двух).Однако, похоже, что это невозможно из-за фатальных ошибок.Есть ли способ заставить SoapClent протестировать URL-адрес, который не выдаст неустранимую ошибку?

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://example.com/wibble'

Я хочу, чтобы он помечал ошибку, поскольку URL-адрес не существует, но я хотел бы иметь возможность его перехватить.

В противном случае, я полагаю, я мог бы попытаться загрузить и проверить URL-адрес самостоятельно, но я бы подумал, что это можно было бы сделать из SoapClient.

Должно ли это быть фатальной ошибкой?

Редактировать

После прочтения ответа rogeriopvl я понимаю, что мне следовало сказать, что я попробовал опцию "исключения" в конструкторе soapclient и (в отчаянии) функцию use-soap-error-handler.

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

Решение

Используете ли вы xdebug?Согласно этот отчет об ошибке PHP и его обсуждение, проблема была исправлена, по крайней мере, начиная с PHP 5.1, но эта ошибка xdebug путает "преобразования фатальной ошибки в исключение" таким образом, что исключение не генерируется, а фатальная ошибка "просачивается".

Я могу воспроизвести это локально, с включенным xdebug:

try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

Это выдает мне фатальную ошибку, которую вы описали, даже без ввода предложения catch:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

Это сработает, если я отключу xdebug прямо перед звонком:

xdebug_disable();
try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

Это запускает исключение, как и ожидалось, и я получаю соответствующий объект SoapFault в предложении catch с сообщением:

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

Таким образом, в основном исключения работают так, как рекламируется.Если они не работают в вашем случае, вы можете столкнуться с ошибкой xdebug или, возможно, с аналогичной проблемой с другим сторонним компонентом.

Другие советы

Цитирование Документация SoapClient:

Параметр exceptions - это логическое значение, определяющее, вызывают ли ошибки soap исключения типа SoapFault.

Поэтому вам следует попробовать что-то вроде:

$client = new SoapClient("some.wsdl", array('exceptions' => TRUE));

Этот способ выбросит Ошибка в мыле исключения, позволяющие вам их перехватывать.

Видишь: http://bugs.xdebug.org/view.php?id=249

Возможное решение:

Index: trunk/www/sites/all/libraries/classes/defaqtoSoapClient.class.php
===================================================================
--- classes/defaqtoSoapClient.class.php
+++ classes/defaqtoSoapClient.class.php
@@ -31,10 +31,23 @@

     try {
+        // xdebug and soap exception handling interfere with each other here 
+        // so disable xdebug if it is on - just for this call
+        if (function_exists('xdebug_disable')) {
+            xdebug_disable();
+        }
       //Create the SoapClient instance
       parent::__construct($wsdl, $options);
     }
     catch(Exception $parent_class_construct_exception) {
+        if (function_exists('xdebug_enable')) {
+            xdebug_enable();
+        }
       // Throw an exception an say that the SOAP client initialisation is failed
       throw $parent_class_construct_exception;
+    } 
+    if (function_exists('xdebug_enable')) {
+        xdebug_enable();
     }
   }

вы могли бы попробовать выполнить запрос curl или fsockopen, чтобы проверить правильность URL-адреса.

К вашему сведению, я использую SoapClient с PHPUnit для тестирования удаленных веб-сервисов и столкнулся с той же проблемой!

  • при использовании старой версии PHPUnit (3.3.x) от имени третьей стороны происходит сбой phpunit
  • при использовании текущей версии PHPUnit (3.4.6) от имени третьей стороны phpunit отображает "RuntimeException".

Вот мой первый тестовый метод :

public function testUnavailableURL() {
    $client = new SoapClient("http://wrong.URI");
}

Вот первый результат PHPUnit :

There was 1 error:

1) MyTestCase::testUnavailableURL
RuntimeException: 


FAILURES!

Вот мой второй метод тестирования :

public function testUnavailableURL() {
        try {
          $client = @new SoapClient("http://wrong.URI");
        } catch (SoapFault $fault) {
          print "SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})";
        }
}

Вот результат второго теста PHPUnit :

PHPUnit 3.4.6 by Sebastian Bergmann.

.SOAP Fault: (faultcode: WSDL, faultstring: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://wrong.URI' : failed to load external entity "http://wrong.URI"
)...

Time: 3 seconds, Memory: 4.25Mb

OK

Примечание:я нашел тикет phpunit на эту тему : билет 417

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