За последние 24 часа нас посетили 52489 программистов и 1794 робота. Сейчас ищут 827 программистов ...

1С+PHP через WEB-сервис AHTUNG!!

Тема в разделе "Прочие вопросы по PHP", создана пользователем alexey_baranov, 20 июл 2009.

  1. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    История простая: 1С вызывает веб-сервис на PHP, который что-то там делает (параметры сервиса ниже) и возвращает код 0 или 1. Почти все уже готово. Задача только написать серверную часть веб-сервиса на PHP.

    Какие классы для этого использовать и где готовить WSDL? Можно ли без WSDL, если обе стороны обмена хорошо знают параметры сервиса? По слухам SOAP очень глючный. Так ли это еще на данный момент?

    Параметры веб-сервиса все простые:

    id: integer
    date: datetime
    account: char var (255)
    sum: integer
    naz: char var(255)
    еще много других, но они тоже все простые строки, чесла и даты.

    За что хвататься, за что не стоит? где почитать?
     
  2. если жжот в одном месте, читать про REST ?
     
  3. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    REST лучше чем soap ?
     
  4. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    А ептитьмоптить 1С пользует SOAP.
     
  5. alBoo

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

    С нами с:
    27 мар 2008
    Сообщения:
    63
    Симпатии:
    0
    для WSDL можно заюзать плагин для NetBeans
    Про SOAP - в гугле туева хуча доков
     
  6. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    что лучше NuSOAP или втроенный SOAP?
     
  7. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    АЦТООООООЙ!!!

    тому кто писал wsdl-редактор в pdt2.0 надо руки оторвать. никогда не пользуйтесь. один сплошной баг!
     
  8. nuSOAP/ Родной бажный, как моя жизнь.
     
  9. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Как все заипало. кто-нибудь делал это все реально от начала и до конца?



    если я правильно тебя понял, это про soapUI
    нету в нетбинсовском менеджере плагинов никакого soapUI. точто смотрел. могу картинку выложить. что дальше делать?
     
  10. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    флоппик
    ясно. спасибо
     
  11. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    я херею от этих wsdl-ек!

    сервисы-шмервисы, сервисы от биндингов, биндинги от портов, порты от операций, операции от элементов. панапридумывали. я уже запутался.
     
  12. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    PHP шный файл обязан иметь одно имя с wsdl-кой?
     
  13. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    А что такое $HTTP_RAW_POST_DATA во всех примерах на стороне сервера? Например

    PHP:
    1. <?php
    2. $server->service($HTTP_RAW_POST_DATA);
     
  14. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    WSDL-ку в редакторе составил, но сервер с клиентом законнектить не получилось

    вот мои исходники, в чем моя ошибка? специально все упращено, чтобы было легче найти баг. подозреваю, что в $HTTP_RAW_POST_DATA в сервере

    файл newWSDL.wsdl
    Код (Text):
    1.  
    2. <?xml version="1.0" encoding="windows-1251"?>
    3. <definitions name="newWSDL" targetNamespace="http://j2ee.netbeans.org/wsdl/newWSDL"
    4.     xmlns="http://schemas.xmlsoap.org/wsdl/"
    5.     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    6.     xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://j2ee.netbeans.org/wsdl/newWSDL" xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
    7.     <types/>
    8.     <message name="newWSDLOperationRequest">
    9.         <part name="part1" type="xsd:string"/>
    10.     </message>
    11.     <message name="newWSDLOperationResponse">
    12.         <part name="part1" type="xsd:string"/>
    13.     </message>
    14.     <portType name="newWSDLPortType">
    15.         <operation name="newWSDLOperation">
    16.             <input name="input1" message="tns:newWSDLOperationRequest"/>
    17.             <output name="output1" message="tns:newWSDLOperationResponse"/>
    18.         </operation>
    19.     </portType>
    20.     <binding name="newWSDLBinding" type="tns:newWSDLPortType">
    21.         <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    22.         <operation name="newWSDLOperation">
    23.             <soap:operation/>
    24.             <input name="input1">
    25.                 <soap:body use="literal" namespace="http://j2ee.netbeans.org/wsdl/newWSDL"/>
    26.             </input>
    27.             <output name="output1">
    28.                 <soap:body use="literal" namespace="http://j2ee.netbeans.org/wsdl/newWSDL"/>
    29.             </output>
    30.         </operation>
    31.     </binding>
    32.     <service name="newWSDLService">
    33.         <port name="newWSDLPort" binding="tns:newWSDLBinding">
    34.             <soap:address location="http://localhost:${HttpDefaultPort}/newWSDLService/newWSDLPort"/>
    35.         </port>
    36.     </service>
    37.     <plnk:partnerLinkType name="newWSDL">
    38.         <!-- A partner link type is automatically generated when a new port type is added. Partner link types are used by BPEL processes.
    39. In a BPEL process, a partner link represents the interaction between the BPEL process and a partner service. Each partner link is associated with a partner link type.
    40. A partner link type characterizes the conversational relationship between two services. The partner link type can have one or two roles.-->
    41.         <plnk:role name="newWSDLPortTypeRole" portType="tns:newWSDLPortType"/>
    42.     </plnk:partnerLinkType>
    43. </definitions>
    сервер файл newWSDL.php
    PHP:
    1. <?php
    2.  
    3. require('lib/nusoap.php');
    4. $server = new soap_server('newWSDL.wsdl');
    5. function  newWSDLOperation($in){
    6.     return $in;
    7. }
    8.  
    9. //$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
    10. $server->service($HTTP_RAW_POST_DATA); //[b]вот это $HTTP_RAW_POST_DATA из примера что за херня?[/b]
    11.  
    12.  
    и клиент файл client.php
    PHP:
    1. <?php
    2. require('lib/nusoap.php');
    3.  
    4. $client = new nusoap_client('http://tor/newWSDL.php?wsdl', 'wsdl');
    5. $err = $client->getError();
    6. if ($err) {
    7.     echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
    8. }
    9. // Doc/lit parameters get wrapped
    10. $param = array('part1' => 'IBM');
    11. $result = $client->call('newWSDLOperation', array('parameters' => $param), '', '', false, true);
    12. // Check for a fault
    13. if ($client->fault) {
    14.     echo '<h2>Fault</h2><pre>';
    15.     print_r($result);
    16.     echo '</pre>';
    17. } else {
    18.     // Check for errors
    19.     $err = $client->getError();
    20.     if ($err) {
    21.         // Display the error
    22.         echo '<h2>Error</h2><pre>' . $err . '</pre>';
    23.     } else {
    24.         // Display the result
    25.         echo '<h2>Result</h2><pre>';
    26.         print_r($result);
    27.         echo '</pre>';
    28.     }
    29. }
    30. echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
    31. echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
    32. echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
    33. ?>
    34.  
    и вот такая ошибка
     
  15. Это «чистые» POST данные неразобранные и необработанные пыхом.

    Врунишко =))
    у тебя 404 ошибка. - тут, якобы: http://www.xignite.com/xquotes.asmx?WSDL
     
  16. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    какой у него синтаксис? $server->service('php://input') так что-ли?

    http://www.xignite.com/xquotes.asmx?WSDL :shock: :shock: :shock:
    это у меня такая? первый раз такой адрес вижу. завтра на свежую голову перепроверю.
     
  17. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    поставил в php.ini

    always_populate_raw_post_data = On

    после отправки данных по POST из тестовой формы в скрипте сервера стала доступна переменная $HTTP_RAW_POST_DATA
     
  18. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    тут целый вагон багов и непоняток.

    во-первых, у меня не получилась обойтись в сервере без первой строчки
    PHP:
    1. <?php
    2. $HTTP_RAW_POST_DATA= isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:'';
    3. $server->service($HTTP_RAW_POST_DATA);
    4.  
    потому что когда клиент подхватывает wsdl-ку, то запускается скрипт сервера, который на второй строчке
    $server->service($HTTP_RAW_POST_DATA);
    выдает варнинг типа переменная неопределена и весь стек варнинго. А клиент пытается интерпретировать этот варнинг как XML wsdl-ки. И естественно ругается, что неправильный xml в строчке 2. Без isset() будет работать только на серваках, которые не выводят ошибки типа варнинг. Это первый подводный камень.

    Во-вторых, нетбинсовский редактор генерит неправильную wsdl-ку. Всю wsdl-ку можно посмотреть выше. Вот строчка из нее
    Код (Text):
    1. <soap:address location="http://localhost:${HttpDefaultPort}/newWSDLService/newWSDLPort"/>
    ахринеть, да? Бедный нусоап ругается, что невозможно разобрать урл. Так что надо руками менять ${HttpDefaultPort} на свой порт. Где его можно выставить в редакторе, чтобы он туда подставился автоматически я не нашел. Если кто-то знает, поделитесь.

    Ну и, конечно, не забыть еще в php.ini поставить always_populate_raw_post_data = On

    После всех этих доработак вот такая ошибка. Кто тут не найден?
    флоппик
    ты делал сервер web-сервиса? есть работающий пример на nuSoap или встроенном SOAP?
     
  19. error_reporting(0); =)

    Да, я делал, но потом отказался от SOAP в пользу REST, просто потому, что PHP плохо других с соапом т.к. у него слабая типизация, + бажная поддержка.
     
  20. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    лечше все-таки isset(), чтобы контролировать ошибки.
    да уж. PHP-шная команда в упор не видит куда ветер дует. Может microsoft проплатила там парочке предателей , чтобы он загнулся?
     
  21. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Кто-нибудь с SOAPом у нас вообще работает/работал? или я один такой горемыка?
     
  22. PHP:
    1. <pre>
    2. <?php
    3.  
    4.     $servers['main']=array('name'=>'Информационный сервер', 'host'=>'10.180.1.41','port'=>'6113');
    5.     $servers['merge']=array('name'=>'Сервер объединений альтернатив', 'host'=>'10.180.1.41','port'=>'6111');
    6.     $servers['integration']=array('name'=>'Интеграционный сервер', 'host'=>'10.180.1.37','port'=>'6112');
    7.  
    8.  
    9.     include('SOAP/nusoap.php');
    10.     // Создание SOAP-клиента по WSDL-документу
    11.     $client = new nusoap_client('http://10.180.1.37/AGTSoft.IntegrationWebServices/IntegrationWebService.asmx?WSDL',true);
    12.  
    13.     $err = $client->getError();
    14.     if ($err) {
    15.         echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
    16.         echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>';
    17.         exit();
    18.     }
    19.  
    20.     foreach($servers as $key=>$server){
    21.         $result = $client->call('CheckAvailability', array('host'=>$server['host'], 'port'=>$server['port']));
    22.         $servers[$key]['avaible']=$result['CheckAvailabilityResult'];
    23.     }
    24.  
    25.     foreach($servers as $server){
    26.         echo $server['name']," — ",  $server['avaible']?'Работает':'Не работает',"\n";
    27.     }
    28. ?>
    29. </pre>
    =))
     
  23. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Что это? у меня не работает, хотя и ошибки никакой не говорит в строках 14-18.

    не дает даже через браузерер получить wsdl-ку по адресу 'http://10.180.1.37/AGTSoft.IntegrationWebServices/IntegrationWebService.asmx?WSDL'