Мне надо связать SilverLigth и MySQL. Для начала я написал простенький SOAP сервис на PHP, используя библиотеку NuSOAP (исключительно для теста выдрал из мануала): PHP: <?php // Подключаем код NuSOAP require_once('nusoap.php'); // Создаем экщемпляр сервиса $server = new soap_server(); // Инициализируем поддержку WSDL $server->configureWSDL('hellowsdl2', 'urn:hellowsdl2'); // Устанавливаем пространство имен с префиксом tns для WSDL-схемы $server->wsdl->schemaTargetNamespace = 'urn:hellowsdl'; // Регистрируем предоставляемый метод $server->register('hello', // название метода array('person'=>"xsd:string"), // входные параметры array('return'=>"xsd:string"), // выходные параметры 'urn:hellowsdl2', // пространство имен 'urn:hellowsdl2#hello', // soapaction 'rpc', // стиль 'literal', // использование 'Greet a person entering the sweepstakes' // документация ); // Определяем метод как функцию PHP function hello($person) { return "Good"; } // Используем HTTP-запрос чтобы вызвать сервис $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; $server->service($HTTP_RAW_POST_DATA); ?> Идёт запрос от клиента SilverLight: HTML: <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><ProcessSimpleType xmlns="http://sanity-free.org/services"><name xmlns="">Serg</name></ProcessSimpleType></s:Body></s:Envelope> Приходит ответ от сервиса: HTML: <?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 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/"> <SOAP-ENV:Body><SOAP-ENV:Fault><faultcode xsi:type="xsd:string">SOAP-ENV:Server</faultcode><faultactor xsi:type="xsd:string"></faultactor><faultstring xsi:type="xsd:string">unable to serialize result</faultstring><detail xsi:type="xsd:string"></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope> Как устранит ошибку unable to serialize result ? Если есть более простые варианты для написания SOAP сервиса, то буду не против от ссылки на хороший мануал, желательно на русском, но и буржуйский сойдёт.
1. А есть люда, которые удачно из C# вызывали методы классов, написанных в стиле zend? 2. У меня есть zend studio 7, но там в экспорте нету варианта сгенерить WSDL файл из PHP класса, хотя в 6.2 было. Может генерить WSDL с помощью NuSOAP или могут возникнуть проблемы? 3. Вот phpinfo сервера - не будет ли у меня проблем с zend server? ПС: можно самый маленький веб-сервис, чтобы потестить возможности адекватной работы хостера? А то раньше пробовал примеры приведённые на сайте zend по автообноружению сервисов = автогенерации WSDL, но ничего толкового не получилось - VS даже не находила WSDL, не говоря уже про нахождение методов в нём. Если нету времени, то можете пропустить эту просьбу, т.к. не критично, но может сэкономить время в поиске ошибок, ведь если у человека работает тот или иной пример, то он должен работать и у меня.
Если внимательно прочтете ссылку на документацию, то увидите там класс, который позволяет сгенерировать WSDL по написанному вами сервису и сохранить результат в файл. Zend Server как бы тут не причем. Что касается SOAP то работать должен, поскольку соответствующее расширение имеется.
1. Ну я был написал, что пробовал по их классу WSDL сгенерировать, но как-то не ахти получилось. 2. Если открыть потом файл .php, то должно ли появится что-то похожее на это с описаниями всех методов(чтобы узнать, что нигде нету ошибок)? 3. Если вас не затруднит, то можно сорс какого-нибудь примера уже полного и 100% работающего, чтобы по аналогии сделать своё, а то видно я что-то из документации недопонял (у них там нету ни одного толкового экземпла - один отрывки). Люди, ну неужто никто не может мне помочь? Попробовал сорсы без zend'а, а чисто с расширением SOAP, где сервер и клиент на PHP и используется уже готовый WSDL файл, но опять фэйл - снифер только заголовки увидел(клиент ни одного сообшения не отправил :cry. Сорсы взяты отсюда. Даже не знаю что делать. Плиз, помогите! Очень прошу, а то я уже и так много дней бьюсь об эту каменную стену. Нужен хотя б один пример, чтобы залить на http://alone.iam.by/SOAP и проверить "общение" с С#, а потом на основании этого примера сделать свои сервисы.
И что именно не устроило? Не понял в чем вопрос? какой .php файл? Что и где должно появится? WSDL генерируется примерно такой http://simpliest.co.cc/sample/soapserver/wsdl.xml Меня затруднит. Я не даю готовых решений, тем более когда их просят. Я подскажу. Делать надо это http://phpfaq.ru/debug
Не получилось получить wsdl файл. Просто в NuSOAP как и в .NET (на лету) файл справки с полным описание всех методов и классов + ссылка на генерацию WSDL (опять же на лету - нигде не сохраняется). В вашем примере по-моим представлениям WSDL файлом должен выступать: http://simpliest.co.cc/sample/soapserver/index.php?wsdl Zend Framework генерит wsdl файл и пытается его записать в ту же папку - тогда это может стать ответом? Я не могу поставить права на запись файлов - можно ли это обойти? Я не прошу решить мою проблему - я лишь прошу дать мне любой - абсолютно любой 100% работающий SOAP веб-сервис - нужен толковый пример. Если нету, то не стоит напрягаться. Логи апачи ничего не дают, т.к. ответ приходит с исключением, если юзать NuSOAP, а с zend framework мне просто не понятно что да к чему. ПС: неужто на этом форуме никто не может направить меня в нужное русло?
Посмотрите методы, которые есть у Zend_Soap_AutoDiscover Он и может им выступать. Это результат работы Zend_Soap_AutoDiscover, который параллельно еще пишется в wsdl.xml В чем сложность? Там есть два режима - записать в файл и просто отдать как обычную страницу. У меня стойкое ощущение, что Вы просто не читали мануал и не смотрели соответствующее API. И это корень всех проблем. Мануал, мануал, мануал, мануал.... черт возьми! Там есть минимальный 100% работающий пример кода. Запускается за 5 минут. Причем тут логи апача? Вы даже не удосужились прочитать ссылку что я дал. Речь идет об отладке алгоритмов Я не вижу смысла помогать человеку, который не желает прилагать усилий. Если не хотите разбираться, то у Вас есть два варианта - Идете ищете фрилансера, который это сделает за деньги. - Можете обратится к местным "профессионалам" - Kreker, [vs], antonn, Апельсин. Они, правда, в этом вообще не разбираются, но чудеса бывают вдруг они смогут вам помочь
Нашёл решение тут Юзаю NuSOAP. Возможно дело в кодировке - буду искать. Simpliest, обещаю в будущем внимательнее изучить мануал - может я и упустил режимы работы и прочее, но это было ненарошно - очень невнимательный по жизни, а когда не получается что-то, то вообще торможу. Спасибо, что хоть чем-то помогали, а не игнорили как все остальные на этом форуме. ПС: к zend framework обязательно вернусь, т.к. мне кажется более перспективным решением, чем NuSOAP. Update: действительно всё дело в кодировке. Надо было добавить одну лишь строчку: PHP: $server->soap_defencoding = 'utf-8'; А вот и весь код PHP: <?php // Подключаем код NuSOAP require_once('nusoap.php'); // Создаем экщемпляр сервиса $server = new soap_server(); // Инициализируем поддержку WSDL $server->configureWSDL('hellowsdl2', 'urn:hellowsdl2'); // Устанавливаем пространство имен с префиксом tns для WSDL-схемы $server->wsdl->schemaTargetNamespace = 'urn:hellowsdl'; $server->soap_defencoding = 'utf-8'; // Регистрируем предоставляемый метод $server->register('hello', // название метода array('person'=>'xsd:string'), // входные параметры array('return'=>'xsd:string'), // выходные параметры 'urn:hellowsdl2', // пространство имен 'urn:hellowsdl2#hello', // soapaction 'rpc', // стиль 'literal', // использование 'Greet a person entering the sweepstakes' // документация ); // Определяем метод как функцию PHP function hello($person) { return "Good"; } // Используем HTTP-запрос чтобы вызвать сервис $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; $server->service($HTTP_RAW_POST_DATA); ?> Надеюсь, что мне потом кто-нибудь расскажет как это же сделать на zend framework ^^.
Столкнулся с проблемой. Мне надо при запросе отправить в качестве ответа всю таблицу MySQL. Т.е. типа массива структур. Пробовал реализовывать по-разному, но то VS ругается, что используется encoded стиль, то ответ приходит не такой, как я ожидал. Может кто-нибудь подсказать, желательно с наглядным примером, как можно реализовать такое на PHP (в виду SOAP или REST сервиса - возможны иные варианты, если они совместимы с .NET). Заранее спасибо, надеюсь на ваше понимание.
Составляй WSDL в режиме document\literal, точнее даже wrapped-document\literal http://www.ibm.com/developerworks/webse ... whichwsdl/ Возможно придется WSDL рисовать руками, без автогенерации.
На document приходит ответ: Код (Text): <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope 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/"><SOAP-ENV:Body><viewResponse xmlns="urn:game"></viewResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> А на rpc приходит это: Код (Text): Вырезано по причине бессмысленности :) Во всех вариантах использовал literal, т.к. с encoded VS работать отказывается Код nuSOAP: PHP: <?php //Настройки подключения к БД $mysqlhost = "localhost"; $mysqluser = "root"; $mysqlpass = ""; $mysqlbase = "genom162_alone"; $main_conn = mysql_connect ($mysqlhost,$mysqluser,$mysqlpass,$mysqlbase); mysql_select_db($mysqlbase, $main_conn); mysql_query('SET character_set_database = cp1251'); mysql_query('SET NAMES cp1251'); function sqla($q) { return mysql_fetch_array(sql($q)); } // Подключаем код NuSOAP require_once('nusoap.php'); // Создаем экщемпляр сервиса $server = new soap_server(); // Инициализируем поддержку WSDL $server->configureWSDL('game', 'urn:game'); // Устанавливаем пространство имен с префиксом tns для WSDL-схемы $server->wsdl->schemaTargetNamespace = 'urn:game'; //Опа- вот она моя беда - кодировка (не забыть!!!) $server->soap_defencoding = 'utf-8'; //Одна игра $server->wsdl->addComplexType( 'oneGame', 'complexType', 'struct', 'all', '', array( 'id' => array('name' => 'id', 'type' => 'xsd:int'), 'user1' => array('name' => 'user1', 'type' => 'xsd:string'), 'user2' => array('name' => 'user2', 'type' => 'xsd:string'), 'money' => array('name' => 'money', 'type' => 'xsd:int'), 'typeG' => array('name' => 'typeG', 'type' => 'xsd:string'), 'status' => array('name' => 'status', 'type' => 'xsd:int'), 'winner' => array('name' => 'winner', 'type' => 'xsd:string') ) ); //Список игр /* $server->wsdl->addComplexType( 'listOfGames', 'complexType', 'array', '', 'SOAP-ENC:Array', array(), array( array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:oneGame[]') ), 'tns:oneGame' ); */ /* $server->wsdl->addComplexType( 'listOfGames', 'complexType', 'array', '', 'SOAP-ENC:Array', array( array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:oneGame[]') ), 'tns:oneGame' ); */ $server->wsdl->addComplexType( 'listOfGames', 'complexType', 'array', 'all', '', array( 'desc' => array( 'name' => 'desc', 'type' => 'tns:oneGame', 'minOccurs' => '0', 'maxOccurs' => 'unbounded') ) ); /* void addComplexType ( string $name, [string $typeClass = 'complexType'], [string $phpType = 'array'], [string $compositor = ''], [string $restrictionBase = ''], [array $elements = array()], [array $attrs = array()], [string $arrayType = '']) */ //Камень-Ножницы-Бумага $server->wsdl->addComplexType( 'knb', 'complexType', 'struct', 'all', '', array( 'id' => array('name' => 'id', 'type' => 'xsd:int'), 'idGame' => array('name' => 'idGame', 'type' => 'xsd:int'), 'c1' => array('name' => 'c1', 'type' => 'xsd:int'), 'c2' => array('name' => 'c2', 'type' => 'xsd:int') ) ); // Регистрируем предоставляемый метод $server->register('login', // название метода array('user'=>'xsd:string','pass'=>'xsd:string'), // входные параметры array('return'=>'xsd:string'), // выходные параметры 'urn:game', // пространство имен 'urn:game#login', // soapaction 'rpc', // стиль 'literal', // использование 'Login to the game server' // документация ); $server->register('view', // название метода array('user'=>'xsd:string','pass'=>'xsd:string'), // входные параметры array('return'=>'tns:listOfGames'), // выходные параметры 'urn:game', // пространство имен 'urn:game#view', // soapaction 'rpc', // стиль 'literal', // использование 'List of games' // документация ); // Используем HTTP-запрос чтобы вызвать сервис $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; $server->service($HTTP_RAW_POST_DATA); // Определяем метод как функцию PHP function login($user,$pass) { $pers = mysql_fetch_array(mysql_query ("SELECT user,pass,uid FROM `users` WHERE `smuser`=LOWER('".addslashes($user)."') and `pass`='".(md5($pass))."'")); if($pers){ return "good"; } else { return "bad"; } } function view($user,$pass) { $pers = mysql_fetch_array(mysql_query ("SELECT user,pass,uid FROM `users` WHERE `smuser`=LOWER('".addslashes($user)."') and `pass`='".(md5($pass))."'")); if($pers){ $games = mysql_fetch_array(mysql_query ("SELECT * FROM `games`")); $results = array(); foreach ($games as $game) { $tempArray = array('id' => $game["id"], 'user1' => $game["user1"], 'user2' => $game["user2"], 'money' => $game["money"], 'typeG' => $game["typeG"], 'status' => $game["status"], 'winner' => $game["winner"] ); array_push($results, $tempArray); } return $results; } else { return new soap_fault('SERVER', '', 'Login plz.'); } } ?> И вот дамп таблицы, из которой берутся данные (изаначально предполагается, чт острок будет больше): [sql] CREATE TABLE IF NOT EXISTS `games` ( `id` bigint(20) unsigned NOT NULL DEFAULT '0', `user1` varchar(10) NOT NULL DEFAULT '', `user2` varchar(10) NOT NULL DEFAULT '', `money` bigint(20) NOT NULL DEFAULT '0', `typeG` varchar(10) NOT NULL DEFAULT '', `status` bigint(20) NOT NULL DEFAULT '0', `winner` varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251; INSERT INTO `games` (`id`, `user1`, `user2`, `money`, `typeG`, `status`, `winner`) VALUES (0, 'LiTR', 'Teon', 15, '1', 0, 'LiTR');[/sql] ПС: в коде сервиса не удалял комменты, чтобы было видно - эти варианты я уже пробовал, но они не работают
во-первых, отформатируйте свой XML - читать и отвечать невозможно. А во-вторых, ссылку я видимо давал для фонарного столба... Поэтому с советами завязываю. Всего доброго.
1. Это не мой XML - я его не ждал и просто словил снифером. (удалил, чтобы не мешало - но некоторая закономерность там прослеживалась - так появлялись буквы L и T из БД) 2. Я зря старался расписывая и используя все варианты кодирования сообщений? Если вы не поняли, то для меня применим лишь вариант RPC/literal (в этой реализации, по крайней мере). Про ссылку: там текст довольно сложный для восприятия. На сколько я понял (пречитав) - я изначально юзаю wrapped стиль. Но я не уверен, что знание отличий wrapped от non-wrapped даст мне проблеск идей для решения насущных проблем. Хотя я могу ошибаться, но мне кажется, что вы меня толкаете не по той дорожке. ПС: вы один на этом форуме разбираетесь в SOAP/WSDL или просто другие брезгуют общаться со мной?
Еще 2-3 человека скорее всего разбираются(они не сильно часто бывают на форуме), остальные скорее всего нет. Лучше прямо спросить у остальных - разбираются ли они. Может и есть еще кто-то, но он тщательно скрывается. Помочь вам можно только одним способом - или имея опыт работы таким же методом как у вас (я с NuSOAP & Silverlight не работал) Или взяв в руки спецификации WS-I, генерируемый вами WSDL, Request/Response пакеты и садится это дебажить. Вот это Говорит о том, что или используется некорректный WSDL файл или подается серверу некорректная структура. Т.е. там ошибки и сервер не кодирует сообщение в нужном виде. Попробуйте Eclipse там есть редактор WSDL с автовалидацией (хотя и не совсем корректной) плюс в нем же можно сразу тестировать свой сервис запросами и смотреть ответы. или как вариант погуглить и скачать SoapUI
1. SoapUI уже давно установлена, но пока не пробовал юзать. В качестве аналога подойдёт Zend Studio 7.0beta? (там есть вариант работы с WSDL, правда нету генерации WSDL из PHP класса - или я не нашёл, хотя в 6+ было) Эклипс где-то есть, но довольно старый (года 3). 2. Суть моих проблем в передаче массивов(не проверял) и многомерных массивов(точнее массивов структур). Может в zend framework это реализовано более очевидно или также неявно? Или есть более удобные способы кодирования данных с межплатформенным обменом?
подойдет. В том числе и вместо Eclipse Т.е. их не отдает ваш сервер? Тогда 100% правьте свой wsdl. Лучше всего если вы его получите в виде файла и будете смотреть глазами что там есть. Вот это http://www.w3.org/TR/wsdl отличная штука, я нашел там все что нужно в свое время.
1. Решил сделать так, чтобы метод view возвращал не массив структур, а просто одну структуру. Переделал функцию view: PHP: function view($user,$pass) { $game = mysql_fetch_array(mysql_query ("SELECT * FROM `games`")); $results = array(); // foreach ($games as $game) { $results = array('id' => $game->id, 'user1' => $game->user1, 'user2' => $game->user2, 'money' => $game->money, 'typeG' => $game->typeG, 'status' => $game->status, 'winner' => $game->winner ); return $results; } Вернуло: Код (Text): <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope 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/"><SOAP-ENV:Body><ns1:viewResponse xmlns:ns1="urn:game"><return><id/><user1/><user2/><money/><typeG/><status/><winner/></return></ns1:viewResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> 2. Переделал опять: PHP: function view($user,$pass) { $game = mysql_fetch_array(mysql_query ("SELECT * FROM `games`")); $results = array(); // foreach ($games as $game) { $results = array('id' => "0", 'user1' => "LiTR", 'user2' => "Teon", 'money' => "15", 'typeG' => "0", 'status' => "0", 'winner' => "LiTR" ); return $results; } Вернуло: Код (Text): <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope 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/"><SOAP-ENV:Body><ns1:viewResponse xmlns:ns1="urn:game"><return><id>0</id><user1>LiTR</user1><user2>Teon</user2><money>15</money><typeG>0</typeG><status>0</status><winner>LiTR</winner></return></ns1:viewResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> На клиенте всё отлично поймало. Наверное, я просто плохо обращаюсь с массивами. 3. Переделал ещё разок: PHP: function view($user,$pass) { $game = mysql_fetch_array(mysql_query ("SELECT * FROM `games`")); $results = array(); // foreach ($games as $game) { $results = array('id' => $game["id"], 'user1' => $game["user1"], 'user2' => $game["user2"], 'money' => $game["money"], 'typeG' => $game["typeG"], 'status' => $game["status"], 'winner' => $game["winner"] ); return $results; } Вернуло всё как и надо: Код (Text): <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope 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/"><SOAP-ENV:Body><ns1:viewResponse xmlns:ns1="urn:game"><return><id>0</id><user1>LiTR</user1><user2>Teon</user2><money>15</money><typeG>1</typeG><status>0</status><winner>LiTR</winner></return></ns1:viewResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> 4. А как на PHP заполнить многомерный массив? Так чтобы к нему потом было легко обращаться? Т.е. можно наполнять каждый массив как в последнем примере, а потом каким образом их всех слаживать в большой? Как это лучше реализовать, чтобы не было проблем с сериализацией и последующим обращением к данным? К текущему одномерному массиву я обращаюсь вот так: обращаюсь к значению "user1" - e.Result.user1 (VS создала прокси и знает, что данные придут в виде структуры oneGame - я могу обращаться к результату как к структуре, забирая каждое значение по отдельности - довольно удобно) Есть, конечно, вариант при первом запросе посчитать кол-во строк в таблице, а потом каждую тянуть отдельно, но мне кажется, что это бред бедного студента Я вот думаю: ключ в этом массиве desc, а значение - структура. Наверное надо заполнять ключи как id. Хотя немного не понимаю как. 6. Сделал вот так: PHP: function view($user,$pass) { $game = mysql_fetch_array(mysql_query ("SELECT * FROM `games`")); $results = array(); $result=array(); // foreach ($games as $game) { $result = array('id' => $game["id"], 'user1' => $game["user1"], 'user2' => $game["user2"], 'money' => $game["money"], 'typeG' => $game["typeG"], 'status' => $game["status"], 'winner' => $game["winner"] ); $results=array('desc'=>$result); //} return $results; } И получил: Код (Text): <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope 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/"><SOAP-ENV:Body><ns1:viewResponse xmlns:ns1="urn:game"><return><item><id>0</id><user1>LiTR</user1><user2>Teon</user2><money>15</money><typeG>1</typeG><status>0</status><winner>LiTR</winner></item></return></ns1:viewResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> Вот только не пойму, почему если пытаться разобрать каждую строку(снять комменты и заносить значения таблицы в games) - возвращает белиберду.
Мне стыдно, конечно, но я не так заносил значения в массив из БД Вот так работает, за исключением одного пункта - выдаёт только последнюю строку из БД - т.е. я неправильно заполняю главный многомерный массив PHP: function view($user,$pass) { $games = mysql_query("SELECT * FROM `games`"); $results = array(); $result=array(); for($i=0; $i<mysql_num_rows($games); $i++){ $game=mysql_fetch_array($games); $result = array('id' => $game["id"], 'user1' => $game["user1"], 'user2' => $game["user2"], 'money' => $game["money"], 'typeG' => $game["typeG"], 'status' => $game["status"], 'winner' => $game["winner"] ); $results=array('desc'=>$result); } return $results; } Может подскажите как заносить $result в $results? WSDL можно получить тут - по ссылке WSDL или просто добавив к ссылке ?wsdl. Всё... нашёл. Вот решение: PHP: function view($user,$pass) { $games = mysql_query("SELECT * FROM `games`"); $results = array(); $result=array(); for($i=0; $i<mysql_num_rows($games); $i++){ $game=mysql_fetch_array($games); $result = array('id' => $game["id"], 'user1' => $game["user1"], 'user2' => $game["user2"], 'money' => $game["money"], 'typeG' => $game["typeG"], 'status' => $game["status"], 'winner' => $game["winner"] ); array_push($results, $result); } return $results; } ?> Приходит результат: Код (Text): <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope 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/"><SOAP-ENV:Body><ns1:viewResponse xmlns:ns1="urn:game"><return><item><id>0</id><user1>LiTR</user1><user2>Teon</user2><money>15</money><typeG>1</typeG><status>0</status><winner>LiTR</winner></item><item><id>1</id><user1>dsgfwg</user1><user2>wgeg</user2><money>213</money><typeG>2</typeG><status>0</status><winner>dsgsg</winner></item></return></ns1:viewResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
Да... так правильно Ответ выглядит так: Код (Text): <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope 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/"><SOAP-ENV:Body><ns1:viewResponse xmlns:ns1="urn:game"><return><item><desc><id>0</id><user1>LiTR</user1><user2>Teon</user2><money>15</money><typeG>1</typeG><status>0</status><winner>LiTR</winner></desc></item><item><desc><id>1</id><user1>dsgfwg</user1><user2>wgeg</user2><money>213</money><typeG>2</typeG><status>0</status><winner>dsgsg</winner></desc></item></return></ns1:viewResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> Если честно, то мне немного мешает <item>. Можно ли сделать так, чтобы его не было в ответе?
Вот полностью WSDL: Код (Text): <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:game" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:game"> <types> <xsd:schema targetNamespace="urn:game" > <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" /> <xsd:complexType name="oneGame"> <xsd:all> <xsd:element name="id" type="xsd:int"/> <xsd:element name="user1" type="xsd:string"/> <xsd:element name="user2" type="xsd:string"/> <xsd:element name="money" type="xsd:int"/> <xsd:element name="typeG" type="xsd:string"/> <xsd:element name="status" type="xsd:int"/> <xsd:element name="winner" type="xsd:string"/> </xsd:all> </xsd:complexType> <xsd:complexType name="listOfGames"> <xsd:all> <xsd:element name="desc" type="tns:oneGame" minOccurs="0" maxOccurs="unbounded"/> </xsd:all> </xsd:complexType> <xsd:complexType name="knb"> <xsd:all> <xsd:element name="id" type="xsd:int"/> <xsd:element name="idGame" type="xsd:int"/> <xsd:element name="c1" type="xsd:int"/> <xsd:element name="c2" type="xsd:int"/> </xsd:all> </xsd:complexType> </xsd:schema> </types> <message name="loginRequest"> <part name="user" type="xsd:string" /> <part name="pass" type="xsd:string" /></message> <message name="loginResponse"> <part name="return" type="xsd:string" /></message> <message name="viewRequest"> <part name="user" type="xsd:string" /> <part name="pass" type="xsd:string" /></message> <message name="viewResponse"> <part name="return" type="tns:listOfGames" /></message> <portType name="gamePortType"> <operation name="login"> <documentation>Login to the game server</documentation> <input message="tns:loginRequest"/> <output message="tns:loginResponse"/> </operation> <operation name="view"> <documentation>List of games</documentation> <input message="tns:viewRequest"/> <output message="tns:viewResponse"/> </operation> </portType> <binding name="gameBinding" type="tns:gamePortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="login"> <soap:operation soapAction="urn:game#login" style="rpc"/> <input><soap:body use="literal" namespace="urn:game"/></input> <output><soap:body use="literal" namespace="urn:game"/></output> </operation> <operation name="view"> <soap:operation soapAction="urn:game#view" style="rpc"/> <input><soap:body use="literal" namespace="urn:game"/></input> <output><soap:body use="literal" namespace="urn:game"/></output> </operation> </binding> <service name="game"> <port name="gamePort" binding="tns:gameBinding"> <soap:address location="http://alone.iam.by/SOAP/game.php"/> </port> </service> </definitions> Мне кажется, или <item> "вылазит" в процессе наполнения многомерного массива?
А как должны определятся элементы многомерного массива без второго измерения? Передавайте тупо одномерный массив - тогда этого не будет. Но возникнет вопрос с типами элементов массива. Да и как определить кому принадлежит Код (Text): <money>15</money> <money>213</money> ? Это в PHP массив может содержать произвольные типы в качестве элементов, в других местах это далеко не так. Вобщем я такого извращения не пробовал - можете поэкспериментировать.
Просто VS сгенерила прокси-класс по WSDL, но я могу лишь обратиться к result.desc С учётом того, что все группы элементов входят в desc, то не вижу смысла заново их влаживать в item. Другое дело - как сделать, чтобы не было item? Ы) Придумал, пока писал вам Я просто передрал объявление массива: PHP: $server->wsdl->addComplexType( 'listOfGames', 'complexType', 'array', 'all', '', array( 'item' => array( 'name' => 'item', 'type' => 'tns:oneGame', 'minOccurs' => '0', 'maxOccurs' => 'unbounded') ) ); И поставил свой вариант: PHP: array_push($results, $result); Т.е. теперь вместо desc item- и пусть себе пхнёт массив <item> - всёравно уже объявлено в WSDL Теперь буду думать как разграничить Каждый item друг от друга. Но главное на данный момент - могу получать данные из первой строки