За последние 24 часа нас посетили 87117 программистов и 4659 роботов. Сейчас ищут 1996 программистов ...

SOAP веб-сервис на PHP

Тема в разделе "PHP для новичков", создана пользователем cheater, 4 май 2010.

  1. cheater

    cheater Активный пользователь

    С нами с:
    13 мар 2010
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Минск
    *Бьюсь об стенку*
    VS создала прокси-класс, но не видит, что listOfGames массив и я не могу получить доступ к другим, кроме первой, строкам :( Что-то я не так сделал при объявлении listOfGames. А если добавить [], то VS ругается.
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.507
    Симпатии:
    2
    Адрес:
    Донецк
    HTML:
    1. <!-- array of struct -->        
    2.             <xsd:complexType name="ArrayOfrecord" >
    3.                 <xsd:complexContent>
    4.                   <xsd:restriction base="soapenc:Array">
    5.                       <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:record"/>
    6.                   </xsd:restriction>
    7.                 </xsd:complexContent>
    8.             </xsd:complexType>
    9.             <xsd:complexType name="record">
    10.                 <xsd:sequence>
    11.                     <xsd:element name="id" type="xsd:int" nillable="true">
    12.                     </xsd:element>
    13.                     <xsd:element name="name" type="xsd:string"></xsd:element>
    14.                     <xsd:element name="desc" type="xsd:string"></xsd:element>
    15.                 </xsd:sequence>
    16.             </xsd:complexType>
    17.  
     
  3. cheater

    cheater Активный пользователь

    С нами с:
    13 мар 2010
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Минск
    C пространством soapenc VS даже не хочет читать WSDL и пишет, что такое пространство имён не задано, глянул - в WSDL у меня SOAP-ENC (я его раньше пробовал) - результат как и раньше - выдаёт 4 предупреждения и одну ошибку, что не может создать прокси-класс.
    HTML:
    1.  
    2.  <xsd:complexType name="oneGame">
    3.   <xsd:all>
    4.    <xsd:element name="id" type="xsd:int"/>
    5.    <xsd:element name="user1" type="xsd:string"/>
    6.    <xsd:element name="user2" type="xsd:string"/>
    7.    <xsd:element name="money" type="xsd:int"/>
    8.    <xsd:element name="typeG" type="xsd:string"/>
    9.    <xsd:element name="status" type="xsd:int"/>
    10.    <xsd:element name="winner" type="xsd:string"/>
    11.   </xsd:all>
    12.  </xsd:complexType>
    13.  <xsd:complexType name="listOfGames">
    14.   <xsd:complexContent>
    15.    <xsd:restriction base="SOAP-ENC:Array">
    16.     <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:oneGame[]"/>
    17.    </xsd:restriction>
    18.   </xsd:complexContent>
    19.  </xsd:complexType>
    Аналог такого объявления в NuSOAP:
    PHP:
    1.  
    2. $server->wsdl->addComplexType(
    3.     'listOfGames',
    4.     'complexType',
    5.     'array',
    6.     '',
    7.     'SOAP-ENC:Array',
    8.     array(),
    9.     array(
    10.         array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:oneGame[]')
    11.     ),
    12.     'tns:oneGame'
    13. );
    Хм... если использовать ранее скомпилированную версию, то нормально общается с таким вариантом WSDL - пакеты точно такие же приходят, но вот главное - научить VS "видеть" массив. Что-то я никак из этой ямы не выберусь :(
    ПС:
    может подскажите, что имел ввиду автор последнего поста тут
    У меня последний его вариант норм пашет - типа передавать чисто структуру, а вот работает ли у него передача массива структур - я так и не понял.
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.507
    Симпатии:
    2
    Адрес:
    Донецк
    берем каждое из этих предупреждений и ошибку и http://phpfaq.ru/debug в руки.
     
  5. cheater

    cheater Активный пользователь

    С нами с:
    13 мар 2010
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Минск
    Ну это не PHP выдаёт.
    Может есть другие способы в WSDL задать массив? Или только SOAP-ENC:arrayType? Как-то вот не дружит с подобными вещами. Могу лишь предположить, что подобное объявление относится к encoded, а VS переваривает только literal.
    Да точно... пишит, что подобное возможно лишь для Encoded :(
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.507
    Симпатии:
    2
    Адрес:
    Донецк
    А это неважно :)
    важно что есть ошибки и их надо разобрать и исправить - тогда все заработает.

    Может и есть

    Я ссылку давал.
     
  7. cheater

    cheater Активный пользователь

    С нами с:
    13 мар 2010
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Минск
    Вот плина - даже капиталисты ничем не помогут:(
    Там внизу в комментах у чела такая же трабла как и у меня - ему посоветовали юзать REST o_O. Видно не судьба ...
    А какая ссылка на спецификацию 1.2 или какая там последняя?
    Хы... для arrayType нашёл namespace xsd. Осталось "пристроить" Array.
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.507
    Симпатии:
    2
    Адрес:
    Донецк
    Решить можно все.
    Если делать самому, но лично мне лень :)

    Передавайте структуры в XML, как mime там есть режим для этого или даже просто как строку. А в Silverlight парсьте - неудобно, но решение.

    гугл уже закрылся?
     
  9. cheater

    cheater Активный пользователь

    С нами с:
    13 мар 2010
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Минск
    Вот эти два момента интересны. Вот интересно - можно ли собрать строку JSOn на PHP и отправить в качестве ответа? (если можно - пару ссылок на классы, который бы облегчили заполнение JSOn строки на PHP)
    ПС:
    попробовал wsdl:documented - что-то не прокатило :(
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.507
    Симпатии:
    2
    Адрес:
    Донецк
    можно
     
  11. cheater

    cheater Активный пользователь

    С нами с:
    13 мар 2010
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Минск
    Тут говорится, что поддержка встроена в 5.2.0+ У меня на хостинге PHP Version 5.1.6 и что-то не видно упоминания про JSON. Что-то сцыкотно мне опять :(
     
  12. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.507
    Симпатии:
    2
    Адрес:
    Донецк
    Берем и ищем в гугле соответствующую имплементацию на чистом php.
    Как вариант просим хостера обновить PHP или меняем хостера.
     
  13. cheater

    cheater Активный пользователь

    С нами с:
    13 мар 2010
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Минск
    ДА ну нафик этого хостера - сдам курсач и пошли они ... :(
    А вот на чистом PHP что-то найти не могу... либы и те требуют PEAR.
    Что-то я устал - аж спина заболела :( Завтра попробую JSON или REST, если не посетит какая-нибудь "очередная сумасбродная идея". Или просто забью на пересылку многомерных массивов - и так сделал выше крыши. Хотя для себя хотелось бы добить это, но что-то мне ограниченность SL уже поднадоела - видно, заточена только под WCF. Кстати, на буржуйских сайтах все рекомендую WeBOrb. Где-то у меня старая версия валялась. Подскажите - стоит ли пробовать или зря время потрачу, которого уже ой как мало осталось?
    ПС:
    вот, кажись, кто-то добрый сам написал функцию из массива в JSON :)
     
  14. cheater

    cheater Активный пользователь

    С нами с:
    13 мар 2010
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Минск
    Заюзал функцию стандартную $strToSend=json_encode($objToEncode); и получил:
    HTML:
    1. <return>
    2. [
    3. {
    4. &quot;id&quot;:&quot;1&quot;,&quot;user1&quot;:&quot;LiTR&quot;,&quot;user2&quot;:&quot;Teon&quot;,&quot;money&quot;:&quot;15&quot;,&quot;typeG&quot;:&quot;1&quot;,&quot;status&quot;:&quot;0&quot;,&quot;winner&quot;:&quot;LiTR&quot;
    5. }
    6. ,
    7. {
    8. &quot;id&quot;:&quot;2&quot;,&quot;user1&quot;:&quot;cheater&quot;,&quot;user2&quot;:&quot;Genom&quot;,&quot;money&quot;:&quot;30&quot;,&quot;typeG&quot;:&quot;2&quot;,&quot;status&quot;:&quot;0&quot;,&quot;winner&quot;:&quot;cheater&quot;
    9. }
    10. ]
    11. </return></
    С "этим" проблем не будет?..
    Это так кавычки передёрнуло?:)
     
  15. cheater

    cheater Активный пользователь

    С нами с:
    13 мар 2010
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Минск
    Заменил возвращаемый тип с string на anytype:
    HTML:
    1. <return>
    2. [{"id":1,"user1":"LiTR","user2":"Teon","money":15,"typeG":1,"status":0,"winner":"LiTR"},
    3. {"id":2,"user1":"cheater","user2":"Genom","money":30,"typeG":2,"status":0,"winner":"cheater"}]
    4. </return>
    Вроде бы сделал - норм принимает значения :)
     
  16. radoslav

    radoslav Активный пользователь

    С нами с:
    27 окт 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Казахстан
    Здравствуйте!
    Я тоже использую библиотеку Nusoap. Помогите пожалуйста.
    Проблема в том что сервис написан не на РНР и там есть WSDL до которой я достучился с помошью Nusoap РНР. Как я понимаю WSDL должен быть один который на сервере а клиент вызывает этот WSDL и передает через него данные или я не прав?
    Праблема в том что я передаю с базы данных MySQL таблицу в виде ассоциативного массива, но при этом на сервере получается нечитабельном виде. То есть мне надо подогнать библиотеку под UTF-8.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    Всдл это файл с описанием методов. Открой в текстовом редакторе и посмотри что внутри. В критических можно использовать вместо справочника.
     
  18. radoslav

    radoslav Активный пользователь

    С нами с:
    27 окт 2011
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Казахстан
    извините но это вовсе не ответ на мой вопрос