如何解决此SOAP异常'Unmarshalling Error'

时间:2017-01-15 01:13:43

标签: php api soap soap-client

我正在开发一个项目,我正在使用内部托管的第三方应用程序的SOAP API(BMC FootPrints服务核心)。我可以使用PHP调用API,我的凭据很好,并且在一个特定的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方法,请参见此屏幕截图:image from 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 applcation测试了方法调用,我能够看到结果/响应很好。

更新:添加WSDL xml(片段)...

我正在使用WSDL,但是它托管在我们的内部/本地网络上而不是外部公开,这里是XML的开始和来自该WSDL的runSearch类型:

<?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>

2 个答案:

答案 0 :(得分: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));

这将生成一个SOAP XML请求,该请求与doc:

中的请求非常匹配
<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 :(得分:0)

编组错误可能由于两个原因而发生:

  • Exception: Unmarshalling Error: null:如果键后有空格
  • Exception: Unmarshalling Error: For input string: "233,43":因为金额必须为233.43