![]() |
![]() |
|
Помощь с Web сервисом | ☑ | ||
---|---|---|---|---|
0
Bloood
11.12.13
✎
14:52
|
Всем доброго времени суток.
Помогите, пожалуйста, найти ошибку в wsdl файле. Есть веб сервис https://api-iz.merlion.ru/v2/mlservice.php?wsdl=dl При создании ws ссылки. 1С ка падает с ошибкой "Неверный формат" Через soapui все работает нормально. Все методы определяются. Заранее спасибо. |
|||
1
kiruha
11.12.13
✎
14:59
|
||||
2
Bloood
11.12.13
✎
15:07
|
Если написать
https://api-iz.merlion.ru/v2/mlservice.php?wsdl То будет формат wsdl - rpc/encoded. И в нем вообще не описаны входные и выходные схемы методов. https://api-iz.merlion.ru/v2/mlservice.php?wsdl=dl используется формат document/literal. Все веб серверы созданные на 1С используют именно этот формат. Возникает вопрос. Что именно не нравиться 1Ске в первой wsdlке? |
|||
3
kiruha
11.12.13
✎
15:09
|
Вообще у 1С много ограничений по работе с внешними веб сервисами - например авторизация только Basic и т.п.
Я в таких случаях использую HTTP = Новый COMОбъект("MSXML2.XMLHTTP") |
|||
4
Bloood
11.12.13
✎
15:15
|
Используя COM обьект и MSSOAPtolkit удалось получить данные с веб сервиса. Хочется использовать стандартные средства 1С.
Может быть есть у кого нибудь документация по созданию WSDL именно для 1С? |
|||
5
Serginio1
11.12.13
✎
15:29
|
v8: HTTPS соединение (сертификаты) - порядок конвертации
Можешь сохранить файл WSDL и попробовать подключиться через ОпределениеТ=Новый WSОпределения(Файл_wsdl); WSСервис=ОпределениеТ.Сервисы[0]; прокси=Новый WSПрокси(ОпределениеТ, WSСервис.URIПространстваИмен, WSСервис.Имя, WSСервис.ТочкиПодключения[0].Имя); |
|||
6
Serginio1
11.12.13
✎
15:33
|
||||
7
kiruha
11.12.13
✎
15:34
|
Он не признает wsdl ))
|
|||
8
Bloood
11.12.13
✎
15:41
|
Так подключался.
Определение = Новый WSОпределения("C:\WSDL\dl.wsdl"); Сервис = Определение.Сервисы[0]; ТочкаПодключения = Сервис.ТочкиПодключения[0]; Прокси = Новый WSПрокси(Определение, Сервис.URIПространстваИмен, Сервис.имя, ТочкаПодключения.Имя); Прокси.Пользователь ="xxx"; Прокси.Пароль ="xxx"; Самое интересное, что данным методом подгружается фабрика XDTO в которой описаны все комплексные типы данных и описаны вход и исход. сообщения. Но при вызове. Прокси.getCatalog("ALL") выскакивает ошибка "Метод не обнаружен". Тут проблема не в сертификатах. Это 100%. Тут проблема в что 1ска некорректно считывает методы, описанные в WSDL. |
|||
9
Apokalipsec
11.12.13
✎
15:43
|
а отладчик что говорит?
|
|||
10
SUA
11.12.13
✎
15:47
|
POST запросом еще можно, типовым методом если хоть и через ж
|
|||
11
Bloood
11.12.13
✎
15:49
|
Отладчик пишет "Метод объекта не обнаружен (getCatalog)"
|
|||
12
Bloood
11.12.13
✎
16:07
|
Создал свой веб сервис в 1С. Метод возвращает комплексный тип данных(массив), который состоит из простых типов.
На первый взгляд структура wsdl одинакова. Но почему одну wsdl ку 1с ка открывает, а другую нет. Ниже 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.URI.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd1="http://www.URI.com" xmlns:xsd2="https://api-iz.merlion.ru/v2/mlservice.php" name="Web" targetNamespace="http://www.URI.com"> <types> <xs:schema xmlns:tns="https://api-iz.merlion.ru/v2/mlservice.php" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://api-iz.merlion.ru/v2/mlservice.php" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:complexType name="ArrayOfCatalogResult"> <xs:sequence> <xs:element name="item" type="tns:CatalogResult" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="CatalogResult"> <xs:sequence> <xs:element name="Код"/> <xs:element name="Наименование"/> </xs:sequence> </xs:complexType> </xs:schema> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xs1="https://api-iz.merlion.ru/v2/mlservice.php" xmlns:xs2="http://www.URI.com" targetNamespace="http://www.URI.com" elementFormDefault="qualified"> <xs:import namespace="https://api-iz.merlion.ru/v2/mlservice.php"/> <xs:element name="Obmen"> <xs:complexType> <xs:sequence/> </xs:complexType> </xs:element> <xs:element name="ObmenResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" type="xsd2:ArrayOfCatalogResult"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </types> <message name="ObmenRequestMessage"> <part name="parameters" element="tns:Obmen"/> </message> <message name="ObmenResponseMessage"> <part name="parameters" element="tns:ObmenResponse"/> </message> <portType name="WebPortType"> <operation name="Obmen"> <input message="tns:ObmenRequestMessage"/> <output message="tns:ObmenResponseMessage"/> </operation> </portType> <binding name="WebSoapBinding" type="tns:WebPortType"> <soapbind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="Obmen"> <soapbind:operation style="document" soapAction="http://www.URI.com#Web:Obmen"/> <input> <soapbind:body use="literal"/> </input> <output> <soapbind:body use="literal"/> </output> </operation> </binding> <binding name="WebSoap12Binding" type="tns:WebPortType"> <soap12bind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="Obmen"> <soap12bind:operation style="document" soapAction="http://www.URI.com#Web:Obmen"/> <input> <soap12bind:body use="literal"/> </input> <output> <soap12bind:body use="literal"/> </output> </operation> </binding> <service name="Web"> <port name="WebSoap" binding="tns:WebSoapBinding"> <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://192.168.31.170/API/ws/Web"/> </port> <port name="WebSoap12" binding="tns:WebSoap12Binding"> <soap12bind:address location="http://192.168.31.170/API/ws/Web"/> </port> </service> </definitions> |
|||
13
Serginio1
11.12.13
✎
16:17
|
||||
14
Bloood
11.12.13
✎
16:27
|
(13) Как именно проверить подключение? Если просто вставить в браузер, эту адскую ссылку)). То все норм. Авторизацию прохожу.
|
|||
15
Serginio1
11.12.13
✎
16:38
|
Не разобрал он wsdl
прокси.ТочкаПодключения.Интерфейс.Операции пустой |
|||
16
Serginio1
11.12.13
✎
16:40
|
Попрбуй подсунуть свой WSDL только в секции
-<service name="MLService">-<port name="MLPort" binding="tns:MLBinding"><soap:address location="https://api-iz.merlion.ru/v2/mlservice.php?style=dl"/></port></service> укжи этот адрес |
|||
17
Serginio1
11.12.13
✎
16:44
|
Можешь записать Пакеты из фабрики
Процедура ЗпаисатьПакетыПоФабрике(Фабрика,ИмяФайла) Экспорт Для Каждого Пакет из Фабрика.Пакеты Цикл Если Пакет.URIПространстваИмен = "http://www.w3.org/2001/XMLSchema" Тогда Продолжить; КонецЕсли; НаборСхем = Фабрика.ЭкспортСхемыXML(Пакет.URIПространстваИмен); Для Счетчик = 0 по НаборСхем.Количество() - 1 Цикл Схема = НаборСхем.Получить(Счетчик); Схема.ОбновитьЭлементDOM(); ЗаписьDOM = Новый ЗаписьDOM; ЗаписьXMLСтрока = Новый ЗаписьXML; ЗаписьXMLСтрока.УстановитьСтроку(); ЗаписьXMLФайл = Новый ЗаписьXML; ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXMLСтрока); ЗаписьXMLФайл.ОткрытьФайл(ИмяФайла + "[" + Формат(Счетчик,"ЧЦ=10;ЧГ=0;ЧН=") + "].xsd"); ЗаписьXMLФайл.ЗаписатьБезОбработки(ЗаписьXMLСтрока.Закрыть()); ЗаписьXMLФайл.Закрыть() КонецЦикла; КонецЦикла; КонецПроцедуры |
|||
18
Serginio1
11.12.13
✎
16:45
|
А потом в свой вэб сервис добавляй нужные тебе методы
|
|||
19
Bloood
11.12.13
✎
17:28
|
(16) Адрес поменял. Возникает ошибка при считывании WSDL неверный формат. У меня такое ощущение что ошибка в пространстве имен. Из за этого 1ска и не видит методы.
Кстати, почему то сообщение на форуме перекодировалось в вид http://192.168.31.170/API/ws/Web"/>" target="_blank" rel="nofollow" class="extralink">http://192.168.31.170/API/ws/Web"/>; На самом деле там <service name="Web"> <port name="WebSoap" binding="tns:WebSoapBinding"> <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://192.168.31.170/API/ws/Web"/> </port> <port name="WebSoap12" binding="tns:WebSoap12Binding"> <soap12bind:address location="http://192.168.31.170/API/ws/Web"/> </port> </service> Никаких extralink нет. |
|||
20
Bloood
11.12.13
✎
17:29
|
Опять extralinkи отображаются...
Там просто адрес http://192.168.31.170/API/ws/Web"/> |
|||
21
Serginio1
11.12.13
✎
17:39
|
(19) Это беда этого форума. Но Фабрику то она считывает.
А методы нет. |
|||
22
Serginio1
11.12.13
✎
17:41
|
Попробуй импортировать Пакет выгруженный через 17. А потом дописывать методы и править WSDL на реальный адрес как в 16
так и поймешь в чем проблема |
|||
23
Bloood
11.12.13
✎
17:49
|
(22) Спасибо) Попробую.
Самое интересное если использовать другую WSDL(стиль rpc/encoded) https://api-iz.merlion.ru/v2/mlservice.php?wsdl То методы все подгружаются.... Но в этой wsdl ке нет схем входящих и исходящих запросов.... |
|||
24
Bloood
11.12.13
✎
18:32
|
Ребят, а из за чего может возникать ошибка.
Несоответствие типов XDTO: Свойство является списковым В wsdl ке описан этот тип вот так: <xsd:complexType name="CatalogResult"> <xsd:all> <xsd:element name="ID" type="xsd:string" nillable="true"/> <xsd:element name="ID_PARENT" type="xsd:string" nillable="true"/> <xsd:element name="Description" type="xsd:string" nillable="true"/> </xsd:all> </xsd:complexType> Поменял </xsd:all> на </xs:sequence> ситуация не изменилась((( Заранее всем спасибо. |
|||
25
Bloood
11.12.13
✎
18:34
|
Вот такую xml возвращает сервер
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://api-iz.merlion.ru/v2/mlservice.php?style%3Ddl"> <SOAP-ENV:Body> <ns1:getCatalogResponse> <getCatalogResult> <item> <ID>N10100</ID> <ID_PARENT>N101</ID_PARENT> <Description>Адаптеры и блоки питания</Description> </item> <item> <ID>N10106</ID> <ID_PARENT>N101</ID_PARENT> <Description>Батареи</Description> </item> <item> <ID>N10107</ID> <ID_PARENT>N101</ID_PARENT> <Description>Внешние носители информации</Description> </item> <item> <ID>N10108</ID> <ID_PARENT>N101</ID_PARENT> <Description>Док-станции, порт-репликаторы, стенды</Description> </item> <item> <ID>N10109</ID> <ID_PARENT>N101</ID_PARENT> <Description>Клавиатуры и мыши</Description> </item> <item> <ID>N10110</ID> <ID_PARENT>N101</ID_PARENT> <Description>Комплектующие</Description> </item> <item> <ID>N10111</ID> <ID_PARENT>N101</ID_PARENT> <Description>ПО, лицензии и пакеты расширенной гарантии</Description> </item> <item> <ID>N10115</ID> <ID_PARENT>N101</ID_PARENT> <Description>Подставки</Description> </item> <item> <ID>N10114</ID> <ID_PARENT>N101</ID_PARENT> <Description>Прочее</Description> </item> <item> <ID>N10101</ID> <ID_PARENT>N101</ID_PARENT> <Description>Сумки</Description> </item> <item> <ID>N10112</ID> <ID_PARENT>N101</ID_PARENT> <Description>Устройства безопасности</Description> </item> <item> <ID>N10113</ID> <ID_PARENT>N101</ID_PARENT> <Description>Шнуры, кабели</Description> </item> </getCatalogResult> </ns1:getCatalogResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
|||
26
Bloood
11.12.13
✎
18:37
|
А вот такую xml 1с ка нормально воспринимает
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header/> <soap:Body> <m:ObmenResponse xmlns:m="http://www.URI.com"> <m:return xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <item xmlns="https://api-iz.merlion.ru/v2/mlservice.php"> <Код xsi:type="xs:string">000000001</Код> <Наименование xsi:type="xs:string">Тест1</Наименование> </item> <item xmlns="https://api-iz.merlion.ru/v2/mlservice.php"> <Код xsi:type="xs:string">000000002</Код> <Наименование xsi:type="xs:string">Тест2</Наименование> </item> </m:return> </m:ObmenResponse> </soap:Body> </soap:Envelope> Может быть в 1с ке перед каждым типом нужно обязательно проставлять пространства имен?? |
|||
27
Bloood
12.12.13
✎
11:26
|
У кого нибудь есть идеи, по поводу обязательной простановки пространства имен у типов данных??
|
|||
28
Bloood
12.12.13
✎
14:02
|
Если кому интересно, то wsdl ку удалось исправить.
1с ка падала на строке <operation name="HelloWorld"> <soap:operation soapAction="https://api-iz.merlion.ru/v2/mlservice.php?style=dl#HelloWorld"/> <input> <soap:body use="literal" namespace="https://api-iz.merlion.ru/v2/mlservice.php"/> namespace="https://api-iz.merlion.ru/v2/mlservice.php" удалил везде эту строку. Методы определяются. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |