2017-01-15 64 views
1

我工作的地方我使用的是內部託管第三方應用程序的SOAP API(BMC FootPrints產品服務的核心)的項目。我可以用PHP調用API,我的憑證沒有問題,並且在一個特定的API方法中,我正在對API函數進行有效調用,但得到以下異常/錯誤:如何解決這個SOAP異常「解組錯誤」

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的開始和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)); 

這將產生一個接近從文檔的一個SOAP XML請求:

<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> 
+0

謝謝@KrisPeeling - 我只是固定的問題,我在我原來的職位更新的代碼。我仍然得到相同的結果/異常消息,就好像結構中缺少某些東西一樣。 – tamak

+0

感謝您更改問題。我已經更新了我的答案,希望能幫助你解決錯誤。 –

+0

謝謝,我嘗試後得到的是「SoapFault異常:[客戶端] SOAP-ERROR:編碼:對象沒有'runSearchRequest'屬性」 – tamak