Posts Tagged: ‘Webservice’

EntwicklerCamp 2015: XPages – WebServices und REST

4. März 2015 Posted by Bernd Hort

EntwicklerCamp

Der letzte Tag des EntwicklerCamps ist gekommen. Heute war mein zweiter Vortrag zum Thema "XPages - WebServices und REST". In 90 Minuten habe ich ausführlich beschrieben, wie Webservices und RESTful Webservices innerhalb von XPages konsumiert werden können. Die erste Hälfte des Vortrages konzentrierte sich auf das Backend mittels Java. In der zweiten Hälfte habe ich den Blick auf JavaScript im Browser gerichtet.

Wie immer können die Folien und die Beispiel-Anwendung heruntergeladen werden. Basis für diesen Vortrag war mein Vortrag auf der IBM ConnectED 2015: BP 108 - Be Open - Use Web Services and REST in XPages Applications. Insofern ist die Beispiel-Anwendung die gleiche wie beim IBM ConnectED-Vortrag.

 

In der Beispiel-Anwendung befinden sich nicht nur XPages, um die Webservices und RESTful Webservices zu konsumieren. Damit die Beispiele auch bei Ihnen ohne Probleme laufen, sind ein Webservice und drei RESTful Webservices implementiert.

EntwicklerCamp 2014: XPages – WebServices und REST

19. März 2014 Posted by Bernd Hort

EntwicklerCamp

Der letzte Tag des EntwicklerCamps ist gekommen. Heute war mein zweiter Vortrag zum Thema "XPages - WebServices und REST". In 90 Minuten habe ich ausführlich beschrieben, wie Webservices und RESTful Webservices innerhalb von XPages konsumiert werden können. Die erste Hälfte des Vortrages konzentrierte sich auf das Backend mittels Java. In der zweiten Hälfte habe ich den Blick auf JavaScript im Browser gerichtet.

Wie immer können die Folien und die Beispiel-Anwendung heruntergeladen werden. Basis für diesen Vortrag war mein Vortrag auf der IBM Connect 2014: BP 206 - Be Open - Use Web Services and REST in XPages Applications. Insofern ist die Beispiel-Anwendung die gleiche wie beim IBM Connect-Vortrag.

 

In der Beispiel-Anwendung befinden sich nicht nur XPages, um die Webservices und RESTful Webservices zu konsumieren. Damit die Beispiele auch bei Ihnen ohne Probleme laufen, sind ein Webservice und drei RESTful Webservices implementiert.

Webservice

Die WSDL-Datei zu dem Webservice kann über
http://{Ihr-Server}/{Datenbank-Pfad}/sessionService?wsdl
erreicht werden.

RESTful Webservice

Um verschiedene Techniken zu zeigen, gibt es insgesamt 3 RESTful Webservices, die alle die XPages Extension Library - OpenNTF benötigen.

Custom Database Servlet

Der erste RESTful Webservice verwendet ein Custom Database Servlet.
http://{Ihr-Server}/{Datenbank-Pfad}/xsp/services/Sessions
CustomDatabaseServlet.png

RESTService Control - xe:viewJsonService

Der zweite RESTful Webservice basiert auf einem viewJsonService.
http://{Ihr-Server}/{Datenbank-Pfad}/extensionlibrary.xsp/sessions
viewJsonService.png

RESTService Control - xe:customRestService

Zu guter Letzt gibt es einen RESTful Webservice als customRestService
http://{Ihr-Server}/{Datenbank-Pfad}/customrestservice.xsp/sessions
http://{Ihr-Server}/{Datenbank-Pfad}/customrestservice.xsp/sessions/BP206
customRestService1.png
customRestService2.png

Problem with Webservice Consumer

22. Februar 2012 Posted by gasteiger

Hallo Lotus-Community,

my problem is as follows:
I have a Webservice-Provider (Java) on a windows-based computer and a Webservice-Consumer (LotusScript) on our domino server.
When i use the webservice-consumer locally and the proxy-settings (with username and password) in my location document are there, then the consumer can be used without problems.
So over the proxy the webservice is working.
But if i want tho use the webservice-consumer without the proxy or in a agent that runs on the server, it doesn`t work.

The machine with the webservice-provider is reachable in the network without a proxy and i also get the WSDL without a proxy in the browser.

I have installed a webservice test program (soapUI) and that also works with the webservice.
We have also testet the webservice with another server in our network. No problems.
Only if i want to consume the webservice on the domino server it doesn`t work. I always get a timeout-failure.

So my question:
Is there any setting on the domino server that i have to enable.
Iam thankful for all tips.

Martin


Konsum mal anders

5. August 2011 Posted by Nils Diesendorf

Vor einigen Wochen sah ich mich mit der Fragestellung konfrontiert, wie man bestimmte Daten aus einer Notesdatenbank am besten in ein SAP System uebermitteln kann.
Schnell war klar, dass eine Kopplung der beiden Systeme ueber eine CSV-Datei Schnittstelle eher "oldschool" ist und nicht in Frage kommt. Wer sich schon einmal eingehend mit 2 Systemen die Daten ueber eine CSV Schnittstelle austauschen beschaeftigt hat, weiss wovon ich rede ;)
 
Und so geisterte schnell das Wort "Web Service" durch die vom Rauch vieler Koepfe vernebelte Luft und es war beschlossene Sache: Ein Web Service Consumer musste her.

Nachdem die bereitgestellte WSDL Datei nach einigen Schwierigkeiten wie zu langen Funktionsnamen  ("InternalError_Bic_cfdominoWs1RfcExceptions_n0") und der Unmoeglichkeit das WSDL im DominoDesigner als Java Webservice einzubinden, endlich als WebService Consumer bereitstand, konnte die eigentliche Arbeit beginnen.

Es wurde ein Agent erstellt, der WebService ueber ein "use" eingebunden und schon lies sich in einem LS Agenten ein entsprechendes Objekt dimensionieren und ueber die Methode "setcredentials" sogar mit Login Parametern fuer das SAP System ausstatten. Als naechstes wurden unzaehlige Dokumente geladen, Werte ausgelesen und hoechst umstaendlich in den entsprechenden WS Klassen bereitgestellt.  Folgendes Beispiel soll aufzeigen, wie "holprig" so eine WS klassen Definition in LS daherkommt. Betrachten wir dazu die folgenden drei Basisklassen

Klasse zur Repraesentation eines einzelnen Datentyps
Class objDATENTYP1 as XSD_ANYTYPE
      Public value As String
       
        Sub NEW
        End Sub
end Class

Klasse zur Repraesentation eines einzelnen Objektes / Datensatzes:
Class objEinzelnesObjekt as XSD_ANYTYPE
      Public objVariable1 As objDATENTYP1

      Sub New
     End Sub
End Class

Klasse zur Repraesentation einer Liste der Objekte / Datensaetze:
Class Listenobjekt_n0 As XSD_ANYTYPE
        Public item() As objEinzelnesObjekt
       
        Sub NEW
        End Sub
End Class

Die Anzahl an Klassen fuehrt im Programmablauf dann zu folgender Dimensionierungs und Zuweisungsorgie um einen einzelnen Wert an den Web Service zu uebergeben:

'//-- Dimensionierung der Objekte -----------
Dim objItemList As New Listenobjekt  
Redim objItemList.item(0) As objEinzelnesObjekt '//-- bei mehreren Objekten muss hier natuerlich statt der 0 eine groessere Zahl stehen ;)

Dim objSingleItem As New objEinzelnesObjekt
Dim objVariable As New objDATENTYP1

'// --- Zuweisung der Werte zum Daten Objekt -------
objVariable.Value = "verify nice value"

'//-- Zuweisung des Datenobjektes zum einzelnen Objekt
Set objSingleItem.objVariable1 = objVariable

'//-- Zuweisung des einzelnen Objektes zum Listen Objekt
Set objItemList.item(0) = objSingleItem

Nun bleibt nur noch, dass ganze an den WS zu uebergeben, was wie folgt geschieht:

Dim objWSConnect As New WSServiceObject_aus_WSDL / (PortTypeBAse)
Call objWSConnect.Invoke_Function_in_WSDL(objItemList, Fault1)

Hat man bis dahin alles richtig gemacht, so passiert - nichts. Eine Rueckmeldung ob die Uebergabe der Daten erfolgreich war, waere schoen gewesen, blieb aber aus. Dafuer erreichten wir immerhin, dass bei einer falschen Datenstruktur (z.B. String laenger als im WSDL definiert) sich der Errorhandler regte.

Doch auch hier lies sich lediglich eine "Es ist ein Fehler aufgetreten. Kontaktieren sie ihren Datenbank Administrator" Meldung erzeugen. Bei einer entsprechenden Anzahl von Objekten wird es so unmoeglich, die Fehlerquelle zu lokalisieren und abzustellen - die Routine ist also fuer einen Regelbetrieb denkbar ungeeignet.

Bei der aufrufenden Funktion faellt auf, dass ein "Fault1" Objekt vom Typ "WS_Fault" erwartet bzw. zurueckgeliefert wird. Dieses Objekt wird ueber das WSDL File erzeugt und stellt sich wie folgt dar.:
Class Fault1 As WS_FAULT
       
        Public Name As Bic_cfdWs1RfcExceptions_n0
        Public Text As XSD_STRING
        Public Message As RfcExceptionMessage_n0
       
        Sub NEW
        End Sub
       
End Class

Doch auch nach der Initialisierung der entsprechenden Objekte und Klassen, konnte der Grund fuer den Fehler nicht ermittelt werden. Das FehlerObjekt blieb hartnaeckig ungefuellt, obwohl bei dem zum Testen der Verbindungen verwendeten Programm SoapUI der Fehlergrund und Fehlerstelle eindeutig angezeigt wurde.

Wie nun also dem Fehler auf die Schliche kommen ?

Wir entschieden uns schweren Herzens, den Notes Weg zu verlassen und das auch in der von Niklas Heidloff und Simon O'Doherty erstellten Soap Catcher Datenbank  verwendete COM Objekt Microsoft.XMLHTTP einzusetzen.

     Dim WSObject As Variant
        Set WSObject = CreateObject("Microsoft.XMLHTTP")
       
        Dim strREQUEST As String

        strREQUEST = {<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">}
        strREQUEST = strREQUEST & "<soapenv:Header/><soapenv:Body><urn:webservice><Data>"
        strREQUEST = strREQUEST & "<item>"
        strREQUEST = strREQUEST & "<Variable1>" & "verify nice value" & "</Variable1>"
        strREQUEST = strREQUEST & "</item>"
               
        strREQUEST = strREQUEST & "</Data>"
        strREQUEST = strREQUEST & "</urn:webservice>"
        strREQUEST = strREQUEST & "</soapenv:Body>"
        strREQUEST = strREQUEST & "</soapenv:Envelope>"
       

        WSObject.open "POST", endPoint, False, strUsername, strPassword
        WSObject.setRequestHeader "Content-type", "text/xml;charset=UTF-8"
        WSObject.send(strREQUEST)
       
     
        Dim strError As String
        strError = StrRight(StrLeft(StrRight(httpObject.responseText,"</faultcode>"),"</faultstring>"),">")
       
Nachdem man mittels .send die Daten abgeschickt hat, kann ueber die Eigenschaft  httpObject.responseText nun die entsprechende Rueckmeldung (Fehler o. OK) ausgelesen werden.

FAZIT  
Bei der hier aufgezeigten Methode die Soap Meldungen per Microsoft COM Objekt zu laden, bestehen die ueblichen Einschraenkungen. Allen voran sei erwaehnt, dass die Verwendung auf Microsoft fremden System eher schwierig ist. Auch unterliegt der hier verwendete String "strRequest" natuerlich den entsprechenden Groessenbeschraenkungen.
Die Verwendung eines WebServices mit Domino 8.5.2 Bordmitteln koennte man generell eher als "schwierig" bezeichnen. Es waere wuenschenswert, dass in den entsprechenden WS_Fault Objekten o.ae. zumindest die SOAP Antworten zurueckgeliefert werden wuerden, um diese auszuwerten. Aber vielleicht wird es ja was mit 8.5.5 .