Почему __soapCall выбрасывает «Запрещено», а __doRequest успешно? - PullRequest
1 голос
/ 02 июля 2019

Давайте рассмотрим следующий пример клиента SOAP ниже.Он в основном расширяет собственный PHP (обратите внимание, что мы находимся в режиме wsdl):

use SoapClient;
use SoapFault;

abstract class AbstractClient extends SoapClient
{
    abstract protected function getHeaders(): array;

    private function call(string $functionName, array $arguments)
    {
        $this->__setSoapHeaders(
            $this->getHeaders()
        );

        try {
            return $this->__soapCall($functionName, [$arguments]);
        } catch (SoapFault $soapFault) {
            // ... 
        }
    }

    public function sendRequest(string $functionName, array $arguments)
    {
        return $this->call($functionName, $arguments);
    }
}

Запрос сервера SOAP с использованием __soapCall продолжает выдавать SoapFault:

faultstring: Forbidden
faultcode: HTTP

Я пытался с различными конфигурациями, изменением кэша, версии SOAP, контекста потока SSL и т. Д., Но все же безрезультатно.

Теперь представьте, что запрашиваете ту же конечную точку с __doRequest, передавая сгенерированный запрос XMLс предыдущей реализацией (XML был дампом из $this->__getLastRequest() в части catch), затем он работает, и мы получаем ожидаемый ответ от сервера.

Оттуда я переопределил __doRequest в клиенте (__doRequest вызывается PHP на более низком уровне для выполнения __soapCall), чтобы увидеть, в чем заключаются различия:

public function __doRequest($request, $location, $action, $version, $one_way = 0)
{
    // Output $request, $location, $action, $version and $one_way

    parent::__doRequest($request, $location, $action, $version, $one_way);
}

Оказывается, единственное, что является недостатком параметра $action, который былпустой.Поэтому я жестко запрограммировал его, но опять же безрезультатно: снова было сгенерировано исключение Forbidden.

Кто-нибудь знает, что здесь происходит?

EDIT

После многих других тестов я могу сказать, что форматирование XML-запроса (не в одну строку, а в его «симпатичную» версию) действительно работает.Возможно, мне не хватает какой-либо конфигурации кодирования / форматирования, к сожалению, документация PHP не очень точна в этом вопросе ...

1 Ответ

0 голосов
/ 02 июля 2019

Я наконец-то нашел грязное решение.Переопределение __doRequest и форматирование запроса с помощью DOMDocument делают свое дело:

public function __doRequest($request, $location, $action, $version, $one_way = 0)
{
    $xml = new DOMDocument();
    $xml->preserveWhiteSpace = false;
    $xml->formatOutput = true;
    $xml->loadXML($request);
    $request = $xml->saveXML();

    return parent::__doRequest($request, $location, $action, $version, $one_way);
}

Кто-нибудь знает, как настроить расширение PHP SOAP для достижения этого должным образом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...