Как отправить сложные типы из PHP SoapClient на сервер ASP.NET SOAP?

Здравствуйте, у меня проблемы с отправкой массивов, структур и массивов структур из 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, но не работал.

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

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


person Community    schedule 12.04.2010    source источник
comment
Случайно заминусовали - как это отменить?   -  person Ben    schedule 06.12.2011


Ответы (1)


У меня была аналогичная ситуация с клиентом PHP Soap, который общался с сервером .NET Soap, используя 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 с этого сервера.

person Gabe    schedule 19.04.2010
comment
спасибо, я обнаружил, что передача ассоциативного массива или вложенных массивов с примитивными переменными php работает нормально. Ваше решение тоже сработало;) - person ; 19.04.2010