Как мне решить это исключение SOAP «Unmarshalling Error»

Я работаю над проектом, в котором я использую API-интерфейс SOAP сторонних приложений (BMC FootPrints Service Core). Я могу делать вызовы API с помощью PHP, мои учетные данные в порядке, и в одном конкретном методе API я делаю то, что выглядит как действительный вызов функции API, но получаю следующее исключение / ошибку:

SoapFault exception: [soap:Client] Unmarshalling Error: cvc-complex-type.2.4.b: The content of element 'ns1:runSearch' is not complete. One of '{runSearchRequest}' is expected

что в точности означает «одна из частей {runSearchRequest}»? Я не понимаю, что еще мне нужно включить в запрос, который я делаю к API.

Документацию по API можно найти здесь, и, в частности, страница 31 относится к методу API, который я пытаюсь использовать, документирован здесь на этом снимке экрана: изображение из PDF.

Я не буду публиковать ВСЕ код, но только часть, где я пытаюсь метод API:

// array that will be used in the method call...
$searchFor = array(
"_searchId"=>"11",
);

try {
$response = $soapClient->__soapCall("runSearch", $searchFor);
print_r($response);
} catch (SoapFault $exception) {
echo $exception;
}

Я протестировал вызов метода с помощью приложения SOAPUI и смог увидеть результаты / ответ в порядке.

обновление: добавление WSDL xml (фрагменты) …

Я использую WSDL, но он размещен в нашей внутренней / локальной сети и не предоставляется извне, вот начало XML и тип runSearch из этого WSDL:

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://externalapi.business.footprints.numarasoftware.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="ExternalApiService" targetNamespace="http://externalapi.business.footprints.numarasoftware.com/">
<wsdl:types>
<schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xxxxxxxxxxxxxxxxxxxx.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://www.w3.org/2001/XMLSchema">

<import namespace="xxxxxxxxxxxxxxxxxxxxxxxx" schemaLocation="http://xxxxxxxxxxxxxxxxxxxxxxxx:PORT/footprints/servicedesk/externalapisoap/ExternalApiServicePort?xsd=externalapiservices_schema.xsd"/>

</schema>
</wsdl:types>

<wsdl:message name="runSearch">
<wsdl:part element="tns:runSearch" name="parameters">
</wsdl:part>
</wsdl:message>

1

Решение

Ошибка указывает на то, что ваш runSearchReqeust структура (то есть ваша $searchFor) отсутствует информация. В предоставленной вами документации указано, что подпись runSearch() вызов будет выглядеть так:

runSearchResponse runSearch(runSearch $runSearch)

Кроме того, runSearch тип данных будет содержать одно поле типа RunSearchRequest,

Таким образом, вам нужна структура данных, которая содержит элемент 'runSearchRequest' которая сама по себе является еще одной структурой данных, которая содержит _searchId

Пытаться:

$searchFor = array(
'runSearchRequest' => array(
"_searchId" => "11",
)
);

И измените свой звонок на:

$response = $soapClient->runSearch($searchFor);

Или в качестве альтернативы:

$response = $soapClient->__soapCall("runSearch", array($searchFor));

Это создаст XML-запрос SOAP, который точно совпадает с запросом из документа:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:ns1="http://externalapi.business.footprints.numarasoftware.com/">
<SOAP-ENV:Body>
<ns1:runSearch>
<runSearchRequest>
<_searchId>11</_searchId>
</runSearchRequest>
</ns1:runSearch>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]