Клиент SOAP PHP, который понимает многослойные сообщения?

Сравнение чисел с плавающей точкой для зависит от контекста. Начиная с ровного изменения порядка операций может привести к различным результатам, важно знать, как "равный" Вы хотите, чтобы числа были.

Сравнение чисел с плавающей точкой Bruce Dawson является хорошим местом для запуска при рассмотрении сравнения с плавающей точкой.

следующие определения от искусство программирования Knuth:

bool approximatelyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool essentiallyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool definitelyGreaterThan(float a, float b, float epsilon)
{
    return (a - b) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool definitelyLessThan(float a, float b, float epsilon)
{
    return (b - a) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

, Конечно, выбирая эпсилон зависит от контекста и определяет, как равный Вы хотите, чтобы числа были.

Другой метод сравнения чисел с плавающей точкой должен посмотреть на ULP (единицы в последнем месте) чисел. Не имея дело конкретно со сравнениями, бумага , Что каждый программист должен знать о числах с плавающей точкой , является хорошим ресурсом для понимания, как плавающая точка работает и каковы ловушки, включая то, каков ULP.

14
задан olefevre 14 July 2009 в 15:09
поделиться

2 ответа

Собственный класс PHP SoapClient не поддерживает составные сообщения (и сильно ограничен во всех вопросах WS- *), и я также думаю, что ни написанные PHP библиотеки NuSOAP и Zend_Soap не могут справиться с такого рода сообщениями SOAP.

Я могу придумать два решения:

  • расширить класс SoapClient и перезаписать SoapClient :: __ doRequest () , чтобы получить фактическую строку ответа, которую вы затем можете проанализировать по своему усмотрению.

     класс MySoapClient расширяет SoapClient
    {
     публичная функция __doRequest ($ request, $ location, $ action, $ version, $ one_way = 0)
     {
     $ response = parent :: __ doRequest ($ request, $ location, $ action, $ version, $ one_way);
     // анализируем $ response, извлекаем составные сообщения и т. д.
     }
    }
    

    Это может быть несколько сложно, но стоит попробовать.

  • используйте более сложную клиентскую библиотеку SOAP для PHP. Первое и единственное, что приходит мне в голову, это WSO2 WSF / PHP , который включает SOAP MTOM, WS-Addressing, WS-Security, WS-SecurityPolicy, WS-Secure Conversation и WS-ReliableMessaging за счет необходимо установить собственное расширение PHP.

13
ответ дан 1 December 2019 в 12:39
поделиться

Использование второй идеи С. Герига здесь отлично сработало.

В большинстве случаев у вас есть только одно сообщение, упакованное в сообщение MIME MultiPart. В этих случаях возникает исключение « SoapFault: [Client] похоже, что у нас нет XML-документа ». Здесь подойдет следующий класс:

class MySoapClient extends SoapClient
{
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        // strip away everything but the xml.
        $response = preg_replace('#^.*(<\?xml.*>)[^>]*$#s', '$1', $response);
        return $response;
    }
}
3
ответ дан 1 December 2019 в 12:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: