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编写的一个简单的例子。
?
?
?
?
?
二、Web 服务的调用
?
1、?lotus script代理中调用webservice。
?
在window平台上我们可以使用MSSOAP toolkit来调用。可以下载MSSOAP toolkit3.0,并在服务器上安装MSSOAP toolkit3.0。在代理中的代码如下:
?
????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?Sub
errhandle:?
????Msgbox?Str(Err)+"行号:"+Str(Erl)+"错误信息saveworkflowxml:"+Error$????
????Resume?Next?
End?Sub
?
?
2、?javascript中调用 webservice
?
var?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?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();
????????}
????}
?
?
?2?
?3?Class?saveworkflow
?4?
?5?????Sub?NEW????
?6?
?7?????End?Sub
?8?
?9?????Function?saveworkflowxml(xmlfilename?As?String,xmltext?As?String)?As?String
10?
11?????????On?Error?Goto?errhandle
12?
13?????????Dim?outputStream?As?NotesStream
14?
15?????????Dim?session?As?New?NotesSession
16?
17?????????Set?outputStream?=?session.CreateStream
18?
19?????????Dim?outputFile?As?String
20?
21?????????outputFile=Curdir$()+"datadominohtmlworkflow"+xmlfilename
22?
23?????????If?outputStream.Open(outputFile)?Then
24?
25?????????????Call?outputStream.WriteText(xmltext,?EOL_CRLF)
26?
27?????????????Call?outputStream.Close
28?
29?????????End?If
30?
31?????????saveworkflowxml="1"
32?
33?????????Exit?Function
34?
35?errhandle:?
36?
37?????????Msgbox?Str(Err)+"行号:"+Str(Erl)+"错误信息saveworkflow:saveworkflowxml"+Error$????
38?
39?????????Resume?Next?
40?
41?????End?Function
42?
43?End?Class
44?
?
?
原文链接:http://blog.csdn.net/juest365/article/details/6285383