2014-09-29 3 views
0

Я плохо застреваю в создании клиента для использования этого WSDL. (Я новичок, когда дело доходит до потребления WebServices в PHP.) (По соображениям конфиденциальности я должен был создать реплику XML. Я надеюсь, вы понимаете.)Проблема с вызовом SOAP SOAP с использованием класса SoapClient

http://brique.in/wsdl.xml

Я использую следующий код для печати из функций и типов:

$client = new SoapClient("http://brique.in/wsdl.xml"); 
var_dump($client->__getFunctions()); 
var_dump($client->__getTypes()); 

Я пытаюсь написать код PHP для вызова метода inwardProcess. Он принимает в качестве входного файла XML-файл. Я попробовал следующее:

$xmlInput = htmlentities('<XML><Refno>H9999999</Refno><Type>getDetails</Type><UserID>BO</UserID></XML>'); 
$result = $client->__soapCall("inwardProcess", array($xmlInput)); 

Это не сработало. Посмотрев на спецификации WSDL, я также попробовал,

$xmlInput = htmlentities('<XML><Refno>H9999999</Refno><Type>getDetails</Type><UserID>BO</UserID></XML>'); 
class inwardProcess { 
    function inwardProcess($xmlInput) 
    { 
     $this->xmlInput = $xmlInput; 
    } 
} 
$inwardProcess = new inwardProcess($xmlInput); 
$webservice = new SoapClient($url, $soap_options); 
echo "Attempting Inward<br/>"; 
try { 
    var_dump($webservice->__getTypes()); 
    //I also tried passing just $inwardProcess Object in place of array($inwardProcess) 
    $result = $webservice->__soapCall("inwardProcess", array($inwardProcess)); 
    var_dump($result); 
} catch (SOAPFault $f) { 
    echo "SOAPFault".$f; 
} 

Я получаю ошибку

Server was unable to process request. ---> Object reference not set to an instance of an object 

Как-то я не в состоянии работать его. Любая помощь будет высоко оценена, так как я нахожусь в крайнем сроке.

+0

Вы должны вызвать следующие функции на вашем $ client для вывода полного запроса/ответа и взглянуть на него, чтобы увидеть, что-то кажется неправильным: __getLastRequest, __getLastRequestHeaders, __getLastResponse и, наконец, __getLastResponseHeaders. У вас есть доступ к удаленному серверу? Если это так, вы можете взглянуть на файл журнала Apache, чтобы узнать, появляется ли какая-либо ошибка. – NaeiKinDus

ответ

0

Когда структуры являются сложными, как:

<s:element name="inwardProcess"> 
    <s:complexType> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="xmlInput"> 
       <s:complexType mixed="true"> 
        <s:sequence> 
         <s:any/> 
        </s:sequence> 
       </s:complexType> 
      </s:element> 
     </s:sequence> 
    </s:complexType> 
</s:element> 

и ответ, как

<s:element name="inwardProcessResponse"> 
    <s:complexType> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="inwardProcessResult"> 
       <s:complexType mixed="true"> 
        <s:sequence> 
         <s:any/> 
        </s:sequence> 
       </s:complexType> 
      </s:element> 
     </s:sequence> 
    </s:complexType> 
</s:element> 

Вы должны создать класс для каждой структуры. В этом случае было бы:

class xmlInput 
{ 
    public $any = null; 
    public function __construct($any) 
    { 
     $this->any = $any; 
    } 
} 

class inwardProcess 
{ 
    public $xmlInput = null; 
    public function __construct($xmlInput) 
    { 
     $this->xmlInput = $xmlInput; 
    } 
} 
class inwardProcessResponse 
{ 
    public $inwardProcessResult = null; 
    public function __construct($inwardProcessResult) 
    { 
     $this->inwardProcessResult = $inwardProcessResult; 
    } 
} 

и, наконец, позвонить ...

$xmlInput = new xmlInput('<XML><Refno>H9999999</Refno><Type>getDetails</Type><UserID>BO</UserID></XML>'); 
$inwardProcess = new inwardProcess($xmlInput); 
$soap_options = array(
    'trace'  => 1,  // traces let us look at the actual SOAP messages later 
    'exceptions' => 1); 
$url = "<WSDL URL>"; 
$client = new SoapClient($url, $soap_options); 
try { 
    $result = $client->__soapCall("inwardProcess", array($inwardProcess)); 
    echo htmlentities($result->inwardProcessResult->any); 
} catch (SOAPFault $f) { 
    echo "-1"; 
} 

Сработало!