Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > Взаимодействие 1c V8.1 с Java WS (SOAP)


Автор: Vasay 8.9.2010, 16:21
Всем привет.

Вот хочу подружить 1с-ку с Java Web-сервисом.


Попытка 1. axis 2

создал веб-сервис

Код написан на Groovy (Grails + axis 2):
Код

package ru.vasay.orderinfo

import ru.vasay.orderinfo.view.*
import javax.jws.*

class SoapService {
    
    static expose=['axis2']
    

    UserView[] getUsersForSync (@WebParam(name="onlyNew") String onlyNew){
        onlyNew = onlyNew + " !!" // просто проверка того что пришло
        List users = []
        def userList = User.list() // Выгружает всех пользователей из БД с помощью GORM.  
        
                            // Цикл по всем пользователям
        userList.each(){ 
            def user = new UserView()

            
            user.setEmail(it.email)
            user.setUsername(it.username)
            user.setName(it.name)
            user.setPhone(it.phone)
            user.setAdresse(it.adresse)
            user.setLink1c(it.link1c)
            user.setEnabled(it.enabled)
            user.setAccountLocked(it.accountLocked)

            users << user // добавляем объект в коллекцию
             
        }
                            users as UserView[]  // преобразовывает List в массив и возвращает результат (return в Groovy можно упустить)
        
    }
    
}



getUsersForSync получает строку (просто для проверки - дошла или нет), возвращает массив UserView - код ниже:

Код

package ru.vasay.orderinfo.view

import javax.xml.bind.annotation.*

@XmlAccessorType(XmlAccessType.FIELD)
class UserView {
    String username
    String email
    String name
    String phone
    String adresse
    String link1c
    boolean enabled
    boolean accountLocked

}



Генерится огромный WSDL см. приложенный файл

При попытке в 1с создать ссылку - получаю ошибку:

Цитата

Несоответствие типов XDTO
по причине:
Ошибка проверки данных XDTO:
Значение: 'this$dist$get$2' не соответствует простому типу: {http://www.w3.org/2001/XMLSchema}NCName
Значение не соответствует образцу




ок. Поменял axis2 на CXF..............

Автор: Vasay 8.9.2010, 16:50
........................... продолжение:

код сервиса чуток поменялся (стр 8 и 11).  Также добавил простой метод для myTest эксперемента

Код

package ru.vasay.orderinfo

import ru.vasay.orderinfo.view.*
import javax.jws.*

class SoapService {
    
    static expose=['cxf']
    

    UserView[] getUsersForSync (String onlyNew){
        onlyNew = onlyNew + " !!"
        List users = []
        def userList = User.list()
        
        userList.each(){
            def user = new UserView()

            
            user.setEmail(it.email)
            user.setUsername(it.username)
            user.setName(it.name)
            user.setPhone(it.phone)
            user.setAdresse(it.adresse)
            user.setLink1c(it.link1c)
            user.setEnabled(it.enabled)
            user.setAccountLocked(it.accountLocked)
            users << user
            
        }
        UserView[] toReturn = users as UserView[]
        return toReturn
        
    }


    // простой метод для эксперемента
    String myTest(String str){
        str+" new string русский"
    }
    
}


Сгенеренный WSDL поменьше (смотри прикрепленный файл) и !!!Главное!!! в 1с создалась ссылка:

http://fotomir.info/share-241D_4C879AD1.html



Сначала попробовл с простым методом myTest - и, о чудо, он заработал.

Код

    СервисOrderInfo=WSСсылки.WSСсылка1.СоздатьWSПрокси("http://orderinfo.vasay.ru/", "SoapServiceService", "SoapServicePort" );
    ТестоваяСтрока = СервисOrderInfo.myTest("тест");
    Лог = Лог + ТестоваяСтрока+Символы.ПС;

 

В логе появилось: "тест new string русский"


А вот  getUsersForSync заставить работать у меня не получилось.................................... (продолжение следует)

Автор: Vasay 8.9.2010, 17:05
................... пробовал различные варианты кода.

Вот один, например:

Код

    ПроксиOrderInfo=WSСсылки.WSСсылка1.СоздатьWSПрокси("http://orderinfo.vasay.ru/", "SoapService", "SoapServicePort" );
    
    Фабрика = ПроксиOrderInfo.ФабрикаXDTO;
    

    ТипGetUsersForSync            = Фабрика.Тип("http://orderinfo.vasay.ru/","getUsersForSync");
    ТипGetUsersForSyncResponse    = Фабрика.Тип("http://orderinfo.vasay.ru/", "getUsersForSyncResponse");
    
    ПараметрыСервиса            = Фабрика.Создать(ТипGetUsersForSync);
    ПараметрыСервиса.onlyNew        = "Бла бла бла";
    
    ОтветСервиса                = Фабрика.Создать(ТипGetUsersForSyncResponse);
    
    ОтветСервиса                = ПроксиOrderInfo.getUsersForSync(ПараметрыСервиса);



В отладчике WEB-сервиса видно, что метод getUsersForSync вызывается, но строка onlyNew - null, вместо "Бла бла бла"

а 1с выдает ошибку: 
Цитата

{Обработка.СинхронизацияПользователейСайта.Форма.Форма(90)}: Ошибка при вызове метода контекста (getUsersForSync): Ошибка вызова операции сервиса:  {http://orderinfo.vasay.ru/}:SoapService:getUsersForSync()
    ОтветСервиса    = ПроксиOrderInfo.getUsersForSync(ПараметрыСервиса);
по причине:
Ошибка вызова операции сервиса:  {http://orderinfo.vasay.ru/}:SoapService:getUsersForSync()
по причине:
Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://orderinfo.vasay.ru/}getUsersForSyncResponse - [1,158]
Проверка дополнительного свойства:
    форма: Элемент
    имя: return
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://orderinfo.vasay.ru/}getUsersForSyncResponse - [1,158]
Проверка дополнительного свойства:
    форма: Элемент
    имя: return
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://orderinfo.vasay.ru/}getUsersForSyncResponse





Вот такие вот дела.

п.с. свою проблему решил POST - запросом. Но хотелось бы добить web-сервисы, если это возможно.

Добавлено через 5 минут и 54 секунды
Ссылки по теме:

моя ветка на мисте:
http://www.forum.mista.ru/topic.php?id=503565

примеры создания веб-сервисов с помощью Grails
cxf: http://grails.org/plugin/cxf 
axis2: http://grails.org/plugin/axis2 

Темы про 1с и web-сервисы:
Использование внешних web-сервисов в 1С:Предприятие 8: http://www.forum.mista.ru/topic.php?id=383089
http://www.forum.mista.ru/topic.php?id=383089
В продолжение темы "Web-сервисы пример аэрофлот" : http://www.forum.mista.ru/topic.php?id=407069

Автор: Vasay 8.9.2010, 18:44
Поигрался с eclipse Web Service Explorer

Вот что получается:

SOAP Request Envelope
Код

- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://orderinfo.vasay.ru/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
- <q0:getUsersForSync>
  <onlyNew>qqqqq</onlyNew> 
  </q0:getUsersForSync>
  </soapenv:Body>
  </soapenv:Envelope>


SOAP Response Envelope: 
Код

- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
- <soap:Body>
- <ns1:getUsersForSyncResponse xmlns:ns1="http://orderinfo.vasay.ru/">
- <return>
   <username>MyUserName</username> 
  <email>qaz@xsw.rf</email> 
  <enabled>true</enabled> 
  <accountLocked>false</accountLocked> 
  </return>
  </ns1:getUsersForSyncResponse>
  </soap:Body>
  </soap:Envelope>


что-то не все данные в XML-е. Нет полей, которые NULL

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)