Php soap ошибка

(PHP 5, PHP 7, PHP 8)

is_soap_faultПроверяет, произошла ли ошибка при вызове SOAP

Описание

is_soap_fault(mixed $object): bool

Если опция exceptions не установлена, то вызов SOAP будет выбрасывать исключение
в случае возникновения ошибки.
Функция is_soap_fault() проверяет, является ли
переданный параметр объектом SoapFault.

Список параметров

object

Объект для проверки.

Возвращаемые значения

Возвращается true в случае возникновения ошибки и false в противном случае.

Примеры

Пример #1 Пример использования функции is_soap_fault()


<?php
$client
= new SoapClient("some.wsdl", array('exceptions' => 0));
$result = $client->SomeFunction();
if (
is_soap_fault($result)) {
trigger_error("Ошибка SOAP: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
}
?>

Пример #2 Стандартный метод SOAP для сообщений об ошибках — это исключения


<?php
try {
$client = new SoapClient("some.wsdl");
$result = $client->SomeFunction(/* ... */);
} catch (
SoapFault $fault) {
trigger_error("Ошибка SOAP: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
}
?>

There are no user contributed notes for this page.

UPDATE July 2018

If you don’t care about getting the SoapFault details and just want to catch any errors coming from the SoapClient you can catch «Throwable» in PHP 7+. The original problem was that SoapClient can «Fatal Error» before it throws a SoapFault so by catching both errors and exceptions with Throwable you will have very simple error handling e.g.

try{
    soap connection...
}catch(Throwable $e){
    echo 'sorry... our service is down';
}

If you need to catch the SoapFault specifically, try the original answer which should allow you to suppress the fatal error that prevents the SoapFault being thrown

Original answer relevant for older PHP versions

SOAP can fatal error calling the native php functions internally which prevents the SoapFaults being thrown so we need to log and suppress those native errors.

First you need to turn on exceptions handling:

try {
    $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl",array(
       'exceptions' => true,
    ));
} catch ( SoapFault $e ) { // Do NOT try and catch "Exception" here
    echo 'sorry... our service is down';
}

AND THEN you also need to silently suppress any «PHP errors» that originate from SOAP using a custom error handler:

set_error_handler('handlePhpErrors');
function handlePhpErrors($errno, $errmsg, $filename, $linenum, $vars) {
    if (stristr($errmsg, "SoapClient::SoapClient")) {
         error_log($errmsg); // silently log error
         return; // skip error handling
    }
}

You will then find it now instead trips a SoapFault exception with the correct message «Soap error: SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘…'» and so you end up back in your catch statement able to handle the error more effectively.

is_soap_fault

(Unknown)

is_soap_faultПроверяет произошла ли ошибка при вызове SOAP

Описание

bool is_soap_fault
( mixed $object
)

Если опция exceptions не установлена, то SOAP будет создано исключение
при ошибке.
Функция is_soap_fault() проверяет, является ли
переданный параметр объектом SoapFault.

Список параметров

object

Объект для проверки.

Возвращаемые значения

Возвращается TRUE при ошибке. В ином случае — FALSE.

Примеры

Пример #1 Пример использования функции is_soap_fault()


<?php
$client 
= new SoapClient("some.wsdl", array('exceptions' => 0));
$result $client->SomeFunction();
if (
is_soap_fault($result)) {
    
trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})"E_USER_ERROR);
}
?>

Пример #2 Стандартный метод SOAP для сообщения об ошибках — это исключения


<?php
try {
    
$client = new SoapClient("some.wsdl");
    
$result $client->SomeFunction(/* ... */);
} catch (
SoapFault $fault) {
    
trigger_error("Ошибка SOAP: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})"E_USER_ERROR);
}
?>

Вернуться к: SOAP Функции

  • #1

Как обработать ошибку при обращении к SOAP?

В PHP при обращении к wsdl если происходит исключение, например неверно указан пароль, то возникает фатальная ошибка Fatal error: SOAP-ERROR: Parsing WSDL.
Как обработать эту ошибку в PHP? Следующий код не позволяет её обработать:

PHP:

 try {
$wsdl = new SoapClient('http://127.0.0.1/ws/moiservis.wsdl',
array('login' => 'user',
'password' => 'parol'));
$dostupna = true;
}catch(Exception $e) {
$dostupna = false;
trigger_error('Ошибка авторизации или внутренняя ошибка сервера. Не удалось связаться с базой.', E_ERROR);
}

  • #2

http://ru2.php.net/manual/en/soapclient.soapclient.php

  • #3

Не помогает. Написал так:

PHP:

 $wsdl = new SoapClient('http://127.0.0.1/ws/moiservis.wsdl',
array('login' => 'user',
'password' => 'parol',
'exceptions'     => false));

Исключение не вызывается.
Предполагаю что причина в том что опция exceptions позволяет обрабатывать исключения при выполнении методов web сервиса, а у меня стоит цель обработать исключение в момент создания объекта. $wsdl = new SoapClient(….). А тут значение опции exceptions не влияет на результат.

Пробовал написать так

PHP:

 $result = new SoapClient('http://127.0.0.1/ws/moiservis.wsdl',
                               array('login'          => 'user',
                                     'password'       => 'parol',
                                     'exceptions'     => 0,
                              ));
if (is_soap_fault($result)) {
      trigger_error("ОШИБКА SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
} else{
    print('Настало счастье.');
    return $result;
}

Тоже не работает

DiMA


  • #4

soap в пхп не работает, напиши руками (парсить — через XMLsimple)

если сервис http://127.0.0.1/ws/moiservis.wsdl от мелкософта, зайди туда бразером, тебе напишут текст запроса

  • #5

Автор оригинала: DiMA
soap в пхп не работает, напиши руками (парсить — через XMLsimple)
если сервис http://127.0.0.1/ws/moiservis.wsdl от мелкософта, зайди туда бразером, тебе напишут текст запроса

soap в пхп работает хорошо. Вот только с установкой соединения беда.

Если не найду решения, то вызов соединения напишу из ajax’а. В этом случае ошибка php выразится в том что яваскрипт получит кривой ответ. Вот тут-то я его и обработаю. Но это на крайний случай.

  • #6

попробуй так
‘trace’ => 1
‘exceptions’ => 1

  • #8

Помогло!!! Спасибо.
Теперь позволяет нормально обработать ошибку и не роняет весь сайт.

Читаем wsdl. Находим нужный запрос.

operation Tracking

<operation name="Tracking">
  <input message="tns:TrackingRequestMessage"/>
  <output message="tns:TrackingResponseMessage"/>
</operation>

Значит запрос Tracking принимает на вход TrackingRequestMessage. Смотрим дальше

message TrackingRequestMessage

<message name="TrackingRequestMessage">
  <part name="parameters" element="tns:Tracking"/>
</message>

Единственное поле parameters с типом Tracking. Ищем этот тип.

element Tracking

<xs:element name="Tracking">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Language" type="xs:string" nillable="true"/>
      <xs:element name="Login" type="xs:string" nillable="true"/>
      <xs:element name="Password" type="xs:string" nillable="true"/>
      <xs:element name="Type" type="xs:string"/>
      <xs:element name="Documents" type="xs:string" nillable="true"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Получаем объект или ассоциативный массив с текстовыми полями Language, Login, Password, Type и Documents, причём все поля кроме Type могут иметь значение null.
Значит запрос должен выглядеть как

$result = $client->Tracking([
    'Language' => ?string,
    'Login' => ?string,
    'Password' => ?string,
    'Type' => string,
    'Documents' => ?string
]);

То же самое можно получить и средствами PHP. После подключения к клиенту получим список методов.

var_dump($client->__getFunctions());
/* ...
[92] => string(47) "TrackingResponse Tracking(Tracking $parameters)"
... */

Значит метод Tracking принимает один параметр с типом Tracking и возвращает ответ типа TrackingResponse.
Запросим типы.
var_dump($client->__getTypes());

Результат запроса

/* ...
[120] => string(103) "struct Tracking {
 string Language;
 string Login;
 string Password;
 string Type;
 string Documents;
}"
[121] => string(51) "struct TrackingResponse {
 ResultTracking return;
}"
[24] => string(81) "struct ResultTracking {
 TrackingInfo Items;
 boolean Error;
 string ErrorInfo;
}"
[28] => string(227) "struct TrackingInfo {
 boolean Error;
 string Type;
 string Number;
 string Info;
 string AgentURL;
 dateTime CreateDate;
 string State;
 dateTime DeliveryDate;
 string DeliveryInfo;
 TrackingEvent History;
 Waybill Waybills;
}"
[27] => string(83) "struct TrackingEvent {
 dateTime EventDate;
 string EventName;
 string EventInfo;
}"
[31] => string(546) "struct Waybill {
 string Type;
 string Number;
 dateTime CreateDate;
 string State;
 dateTime DeliveryDate;
 string Sender;
 string SenderGeography;
 string Recipient;
 string RecipientGeography;
 string RecipientAddress;
 dateTime SendDate;
 string Payer;
 int CargoQty;
 float NetWeight;
 float GrossWeight;
 string ConsolidationNumber;
 string InventoryWaybillNumber;
 string DeliveryMethod;
 float Volume;
 boolean RequirePaymentInCash;
 float PaymentInCash;
 string PaymentInCashCurrency;
 string RecipientOfficial;
 TrackingEvent History;
}"
... */

Единственное отличие от самостоятельного анализа wsdl — не указано, какие поля необязательные, какие можно заполнять null и являются ли какие-то поля массивами.

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Php pdo вывод ошибок
  • Php вызвать 500 ошибку
  • Php pdo mysql ошибка
  • Php вывод ошибок 500

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии