Я пытаюсь соединить 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">
<soapperation 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