Как отправить сложные типы из PHP SoapClient на сервер ASP.NET SOAP? - PullRequest
1 голос
/ 12 апреля 2010

Здравствуйте, у меня проблемы с отправкой массивов, структур и массивов структур из PHP на сервер ASP.NET SOAP ...

У кого-нибудь есть решение для этого? Я гуглил в течение нескольких дней, и любое решение работало на меня. Возможно, я что-то забыл ...

Есть примеры моего кода:

$client = new SoapClient($options);

$pCriteria = new stdClass();
$pCriteria->type=1;
$pCriteria->capacity=4;

//Test 1 (fail):
$resp = $client->GetRooms(array("pCriteria"=>$pCriteria));

//Test 2 (fail):
$resp = $client->GetRooms(array("pCriteria"=>new SoapVar($pCriteria, SOAP_ENC_OBJECT, "TCriteria", "http://www.w3.org/2001/XMLSchema")));

print_r($resp);

Я не знаю, как кодировать функции, которые требуют массив TCriteria (TCriteria [], тип TCriteria_Array) либо ... я пытался отправить необработанный массив, SoapVar с кодировкой SOAP_ENC_ARRAY и тип TCriteria_Array, ... но это не работает (сервер SOAP становится недоступным и требует перезапуска).

Я пытался создавать классы и для сложных типов вместо stdClass, но не работал.

Я не знаю, в чем проблема. Администраторы сервера не могут мне помочь, и я не нашел решения по интернету. Я немного отчаялся, хе-хе.

Можете ли вы помочь мне, пожалуйста? Можете ли вы предоставить примеры кода с тремя случаями (массив простых данных, массив struct и struct)? Спасибо!

1 Ответ

6 голосов
/ 19 апреля 2010

У меня была похожая ситуация с PHP Soap Client, который общался с .NET Soap Server с использованием WSDL 2.0. Вот одна вещь, которую я обнаружил: при передаче информации на сервер вы должны явно определить переменную как объект SoapVar. Поэтому в приведенном выше примере измените его на:

$pCriteria->type = new SoapVar(1, XSD_INT, 'xsd:int');

Передача массива аналогична, в сущности, вы передаете массив SoapVars:

$pCriteria->type = array(new SoapVar(1, XSD_INT, 'xsd:int'), new SoapVar(2, XSD_INT, 'xsd:int', new SoapVar(3, XSD_INT, 'xsd:int'));`enter code here`

Кроме того, вы можете использовать несколько встроенных функций SoapClient для получения дополнительной информации о возможных ошибках.

$client->__getLastRequest() //To display the XML that you sent to the server
$client->__getLastResponse() //to display the XML that is sent in response to your request

Если вы можете получить копию ожидаемого формата WSDL, вы можете использовать ответ от вышеуказанных команд, чтобы определить, что происходит не так. Обычно вы можете получить доступ к этому с URL-адреса, который вы передаете SoapClient. Так, например, если URL-адрес служб WSDL равен http://example.com/webservices/wvrgroupservice.asmx?WSDL,, введите http://example.com/webservices/wvrgroupservice.asmx, чтобы просмотреть функции и ожидаемый XML с этого сервера.

...