|
WEB сервисы 1С из браузера | ☑ | ||
---|---|---|---|---|
0
abtat
14.02.13
✎
17:29
|
Я собрал два WEB-Сервиса в 1С v.8.2.1.540 – Сотрудники(Workers) по варианту из http://infostart.ru/public/86791/ и более простой Привет(PrivetBoys1) с использованием текстов privet.htm и privet.js, по образу приведенных в статье http://infostart.ru/public/16001/ с некоторыми заменами имен, и благополучно вызываю их из другого экземпляра 1С на той же машине. Сервер Apache 2.2. на ней же. В WEB-сервисах экземпляра 1С-сервера имеются функции «Получить список сотрудников(ФИО)» и «SalutBoys()» возвращающие результат оператором Return.
Строки обращения к 1С-серверу для этих Сервисов в 1С-клиенте имеют вид: Определения = Новый WSОпределения("http://localhost/WebServicesDemo/ws/Workers.1cws?wsdl"); Прокси = Новый WSПрокси(Определения, "http://www.sample-package.org", "Workers", "WorkersSoap"); Ответ = Прокси.ПолучитьСписокСотрудников(ФИО); И Определения = Новый WSОпределения("http://localhost/WebServicesDemo/ws/PrivetBoys1.1cws?wsdl"); Прокси = Новый WSПрокси(Определения, "http://www.sample-package.org", "PrivetBoys1", "PrivetBoys1Soap"); ОтветWS = Прокси.SalutBoys(); На форме в 1С-клиенте после выполнения этих обращений распечатываются данные одного или списка сотрудников и приветственное обращение. Отладку вызовов из браузера начал с более простого «PrivetBoys1» (пробовал на IE и Opera) с учетом замены имени preved на privet в вызове скрипта, на PrivetBoys1 в имени файла публикации ( PrivetBoys1.csv) и ссылке на него в операторе POST: xmlhttp.open('POST', 'http://localhost/WebServicesDemo/ws/PrivetBoys1.1cws?wsdl', true); а также имени функции ПриветХлопцы на SalutBoys в строке soap:Body оператора SEND: '<soap:Body> <m:SalutBoys xmlns:m="http://www.sample-package.org"/> </soap:Body>' +. Все остальные элементы текстов, приведенных в этой статье, остались неизменными, но в результате за несколько секунд после выполнения оператора SEND происходят несколько последовательных вызова функции ПриОтветеСервера с изменением значения readyState c 0 до 4, в последнем случае status = 200, т.е. все прошло благополучно, но ДомОтвет = NULL и ДанныеОтвета = undefined. И в конфигураторе 1С-сервера остановки в операторе return «Привет» функции SalutBoys получить не удается. Я распечатал файл публикации …PrivetBoys.1cws?wsdl, еще раз сверил все используемые имена интерфейса, точки входа и функции, все совпадает, через прокси из 1С все работает, из браузера не хочет. Текст файла публикации: <?xml version="1.0" encoding="UTF-8" ?> - <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12bind="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soapbind="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.sample-package.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd1="http://www.sample-package.org" name="PrivetBoys1" targetNamespace="http://www.sample-package.org"> - <types> - <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xs1="http://www.sample-package.org" targetNamespace="http://www.sample-package.org" elementFormDefault="qualified"> - <xs:element name="SalutBoys"> - <xs:complexType> <xs:sequence /> </xs:complexType> </xs:element> - <xs:element name="SalutBoysResponse"> - <xs:complexType> - <xs:sequence> <xs:element name="return" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </types> - <message name="SalutBoysRequestMessage"> <part name="parameters" element="tns:SalutBoys" /> </message> - <message name="SalutBoysResponseMessage"> <part name="parameters" element="tns:SalutBoysResponse" /> </message> - <portType name="PrivetBoys1PortType"> - <operation name="SalutBoys"> Файл публикации WEB-сервиса PrivetBoys1.1ces?wsdl <input message="tns:SalutBoysRequestMessage" /> <output message="tns:SalutBoysResponseMessage" /> </operation> </portType> - <binding name="PrivetBoys1SoapBinding" type="tns:PrivetBoys1PortType"> <soapbind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> - <operation name="SalutBoys"> <soapbind:operation style="document" soapAction="http://www.sample-package.org#PrivetBoys1:SalutBoys" /> - <input> <soapbind:body use="literal" /> </input> - <output> <soapbind:body use="literal" /> </output> </operation> </binding> - <binding name="PrivetBoys1Soap12Binding" type="tns:PrivetBoys1PortType"> <soap12bind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> - <operation name="SalutBoys"> <soap12bind:operation style="document" soapAction="http://www.sample-package.org#PrivetBoys1:SalutBoys" /> - <input> <soap12bind:body use="literal" /> </input> - <output> <soap12bind:body use="literal" /> </output> </operation> </binding> - <service name="PrivetBoys1"> - <port name="PrivetBoys1Soap" binding="tns:PrivetBoys1SoapBinding"> - <documentation> <wsi:Claim xmlns:wsi="http://ws-i.org/schemas/conformanceClaim/" conformsTo="http://ws-i.org/profiles/basic/1.1" /> </documentation> <soapbind:address location="http://localhost/WebServicesDemo/ws/PrivetBoys1.1cws" /> </port> - <port name="PrivetBoys1Soap12" binding="tns:PrivetBoys1Soap12Binding"> <soap12bind:address location="http://localhost/WebServicesDemo/ws/PrivetBoys1.1cws" /> </port> </service> </definitions> Текст файла Privet.htm: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Здоровеньки булы</title> <script type="text/javascript" src='privet.js'> </script> <body> <p> <input id="MyButton" type="button" onclick="ПриветствоватьВебСервис()" value="Поприветствовать web сервис"/> </p> <p id="ОтветСервера"></p> </body> </html> Текст файла Privet.js: /* * Демо скрипт по доступу к web севису 1С из браузера * Copyright (c) 2008, Юрий Ляшко, [email protected] * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * Date: 2008-06-29 */ // функция определяет тип браузера и устанавливает одно из свойств переменной browser в Истина function определитьБраузер(){ var userAgent = navigator.userAgent.toLowerCase(); // Определим используемый браузер browser = { version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1], safari: /webkit/.test( userAgent ), opera: /opera/.test( userAgent ), msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ), firefox3: /firefox\/3/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ), firefox2: /firefox\/2/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ), firefox1: /firefox\/1/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) } } // Для разных браузеров пользуются разные пути получения таких объектов, поэтому пользуем попытку/исключение. // возвращает объект, который может соединяться с сервером. function getXmlHttp(){ var xmlhttp; try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest(); } return xmlhttp; } // функция возвращает строку в неизменном виде для всех браузеров, кроме ИЕ. Для ИЕ FF версии 3.0 добавляет "m:". function ИЕ(стр){ if (browser.msie || browser.firefox3) return "m:" + стр else return стр } // Функция вызывается по мере готовности ответа от сервера function ПриОтветеВебСервиса(xmlhttp){ if (xmlhttp.readyState == 4) {// когда ответ готов. if(xmlhttp.status != 200) {// Если всё плохо - скажем об этом alert("Запрос завершился неудачно. Ответ сервера: " + xmlhttp.responseText) } else{/*собственно за следующие три строки мы и боролись. Получили ответ сервера и выводим его, ответ, на страницу. Работа с javaScript описана в соответствующих учебниках. Напрмер в http://javaScript.ru Нам интересно только то что ответ сервера находится в свойстве responseXML объекта xmlhttp responseXML - объект типа DOM*/ var ДомОтвет = xmlhttp.responseXML.getElementsByTagName(ИЕ("return"))[0] // "m:return" - для IE, "return" - для FF var ДанныеОтвета = ДомОтвет.childNodes[0].data document.getElementById("ОтветСервера").appendChild(document.createTextNode(ДанныеОтвета)) } // Когда сервер ответил можно включить кнопочку. document.getElementById("MyButton").value = "Поприветствовать web сервис" document.getElementById("MyButton").disabled = false } } // функция вызывается по нажатию кнопки на страничке. С неё всё и начинается function ПриветствоватьВебСервис(){ определитьБраузер() var xmlhttp = getXmlHttp() // создаём соединение типа POST, второй параметр - адрес, параметр true значит асинхронное, то есть браузер не бедет ждать ответа сервера, а продолжит работу xmlhttp.open('POST', 'http://localhost/WebServicesDemo/ws/PrivetBoys1.1cws?wsdl', true); // xmlhttp.open('POST', 'http://gsi12/gsi2000.ru:80/WebServicesDemo/ws/salut.1cws?wsdl', true) // Скажем что делать когда придёт ответ - вызвать функцию ПриОтветеВебСервиса() xmlhttp.onreadystatechange = function() {ПриОтветеВебСервиса(xmlhttp)} // Отправим своё приветствие веб сервису в виде XML. xmlhttp.send('<?xml version="1.0" encoding="UTF-8"?>' + '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+ // <soap:Header/>' + // '<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope/"> <soap:Header/>' + // '<soap:Envelope xmlns:soap="http://www.sample-package.org/soap-envelope/"> <soap:Header/>' + '<soap:Body> <m:SalutBoys xmlns:m="http://www.sample-package.org"/> </soap:Body>' + '</soap:Envelope>') // Напишем на кнопке чего мы ждём, а то пользователи они такие. Понатыкают на кнопку а потом удивляются. document.getElementById("MyButton").value = "Ждём ответа..." document.getElementById("MyButton").disabled = true } Хотелось бы понять, почему обращение из Браузера не проходит, тогда как из другого экземпляра 1С все ОК. |
|||
1
Лефмихалыч
14.02.13
✎
17:32
|
(0) удачи в поисках того, кто станет это читать и искать, где у тебя там вопрос написан
|
|||
2
Stim
14.02.13
✎
17:38
|
Ошибка в третьей строке
|
|||
3
tan76
14.02.13
✎
17:41
|
(0) вот программа, которая, надеюсь, поможет отладить....
http://www.fiddler2.com/fiddler2/ |
|||
4
Evpatiy
14.02.13
✎
17:43
|
(0) Опишите проблему подробнее, пожалуйста. Желательно со скриншотами.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |