веб-сервисы — проблема вызова PHP SOAP с использованием класса SoapClient

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

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

Решение

Когда структуры такие сложные, как:

<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";
}

Работал!

0

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

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

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