Lotus Domino V7.0 在 Lotus Domino Designer 中引入了新的 Web 服務設計項目。因此在Lotus Domino應用開發中使用Web 服務變得更加容易。其中Lotus Domino 負責處理所有的 WSDL 建立和 SOAP 動作,我們所要做的事情就是在 Web 服務設計項目中編寫代碼,設計Web 服務。Lotus Domino 就發行就緒 WSDL 檔案、將引入的 SOAP 請求轉換為類上的方法調用以及返回方法的結果(如果有的話)作為 SOAP 響應。Lotus Domino Web 服務可以用lotus script,java兩種語言編寫。而調用Web 服務的方法卻有很多。一、設計Web 服務。
點建立Web 服務。設計自己的Web 服務。
Web Service Properties 框中的 Basics 附簽
對 Basic 附簽上的欄位說明如下:Name(必需的):Web 服務的名稱,是客戶機訪問 WSDL 檔案或服務的方法時所使用的名稱。 Alias:除 Name 之外的另一名稱,使用者使用該名稱可以訪問服務。 Comment:有關 Web 服務的資訊資料的欄位(通常,該欄位的資訊不超過一句話;有關 Web 服務的較長描述或資訊應寫在代碼的注釋中)。 Warn if the WSDL interface is modified:該選項警告您對代碼所做的更改是否修改了由 Web 服務產生的 WSDL 檔案。這對於確保 WSDL 檔案的一致很有用,但是應該意識到,如果選中了該選項,則您將無法儲存帶有已修改的 WSDL 檔案的服務。 PortType class(必需的):用作 Web 服務介面的類的名稱。換句話說,它就是 Web 服務代碼中帶有使用者可訪問的 public 方法的類。 框中的第二個附簽是 Security 附簽(參見圖 4)。圖 4. Web Service Properties 框中的 Security 附簽
對 Security 附簽上的欄位說明如下:Run as web user:該選項使 Web 服務代碼能夠在調用 Web 服務的使用者的資訊安全內容中運行(預設情況下,它將在 Lotus Domino Designer 中最後簽名 Web 服務的那個 ID 的資訊安全內容中運行)。 Run on behalf of:該欄位允許指定使用者,如果想讓 Web 服務代碼運行在特定使用者的資訊安全內容中,而不是 Lotus Domino Designer 中最後簽名 Web 服務的那個 ID 的資訊安全內容中。 Allow remote debugging:該選項允許遠端偵錯 Web 服務(有關遠端偵錯的資訊,請參閱 Lotus Domino Designer 說明主題 “Using the Remote Debugger”)。 Profile this web service:該選項將在 Web 服務運行時使其產生分析資訊(有關分析的資訊,請參閱 Lotus Domino Designer 說明主題 “Profiling agents and Web services”)。 Set runtime security level:設定為 1,允許大多數 LotusScript 和 Java 操作正確運行;對於讀/寫檔案、建立 COM 物件或執行網路操作等,根據需要,設定為 2 或 3(有關更多資訊,請參閱 Lotus Domino Designer 說明主題 “Restricted LotusScript and Java agent operations”)。 Default access for this web service:該選項允許控制哪些使用者可以訪問 Web 服務,並超出了使用資料庫 ACL 所能進行的控制(如果 Anonymous 使用者無法訪問 Web 服務,則當使用者嘗試進行串連時,將收到錯誤 401 Access Denied 或 404 Not Found)。 Allow Public Access users to use this web service:該選項使得僅擁有資料庫 ACL 中 “Read Public Documents” 訪問權的使用者可以使用該 Web 服務,當不想為大量使用者授予完全的 Reader 存取權限(或更進階別)時,這點很有用。 框中的第三個附簽是 Options 附簽(參見圖 5)。圖 5. Web Service Properties 框中的 Options 附簽
對 Options 附簽上的欄位說明如下:Programming model:可用選項是 RPC 或 Message(大多數情況下使用 RPC)。 SOAP message format:在該欄位中,為此 Web 服務選擇 SOAP 訊息格式,Lotus Domino V7.0 中的預設格式是 RPC/encoded。 Include operation name in SOAP action:該選項要求操作名稱存在於外來請求的 SOAP 動作標題中(很少需要)。 Port type name:預設情況下,該欄位值與 Basics 附簽上 PortType class 欄位的值相同(儘管您可以使用任何想用的名稱)。產生 WSDL 檔案時使用該值。 Service element name:預設情況下,該欄位值是 PortType 名稱加上單詞 Service(儘管您可以使用任何想用的名稱)。產生 WSDL 檔案時使用該值。 Service port name:預設情況下,該欄位值是 Domino(儘管您可以使用任何想用的名稱)。產生 WSDL 檔案時使用該值。
可以選擇是用lotus script 或JAVA語言編輯你的Web 服務。以下是lotus script編寫的一個簡單的例子。%INCLUDE "lsxsd.lss"Class saveworkflow Sub NEW End Sub Function saveworkflowxml(xmlfilename As String,xmltext As String) As String On Error Goto errhandle Dim outputStream As NotesStream Dim session As New NotesSession Set outputStream = session.CreateStream Dim outputFile As String outputFile=Curdir$()+"/data/domino/html/workflow/"+xmlfilename If outputStream.Open(outputFile) Then Call outputStream.WriteText(xmltext, EOL_CRLF) Call outputStream.Close End If saveworkflowxml="1" Exit Functionerrhandle: Msgbox Str(Err)+"行號:"+Str(Erl)+"錯誤資訊saveworkflow:saveworkflowxml"+Error$ Resume Next End Function End Class一、Web 服務的調用。1、 lotus script代理中調用webservice。在window平台上我們可以使用MSSOAP toolkit來調用。可以下載MSSOAP toolkit3.0,並在伺服器上安裝MSSOAP toolkit3.0。在代理中的代碼如下:Sub Initialize On Error Goto errhandle Dim ss As New NotesSession Dim doc As NotesDocument Set doc=ss.DocumentContext Dim client As Variant Dim xmlfilename As String Dim xmltext As String xmlfilename=doc.xmlfilename(0) xmltext=doc.xmltext(0) Set Client =CreateObject("MSSOAP.SoapClient30") Call Client.mssoapinit ("http://server/mis/flow.nsf/saveworkflow?WSDL") Dim result As String If Not Client Is Nothing Then result = Client.saveworkflowxml(xmlfilename,xmltext) Else result="no web" End If Exit Suberrhandle: Msgbox Str(Err)+"行號:"+Str(Erl)+"錯誤資訊saveworkflowxml:"+Error$ Resume Next End Sub2、 javascript中調用 webservice。var xmlfilename=document.all.xmlfilename.valuevar xmltext=document.all.xmltext.value var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); var soapMessage, soapData, URL; // Set the soap message soapMessage = "<?xml version=/"1.0/" encoding=/"utf-8/"?>"; soapMessage += "<soap:Envelope xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/"" + " xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:soap=/"http://schemas.xmlsoap.org/soap/envelope//">"; soapMessage += "<soap:Body>"; // Set the data for soap body ---- begin ------ soapData = "<saveworkflowxml xmlns=/"http://tempuri.org//">"; soapData += " <xmlfilename>" + xmlfilename + "</xmlfilename>"; soapData += " <xmltext>" + xmltext + "</xmltext>"; soapData += "</saveworkflowxml>"; // Set the data for soap body ---- end ------ soapMessage = soapMessage + soapData + "</soap:Body>"; soapMessage = soapMessage + "</soap:Envelope>";var urlstr="http://server/mis/flow.nsf/saveworkflow?openwebservice" xmlhttp.Open("POST",urlstr, false); xmlhttp.SetRequestHeader ("Content-Type","text/xml; charset=utf-8"); xmlhttp.SetRequestHeader ("SOAPAction","http://tempuri.org/onlineandmsg"); xmlhttp.send(soapMessage); var x = xmlhttp.responseXML;3、 FLASH 中調用webservice。import mx.services.WebService;//定義WebService的路徑;var ws_url:String = "http://server/mis/flow.nsf/saveworkflow?WSDL";//定義WebService對象;var ws:WebService = new WebService(ws_url);//調用WebService方法;var callObject = ws.SAVEWORKFLOWXML(_parent.workflowxml,_global.workxml.toString());//設定返回結果對象;callObject.onResult = function(result){ trace(result); }//如果調用錯誤返回資訊(這個是可選的);callObject.onFault = function(fault){ trace("fault:"+fault.faultstring);} 4、 java 代理中調用webservice,首先在代理工程中引入相關的包。import lotus.domino.*;import java.io.*;import java.util.*;import java.net.*;import org.w3c.dom.*;import org.apache.soap.util.xml.*;import org.apache.soap.*;import org.apache.soap.encoding.*;import org.apache.soap.encoding.soapenc.*;import org.apache.soap.rpc.*;import org.apache.soap.transport.http.SOAPHTTPConnection;public class JavaAgent extends AgentBase { public void NotesMain() { try { Session session = getSession(); AgentContext agentContext = session.getAgentContext(); Document doc = agentContext.getDocumentContext();String xmlfilename=doc.getItemValueString("xmlfilename")String xmltext=doc.getItemValueString("xmltext") // (Your code goes here) URL url = new URL ("http://server/mis/flow.nsf/saveworkflow?WSDL"); SOAPMappingRegistry smr = new SOAPMappingRegistry (); StringDeserializer sd = new StringDeserializer (); smr.mapTypes (Constants.NS_URI_SOAP_ENC, new QName ("", "Result"), null, null, sd); // 建立傳輸路徑和參數 SOAPHTTPConnection st = new SOAPHTTPConnection(); // 建立調用 Call call = new Call (); call.setSOAPTransport(st); call.setSOAPMappingRegistry (smr); call.setTargetObjectURI ("http://tempuri.org/message/"); call.setMethodName("saveworkflowxml"); call.setEncodingStyleURI ("http://schemas.xmlsoap.org/soap/encoding/"); Vector params = new Vector(); params.addElement(new Parameter("xmlfilename", String.class, xmlfilename, null)); params.addElement(new Parameter("xmltext", String.class,xmltext, null)); call.setParams(params); Response resp = null; try { resp = call.invoke (url,""); } catch (SOAPException e) { System.err.println("Caught SOAPException (" + e.getFaultCode () + "): " + e.getMessage ()); return; } // 檢查傳回值 if (resp != null && !resp.generatedFault()) { Parameter ret = resp.getReturnValue(); Object value = ret.getValue(); System.out.println ("Answer--> " + value); } else { Fault fault = resp.getFault (); System.err.println ("Generated fault: "); System.out.println (" Fault Code = " + fault.getFaultCode()); System.out.println (" Fault String = " + fault.getFaultString()); } } catch(Exception e) { e.printStackTrace(); } }