История простая: 1С вызывает веб-сервис на PHP, который что-то там делает (параметры сервиса ниже) и возвращает код 0 или 1. Почти все уже готово. Задача только написать серверную часть веб-сервиса на PHP. Какие классы для этого использовать и где готовить WSDL? Можно ли без WSDL, если обе стороны обмена хорошо знают параметры сервиса? По слухам SOAP очень глючный. Так ли это еще на данный момент? Параметры веб-сервиса все простые: id: integer date: datetime account: char var (255) sum: integer naz: char var(255) еще много других, но они тоже все простые строки, чесла и даты. За что хвататься, за что не стоит? где почитать?
АЦТООООООЙ!!! тому кто писал wsdl-редактор в pdt2.0 надо руки оторвать. никогда не пользуйтесь. один сплошной баг!
Как все заипало. кто-нибудь делал это все реально от начала и до конца? если я правильно тебя понял, это про soapUI нету в нетбинсовском менеджере плагинов никакого soapUI. точто смотрел. могу картинку выложить. что дальше делать?
я херею от этих wsdl-ек! сервисы-шмервисы, сервисы от биндингов, биндинги от портов, порты от операций, операции от элементов. панапридумывали. я уже запутался.
А что такое $HTTP_RAW_POST_DATA во всех примерах на стороне сервера? Например PHP: <?php $server->service($HTTP_RAW_POST_DATA);
WSDL-ку в редакторе составил, но сервер с клиентом законнектить не получилось вот мои исходники, в чем моя ошибка? специально все упращено, чтобы было легче найти баг. подозреваю, что в $HTTP_RAW_POST_DATA в сервере файл newWSDL.wsdl Код (Text): <?xml version="1.0" encoding="windows-1251"?> <definitions name="newWSDL" targetNamespace="http://j2ee.netbeans.org/wsdl/newWSDL" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 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/"> <types/> <message name="newWSDLOperationRequest"> <part name="part1" type="xsd:string"/> </message> <message name="newWSDLOperationResponse"> <part name="part1" type="xsd:string"/> </message> <portType name="newWSDLPortType"> <operation name="newWSDLOperation"> <input name="input1" message="tns:newWSDLOperationRequest"/> <output name="output1" message="tns:newWSDLOperationResponse"/> </operation> </portType> <binding name="newWSDLBinding" type="tns:newWSDLPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="newWSDLOperation"> <soap:operation/> <input name="input1"> <soap:body use="literal" namespace="http://j2ee.netbeans.org/wsdl/newWSDL"/> </input> <output name="output1"> <soap:body use="literal" namespace="http://j2ee.netbeans.org/wsdl/newWSDL"/> </output> </operation> </binding> <service name="newWSDLService"> <port name="newWSDLPort" binding="tns:newWSDLBinding"> <soap:address location="http://localhost:${HttpDefaultPort}/newWSDLService/newWSDLPort"/> </port> </service> <plnk:partnerLinkType name="newWSDL"> <!-- A partner link type is automatically generated when a new port type is added. Partner link types are used by BPEL processes. 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. A partner link type characterizes the conversational relationship between two services. The partner link type can have one or two roles.--> <plnk:role name="newWSDLPortTypeRole" portType="tns:newWSDLPortType"/> </plnk:partnerLinkType> </definitions> сервер файл newWSDL.php PHP: <?php require('lib/nusoap.php'); $server = new soap_server('newWSDL.wsdl'); function newWSDLOperation($in){ return $in; } //$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; $server->service($HTTP_RAW_POST_DATA); //[b]вот это $HTTP_RAW_POST_DATA из примера что за херня?[/b] и клиент файл client.php PHP: <?php require('lib/nusoap.php'); $client = new nusoap_client('http://tor/newWSDL.php?wsdl', 'wsdl'); $err = $client->getError(); if ($err) { echo '<h2>Constructor error</h2><pre>' . $err . '</pre>'; } // Doc/lit parameters get wrapped $param = array('part1' => 'IBM'); $result = $client->call('newWSDLOperation', array('parameters' => $param), '', '', false, true); // Check for a fault if ($client->fault) { echo '<h2>Fault</h2><pre>'; print_r($result); echo '</pre>'; } else { // Check for errors $err = $client->getError(); if ($err) { // Display the error echo '<h2>Error</h2><pre>' . $err . '</pre>'; } else { // Display the result echo '<h2>Result</h2><pre>'; print_r($result); echo '</pre>'; } } echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>'; echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>'; ?> и вот такая ошибка
Это «чистые» POST данные неразобранные и необработанные пыхом. Врунишко =)) у тебя 404 ошибка. - тут, якобы: http://www.xignite.com/xquotes.asmx?WSDL
да, кстати, если у тебя php поновей, вместо RAW_DATA читай из php://input - это практичней, и надежней. http://www.php.net/manual/en/ini.core.p ... -post-data
какой у него синтаксис? $server->service('php://input') так что-ли? http://www.xignite.com/xquotes.asmx?WSDL :shock: :shock: :shock: это у меня такая? первый раз такой адрес вижу. завтра на свежую голову перепроверю.
поставил в php.ini always_populate_raw_post_data = On после отправки данных по POST из тестовой формы в скрипте сервера стала доступна переменная $HTTP_RAW_POST_DATA
тут целый вагон багов и непоняток. во-первых, у меня не получилась обойтись в сервере без первой строчки PHP: <?php $HTTP_RAW_POST_DATA= isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:''; $server->service($HTTP_RAW_POST_DATA); потому что когда клиент подхватывает wsdl-ку, то запускается скрипт сервера, который на второй строчке $server->service($HTTP_RAW_POST_DATA); выдает варнинг типа переменная неопределена и весь стек варнинго. А клиент пытается интерпретировать этот варнинг как XML wsdl-ки. И естественно ругается, что неправильный xml в строчке 2. Без isset() будет работать только на серваках, которые не выводят ошибки типа варнинг. Это первый подводный камень. Во-вторых, нетбинсовский редактор генерит неправильную wsdl-ку. Всю wsdl-ку можно посмотреть выше. Вот строчка из нее Код (Text): <soap:address location="http://localhost:${HttpDefaultPort}/newWSDLService/newWSDLPort"/> ахринеть, да? Бедный нусоап ругается, что невозможно разобрать урл. Так что надо руками менять ${HttpDefaultPort} на свой порт. Где его можно выставить в редакторе, чтобы он туда подставился автоматически я не нашел. Если кто-то знает, поделитесь. Ну и, конечно, не забыть еще в php.ini поставить always_populate_raw_post_data = On После всех этих доработак вот такая ошибка. Кто тут не найден? флоппик ты делал сервер web-сервиса? есть работающий пример на nuSoap или встроенном SOAP?
error_reporting(0); =) Да, я делал, но потом отказался от SOAP в пользу REST, просто потому, что PHP плохо других с соапом т.к. у него слабая типизация, + бажная поддержка.
лечше все-таки isset(), чтобы контролировать ошибки. да уж. PHP-шная команда в упор не видит куда ветер дует. Может microsoft проплатила там парочке предателей , чтобы он загнулся?
PHP: <pre> <?php $servers['main']=array('name'=>'Информационный сервер', 'host'=>'10.180.1.41','port'=>'6113'); $servers['merge']=array('name'=>'Сервер объединений альтернатив', 'host'=>'10.180.1.41','port'=>'6111'); $servers['integration']=array('name'=>'Интеграционный сервер', 'host'=>'10.180.1.37','port'=>'6112'); include('SOAP/nusoap.php'); // Создание SOAP-клиента по WSDL-документу $client = new nusoap_client('http://10.180.1.37/AGTSoft.IntegrationWebServices/IntegrationWebService.asmx?WSDL',true); $err = $client->getError(); if ($err) { echo '<h2>Constructor error</h2><pre>' . $err . '</pre>'; echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>'; exit(); } foreach($servers as $key=>$server){ $result = $client->call('CheckAvailability', array('host'=>$server['host'], 'port'=>$server['port'])); $servers[$key]['avaible']=$result['CheckAvailabilityResult']; } foreach($servers as $server){ echo $server['name']," — ", $server['avaible']?'Работает':'Не работает',"\n"; } ?> </pre> =))
Что это? у меня не работает, хотя и ошибки никакой не говорит в строках 14-18. не дает даже через браузерер получить wsdl-ку по адресу 'http://10.180.1.37/AGTSoft.IntegrationWebServices/IntegrationWebService.asmx?WSDL'