|
вебСервис | ☑ | ||
---|---|---|---|---|
0
obscured
09.10.13
✎
11:37
|
Добрый день.
На этом форуме полгода назад была тема про проблему с веб-сервисом: v8: ВебСервис Я разработчик серверной стороны, но ни черта не шарю в 1С. Проблема все еще актуальна, к сожалению про эту тему не знал. Итак, имеем веб-сервис, WSDL можно получить например здесь: http://demo.omnicomm.ru:8282/AnalyticalServer/ws?wsdl Имеем проблему с авторизацией через 1С: {Обработка.Omnicomm.Форма.Форма.Форма(65)}: Ошибка при вызове метода контекста (signIn) id=Прокси.signIn(Логин, Пароль); по причине: Ошибка вызова операции сервиса: {http://omnicomm.ru/analyticalserver}:AnalyticalServer:signIn() по причине: Неизвестная ошибка. Ошибка преобразования данных XDTO: Чтение объекта типа: {http://omnicomm.ru/analyticalserver}authResponseEntry - [1,148] Проверка дополнительного свойства: форма: Элемент имя: error по причине: Ошибка преобразования данных XDTO: Чтение объекта типа: {http://omnicomm.ru/analyticalserver}authResponseEntry - [1,148] Проверка дополнительного свойства: форма: Элемент имя: error по причине: Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {http://omnicomm.ru/analyticalserver}authResponseEntry Сам authResponseEntry описан в WSDL куском: <xs:complexType abstract="true" name="baseResponseEntry"> <xs:sequence> <xs:element minOccurs="0" name="error" type="xs:string"/> <xs:element minOccurs="0" name="status" type="xs:boolean"/> </xs:sequence> </xs:complexType> <xs:complexType name="authResponseEntry"> <xs:complexContent> <xs:extension base="tns:baseResponseEntry"> <xs:sequence> <xs:element minOccurs="0" name="dateTimeEnd" type="xs:long"/> <xs:element minOccurs="0" name="sessionId" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> Фактически веб-сервис возвращает (если подключиться Python'ом): При ошибке: (authResponseEntry){ error = "Signing in failed" status = False } При правильном логине (authResponseEntry){ status = True dateTimeEnd = 1381301939 sessionId = "1c2f83036ce1dd1bd6fc3090016494e440f702c9" } Вопрос - что нужно изменить в WSDL, чтобы 1С нормально работал с этим сервисом? |
|||
1
Serginio1
09.10.13
✎
11:51
|
Добавь
Убери <xs:extension base="tns:baseResponseEntry"> и добавь <xs:element minOccurs="0" name="error" type="xs:string"/> <xs:element minOccurs="0" name="status" type="xs:boolean"/> |
|||
2
obscured
09.10.13
✎
11:57
|
А extension 1С в принципе не умеет понимать?
Видимо, придется переделывать, хотя это не самый приятный вариант - WSDL у нас генерируется, придется все классы переписывать (от baseResponseEntry наследуются все сервисы)... |
|||
3
Serginio1
09.10.13
✎
12:00
|
(2) не знаю попробуй. Какая платформа 1С стоит?
|
|||
4
Serginio1
09.10.13
✎
12:06
|
Или попробовать сделать authResponseEntry открытым
|
|||
5
Serginio1
09.10.13
✎
12:10
|
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence> <xs:anyAttribute namespace="##any" processContents="lax"/> |
|||
6
Serginio1
09.10.13
✎
12:35
|
Или попробуй сделать baseResponseEntry открытым
|
|||
7
obscured
09.10.13
✎
14:44
|
Спасибо, попробуем оба варианта.
А как в 1С указать адрес веб-сервиса, если WSDL загружается не по ссылке, а из файла? Хотели попробовать с быстро поправленным файлом проверить, но непонятно, где тогда задавать URL. WSDL генерируется сервером, и быстро поправить код не получится, т.к. проект, ресурсы, бюрократия... |
|||
8
obscured
09.10.13
✎
14:44
|
Да, платформа 8.2.
|
|||
9
Serginio1
09.10.13
✎
14:48
|
А в wsdl файле есть секция
<wsdl:service name="AnalyticalServer"> <wsdl:port binding="tns:AnalyticalServerSoapBinding" name="AnalyticalServerPort"> <soap:address location="http://demo.omnicomm.ru:8282/AnalyticalServer/ws"/> </wsdl:port> </wsdl:service> откуда она и берет реальный адрес |
|||
10
obscured
09.10.13
✎
14:50
|
Спасибо!
|
|||
11
Serginio1
09.10.13
✎
14:51
|
По сути подключение по дефолту выглядит так
ОпределениеТ=Новый WSОпределения(ИмяФайла_wsdl); WSСервис=ОпределениеТ.Сервисы[0]; прокси=Новый WSПрокси(ОпределениеТ, WSСервис.URIПространстваИмен, WSСервис.Имя, WSСервис.ТочкиПодключения[0].Имя); |
|||
12
obscured
09.10.13
✎
15:07
|
Похоже нашли ошибку у себя в веб-сервисе.
В WSDL-файле описан ответ authResponseEntry. По факту - сервер возвращает: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:signInResponse xmlns:ns1="http://omnicomm.ru/analyticalserver"> <return> <status>true</status> <dateTimeEnd>1381311439</dateTimeEnd> <sessionId>c05f07617a6942d6ed28edf3867c165dfe4b4b86</sessionId> </return> </ns1:signInResponse> </soap:Body> </soap:Envelope> Т.е. вместо authResponseEntry - приходит signInResponse. Может ли быть с этим связано? В других языках (например - в Python с модулем suds) на работоспособность это не влияет, и signInResponse нигде даже не отображается - поэтому не могли долго найти ошибку, пока wireshark'ом не покопались. |
|||
13
Serginio1
09.10.13
✎
15:11
|
Только в описании ошибки совсем другое.
|
|||
14
obscured
09.10.13
✎
15:14
|
Тогда хз, попробуем все варианты - отпишусь.
|
|||
15
Serginio1
09.10.13
✎
15:16
|
Или подкорректируйте WSDL файл что бы возвращала signInResponse или anyType
|
|||
16
Serginio1
09.10.13
✎
15:26
|
Хотя в описании
<wsdl:operation name="signIn"> <wsdl:input message="tns:signIn" name="signIn"> </wsdl:input> <wsdl:output message="tns:signInResponse" name="signInResponse"> </wsdl:output> </wsdl:operation> Он на самом деле оборачивает в нужную форму ответ. |
|||
17
Serginio1
09.10.13
✎
15:27
|
Это нормальное поведение. 1С тоже оборачивает ответ и параметры в структуру
<xs:element name="HelloResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> |
|||
18
Serginio1
09.10.13
✎
15:29
|
<xs:element name="signInResponse" type="tns:signInResponse"/>
<xs:complexType name="signInResponse"> <xs:sequence> <xs:element name="return" type="tns:authResponseEntry"/> </xs:sequence> </xs:complexType> |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |