Альтернатива Mssoap По Работе С Веб-сервисом

Kizarek86

Lotus team
20.07.2007
864
4
#1
Доброго дня.

Подтолкните куда смотреть.

Есть доминошный веб сервис, надо с ним "пообщатся", MSSOAP - отваливается т.к. не работает на win server 2008.

Идеальная схема через LS агент.
 

Dragon108

Well-known member
19.01.2010
265
0
#3
Доброго дня.

Подтолкните куда смотреть.

Есть доминошный веб сервис, надо с ним "пообщатся", MSSOAP - отваливается т.к. не работает на win server 2008.

Идеальная схема через LS агент.
Работайте через Web Services Consumers.
 

Kizarek86

Lotus team
20.07.2007
864
4
#5
Есть веб сервис, например с таким кодом (взято из примера, где работа идет с SOAP)
Код:
'Declare global variables accessible from all parts of this Web service.
Dim session As NotesSession
Dim nabdb As NotesDatabase
Dim nabdoc As NotesDocument
Dim nabview As NotesView
Dim item As NotesItem

'Create a LotusScript class. 
Class GetPersonInfo
'Sub New can be used to assign values to global 
'variables. Here we can set our session object.
Sub New
Set session = New NotesSession
End Sub
'GetPhoneNumber accepts name of a person as function argument. 
'We set output type to data type String.
Public Function GetPhoneNumber(personname As String) As String
' If person's document is not already found in previous actions, find it now
If nabdoc Is Nothing Then
'Locate a document using our search function
result=GetPersonDocument(personname)
End If
If result<>"OK" Then
'If no person document is found, return the error message
'we got from the GetPersonDocument function
GetPhoneNumber="ERROR: "+result
Exit Function
Else
'If person document is found, return content of OfficePhoneNumber field
'We use our GetPersonField reusable function for getting field’s content
GetPhoneNumber=GetPersonField("OfficePhoneNumber")
End If
End Function

Public Function GetEmailAddress(personname As String) As String
If nabdoc Is Nothing Then
' If person's document is not already found in previous actions, find it now
result=GetPersonDocument(personname) 
End If
If result<>"OK" Then
'If no person document is found, return the error message
'we got from the GetPersonDocument function
GetEmailAddress="ERROR: "+result
Exit Function
Else
'If person document is found, return content of MailAddress field
'We use our reusable function for getting field’s content
GetEmailAddress=GetPersonField("MailAddress")
End If
End Function

End Class

Private Function GetPersonDocument(personname As String) As String
Set nabdb=session.CurrentDatabase
'Set nabdb=New NotesDatabase("","names.nsf")

' Check that database exists and was opened	
If Not (nabdb.IsOpen) Then
GetPersonDocument= "Error opening database"
Exit Function
End If

Set nabview = nabdb.GetView("($Users)")
'Check that view exists in the database
If nabview Is Nothing Then
GetPersonDocument = "Error opening view"
Exit Function
End If

'Get a document by search key
Set nabdoc = nabview.GetDocumentByKey(personname, True)
If nabdoc Is Nothing Then
GetPersonDocument = "Cannot find person"
Exit Function
End If
' global nabdoc object was set correctly and we can return OK
GetPersonDocument="OK"
End Function

Private Function GetPersonField(FieldName As String)
'Get item object. Global object nabdoc was set earlier in GetPersonDocument function.
Set item=nabdoc.GetFirstItem(FieldName)

'Sometimes item does not exist in the document, it’s not an error so we return an empty string.
If item Is Nothing Then
GetPersonField=""
Exit Function
Else
'Return first value of the item
GetPersonField=Cstr(item.Values(0))
End If
End Function
По SOAP все просто, вызываем через него функции веб-сервиса, получаем данные.
Код:
Set Client =CreateObject("MSSOAP.SoapClient30")
Call Client.mssoapinit ("http://сервак/база/SimpleLSServiceNAB?wsdl")
result = Client.GetPhoneNumber(personname)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#6
По SOAP все просто, вызываем через него функции веб-сервиса, получаем данные.


Set Client =CreateObject("MSSOAP.SoapClient30")
Call Client.mssoapinit ("http://сервак/база/SimpleLSServiceNAB?wsdl")
result = Client.GetPhoneNumber(personname)
так же и в бридже - см. в конце кода
 

Kizarek86

Lotus team
20.07.2007
864
4
#7
lmike
чето я туплю, не вижу там примера.
если не трудно под "SimpleLSServiceNAB" пример вызова?

в примере код для Java библиотеки как я понял, причем там веб-сервис не совсем понятно...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#8
Код:
'** everything we'll need to access our Java classes
Dim jSession As New JavaSession
Dim jClass As JavaClass
Dim jObject As JavaObject

'** get the IGWebservice class and instantiate an instance of it
Set jClass = jSession.GetClass("ECWebservice")

'** version of CreateObject and init with path to WSDL)
Set jObject = jClass.CreateObject("(Ljava/lang/String;)V", connection)
jObject.SetContentType(contentType)
'** send message and get result: true/false, if true then we got result
If jObject.send(xmldata) Then
me.responce = jObject.GetResponce()
 

Kizarek86

Lotus team
20.07.2007
864
4
#9
lmike
Этот кусок кода я видел, не понимаю как он применим в указанном мной примере.
 

dimat

Lotus team
31.07.2008
516
0
#10
kizarek, а почему не рассматриваете вариант как сказал Dragon108 ?
По моему так проще всего сделать
 

Kizarek86

Lotus team
20.07.2007
864
4
#11
Хотелось уж с этим разобраться)
Щас попробую через Web Services Consumers.
 

Kizarek86

Lotus team
20.07.2007
864
4
#12
С эти тоже траблы)
Курю этот мануал www.ibm.com/developerworks/ru/library/domino-webservices/
Скачал axis (http://www.sai.msu.su/apache/ws/axis/1_4/)
Как добавить библиотеки из него в lotus?)
 

dimat

Lotus team
31.07.2008
516
0
#13
kizarek Создаешь Web Service Consumer импортиоруешь в него WSDL (http://сервак/база/SimpleLSServiceNAB?wsdl), в нем появятся описание классов, сохраняешь.
В агенте добавляешь use "Имя Web Service Consumer" и используешь в нем описанные классы из Web Service Consumer
 

garrick

Lotus team
26.10.2009
894
61
#14
Создайте в дизайнере новый Web Services Consumer, укажите ему wsdl файл сервиса, либо локально как файл, либо через url. Дизайнер сам сгенерит вам код вызова процедур сервиса на Lotus Script или Java. Затем в своём коде подключите этот сгенерённый Web Services Consumer в качестве библиотеки и пользуйтесь сгенерёнными процедурами. Если планируете использовать Lotus Script, могут быть проблемы с типами данных. Проблемы решаемы... Никакой axis скачивать никуда не надо, в лотусе уже всё есть.
 

dimat

Lotus team
31.07.2008
516
0
#17
kizarek
Если у Вас клиент семерка, там вроде нет разделения на Consumer и Provider, там просто Web service
 

Kizarek86

Lotus team
20.07.2007
864
4
#18
8.0.2
я правильно понимаю что нужно:
1. Создаем веб-сервис. Пример выше "SimpleLSServiceNAB".
2. Сохраняем его как SimpleLSServiceNAB.wsdl
3. Создаем еще 1 веб-сервис (SimpleLSServiceNAB_NEW), импортим в него wsdl, получаем такой код:
Код:
%INCLUDE "lsxsd.lss"
Class GetPersonInfo

Sub NEW
End Sub

Function GETPHONENUMBER(PERSONNAME As String) As String
End Function

Function GETEMAILADDRESS(PERSONNAME As String) As String
End Function

End Class
4. Теперь подключаем его как библиотеку?
 

Dragon108

Well-known member
19.01.2010
265
0
#19
8.0.2
я правильно понимаю что нужно:
1. Создаем веб-сервис. Пример выше "SimpleLSServiceNAB".
2. Сохраняем его как SimpleLSServiceNAB.wsdl
3. Создаем еще 1 веб-сервис (SimpleLSServiceNAB_NEW), импортим в него wsdl, получаем такой код:
Код:
%INCLUDE "lsxsd.lss"
Class GetPersonInfo

Sub NEW
End Sub

Function GETPHONENUMBER(PERSONNAME As String) As String
End Function

Function GETEMAILADDRESS(PERSONNAME As String) As String
End Function

End Class
4. Теперь подключаем его как библиотеку?
Да, все так.
Но при таком подходе есть и минус - при каждом изменении web-сервиса, чью wsdl вы импортите (в данном примере это веб-сервис SimpleLSServiceNAB и его SimpleLSServiceNAB.wsdl) придется скорее всего заново импотрить эту wsdl в web service consumer (здесь - SimpleLSServiceNAB_NEW). (но может и будет работать, если изменения в сервисе SimpleLSServiceNAB не серьезные :) ) И не факт что сложные и нестандартные лотусовые типы, которые есть в wsdl, распарсятся вам в типы, методы и классы так же, как и в предыдущий раз - тупо может просто поменяться их префикс :( С MSSOAP конечно в этом плане попроще, но зато Web Service consumer работает как часы, а не через пень колоду


Вот была тема: ссылка
 

Kizarek86

Lotus team
20.07.2007
864
4
#20
веб-сервис как библиотеку лотус не дает объявить. может таки как consumer нужно делать библиотеку?

Добавлено: Если объявлять как библиотеку то такой код
Код:
Use "SimpleLSServiceNAB_NEW"
Sub Initialize
Dim PersonInfo As New GetPersonInfo
Print PersonInfo.GETEMAILADDRESS("James Bond")
End Sub
выдет ошибку
Код:
4746-Web Service GetPersonInfo method GETEMAILADDRESS error org.xml.sax.SAXException: Processing instructions are not allowed within SOAP messages