ответ soapserver'а при complextype

Дед Анвирыч

Новичок
ответ soapserver'а при complextype

В wsdl ответ описан как complextype:

<complexType name="res">
<all>
<element name="role" type="xsd:string"/>
<element name="name" type="xsd:string"/>
</all>
</complexType>

При ответе простой сторокой - все ясно. А при таком описании - что делать? Класс, массив?
 

Qasimodo

Новичок
Класс или ассоциативный массив.
для PEAR:SOAP_Client ручки управления -
$GLOBALS['SOAP_OBJECT_STRUCT']
_auto_translation()
__set_type_translation()
 

Дед Анвирыч

Новичок
Нет, именно для сервера. Как в в вызываемой функции на стороне сервера ответить комплекстипом?
 

Qasimodo

Новичок
PHP:
$ret["role"]=$role; // или $ret->role = $role;
$ret["name"]=$name; // соответственно $ret->name=$name;
return $ret;
 

Дед Анвирыч

Новичок
Огромное спасибо

-~{}~ 02.08.04 12:27:

Да, еще... Как в wsdl описать и соответсвенно как вернуть сервером xml дерево?
 

Qasimodo

Новичок
Автор оригинала: Дед Анвирыч

Да, еще... Как в wsdl описать и соответсвенно как вернуть сервером xml дерево?
Не понял.
как (автоматически) сгенерировать WSDL ?
 

Дед Анвирыч

Новичок
Автоматически сгенерировать wsdl как я понял не получится (если не так - поправте ;) )

Я имел ввиду - как в качестве аргумента передать (вернуть) не простой тип - а кусок xml дерева. Как это описать в wsdl?
 

Qasimodo

Новичок
Автор оригинала: Дед Анвирыч
Автоматически сгенерировать wsdl как я понял не получится (если не так - поправте ;) )
Поищи в PEAR:SOAP на предмет DISCO

Я имел ввиду - как в качестве аргумента передать (вернуть) не простой тип - а кусок xml дерева. Как это описать в wsdl?
Что есть "кусок XML дерева" ?
string : "<node>value</node>" ? - тогда это простой тип .
domelement - никак
Сложный тип - $soap->Call("method",$record)
 

Дед Анвирыч

Новичок
<node>value</node> - строка
а если появляются аттрибуты - придется слешить
<node name="lala">value</node> -> <node name=\"lala\">value</node>

Без этого значит никак?
 

Qasimodo

Новичок
Автор оригинала: Дед Анвирыч
<node>value</node> - строка
а если появляются аттрибуты - придется слешить
<node name="lala">value</node> -> <node name=\"lala\">value</node>

Без этого значит никак?
??!
PHP:
$blamba = "<node name='lala'>value</node>";
$blamba2 ='<node name="lala">value</node>';
$blamba3 =<<<ZZ
<node name="lala">node's value</node>
ZZ;
 

Qasimodo

Новичок
А тв попробуй (с) реклама
PHP:
$l_result = $soapclient->echoString('<node name="blamba">blamba</node>');
формирует вполне приличный xml
<imp:echoString>
<str xsi:type="xsd:string">&lt;node name=&quot;blamba&quot;&gt;blamba&lt;/node&gt;</str></imp:echoString>

;comment
бровсер &amp;quot; отобразит как "
 

S.Andrew

Guest
Я пытаюсь соединить SOAP сервер на ПХП и SOAP клиент на js (используется webservices.htc от microsoft http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/behaviors/library/webservice/default.asp).

Для описания сервера используется следующий wsdl
-------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:ns="http://chess/" targetNamespace="http://chess/">
<types>
<xsd:schema targetNamespace="http://chess/" elementFormDefault="qualified">
<xsd:element name="registerResponceType">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="code" type="xsd:int"/>
<xsd:element minOccurs="1" maxOccurs="1" name="text" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="registerRequestType">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="login" type="xsd:string"/>
<xsd:element minOccurs="1" maxOccurs="1" name="password" type="xsd:string"/>
<xsd:element minOccurs="1" maxOccurs="1" name="email" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</types>
<message name="RegisterRequest">
<part name="param" element="ns:registerRequestType"/>
</message>
<message name="RegisterResponse">
<part name="param" element="ns:registerResponceType"/>
</message>
<portType name="ChessPortType">
<operation name="register">
<input message="ns:RegisterRequest"/>
<output message="ns:RegisterResponse"/>
</operation>
</portType>
<binding name="ChessBinding" type="ns:ChessPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="register">
<soap:eek:peration soapAction="http://chess/register" style="document"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="ChessService">
<port name="ChessPort" binding="ns:ChessBinding">
<soap:address location="http://chess/chess.php"/>
</port>
</service>
</definitions>

-------------------------------------------------------------
Как видно из схемы структура входных и выходных данных для функции register одинаковы. Клиент на js формирует следующий запрос:
-------------------------------------------------------------

<?xml version='1.0' encoding='utf-8'?>
<SOAP-ENV:Envelope xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns="http://chess/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<registerRequestType xmlns="http://chess/">
<login xsi:type="xsd:string">Andrew</login>
<password xsi:type="xsd:string">12345</password>
<email xsi:type="xsd:string">[email protected]</email>
</registerRequestType>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

-------------------------------------------------------------
а фукнция на PHP сервере
-------------------------------------------------------------
PHP:
	function register($login, $password, $email){
		$arr = new arrayQry (DATA_PATH, "users.dat");
		$id = $arr->NextVal("users");
		if ($arr->Insert(array($id, $login, $password, $email)))
			return array("code" => "200", "text" => "OK");
		else
			return array("code" => "400", "text" => "Error");
	}
-------------------------------------------------------------
возвращает следующий ответ
-------------------------------------------------------------

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://chess/">
<SOAP-ENV:Body>
<ns1:registerResponceType>
<ns1:code>200</ns1:code>
<ns1:text>OK</ns1:text>
</ns1:registerResponceType>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

-------------------------------------------------------------

как видно структура немного отличается (хотя схемы практически идентичны), причем запрос больше соответствует схеме чем ответ.

Так вот проблемма в том, что при таком ответе js клиент отказывается его парсить.

Мне кажется что ошибка именно при ответе SOAP сервера, т.к. я нашел сервис от ЦентроБанка с такойже точно схемой (http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx). Так вот сервер ЦентроБанка возвращает ответ такого же вида как и js клиент отправляет запрос при такого вида схеме.

Если кто сталкивался с этой проблеммой напишите. PHP у меня RC3
 
Сверху