Давайте рассмотрим следующий пример клиента 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 не очень точна в этом вопросе ...