rudiwork
Новичок
Привет, вопрос по теме SOAP.
Soap установлен как модуль Apache.
Стоит задача, вернуть c сервера данные в виде массива объектов типа stdClass.
Ниже приведу код WSDL файла и код сервера...
Если возвращаю обычный массив, то мой клиент на сервере все прекрасно понимает... а клиент на платформе 1С завершается неудачей при чтении возвращаемых данных.
Покумекав я решил, раз сервер при запросе от 1С получает массив объектов, то и возвращать нужно так же массив объектов.
Но не получается организовать возвращение многомерного массива объектов
Подскажите как описать WSDL файл?
Файл WSDL
Сервер
Soap установлен как модуль Apache.
Стоит задача, вернуть c сервера данные в виде массива объектов типа stdClass.
Ниже приведу код WSDL файла и код сервера...
Если возвращаю обычный массив, то мой клиент на сервере все прекрасно понимает... а клиент на платформе 1С завершается неудачей при чтении возвращаемых данных.
Покумекав я решил, раз сервер при запросе от 1С получает массив объектов, то и возвращать нужно так же массив объектов.
Но не получается организовать возвращение многомерного массива объектов
Подскажите как описать WSDL файл?
Файл WSDL
PHP:
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:europarts" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:europarts">
<types>
<xsd:schema targetNamespace="urn:europarts">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/>
<xsd:complexType name="ItemPart">
<xsd:sequence>
<xsd:element name="number" type="xsd:string"/>
<xsd:element name="priority" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ArrayOfItemPart">
<xsd:sequence>
<xsd:element name="password" type="xsd:string"/>
<xsd:element name="parts" type="tns:ItemPart" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ItemPartPrice">
<xsd:sequence>
<xsd:element name="number" type="xsd:string"/>
<xsd:element name="priority" type="xsd:int"/>
<xsd:element name="price" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ArrayOfItemPartPrice">
<xsd:sequence>
<xsd:element name="result" type="tns:ItemPartPrice" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>
<message name="getArrayPriceRequest">
<part name="array" type="tns:ArrayOfItemPart"/>
</message>
<message name="getArrayPriceResponse">
<part name="array" type="tns:ArrayOfItemPartPrice"/>
</message>
<portType name="europartsPortType">
<operation name="getArrayPrice">
<documentation>get array price</documentation>
<input message="tns:getArrayPriceRequest"/>
<output message="tns:getArrayPriceResponse"/>
</operation>
</portType>
<binding name="europartsBinding" type="tns:europartsPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getArrayPrice">
<soap:operation soapAction="urn:europarts#getArrayPrice" style="rpc"/>
<input>
<soap:body use="encoded" namespace="urn:europarts" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:europarts" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="europarts">
<port name="europartsPort" binding="tns:europartsBinding">
<soap:address location="http://europarts.pro/webservicePrice/server.php"/>
</port>
</service>
</definitions>
PHP:
<?php
class PriceService {
function getArrayPrice($parts) {
//преобразуем объект в массив
$array = $this->objectToArray($parts);
$result = array();
foreach($array['parts'] as $v) {
$tmp = array();
$tmp['number'] = $v['number'];
$tmp['priority'] = $v['priority'];
$tmp['price'] = $this->getPartPrice($v['number'], $v['priority']);
$result['result'][] = $tmp;
}
//Преобразуем массив в объект
$objArray = object;
$objArray = $this->arrayToObject($result);
return $objArray;
}
//------------------------------------------------------------------
//Запрос авторизации
function auth($pass){
$r = mysql_qw("SELECT `password` FROM `modx_web_users` WHERE id=?", $pass);
$row = mysql_fetch_assoc($r);
if(md5($pass) !== $row['password'])
return false;
return true;
}
//------------------------------------------------------------------
//Полцчить цену на товар
function getPartPrice($number, $priority) {
$r = mysql_qw("SELECT `price` FROM `modx_catalog` WHERE `number`=? AND `priority`=?", $number, $priority);
if(mysql_num_rows($r) < 1) return 0;
$row = mysql_fetch_assoc($r);
return (float)$row['price'];
}
//------------------------------------------------------------------
/**
* Преобразование объекта в массив
* @param object $object преобразуемый объект
* @reeturn array
*/
function objectToArray($object) {
if(!is_object($object) && !is_array($object))
return $object;
if(is_object($object))
$object = get_object_vars($object);
return array_map(array($this, 'objectToArray'), $object );
}
//------------------------------------------------------------------
/**
* Преобразование массива в объект
* @param array $array преобразуемый массив
* @reeturn object
*/
function arrayToObject($array = array()) {
if (!empty($array)) {
$data = false;
foreach ($array as $akey => $aval) {
//$data -> {$akey} = $aval;
$data ->{$akey} = is_array($aval) ? $this->arrayToObject($aval) : $aval;
}
return $data;
}
return false;
}
//------------------------------------------------------------------
}
ini_set("soap.wsdl_cache_enabled", "0"); // отключаем кэширование WSDL
$server = new SoapServer("price.wsdl");
$server->setClass("PriceService");
$server->handle();
?>