Domino中运用webservice
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)。
对 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)。
对 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编写的一个简单的例子。 ?
?
?1?
%INCLUDE?
"
lsxsd.lss
"
?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? ? ? ? 二、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 ? Sub errhandle:? ???? Msgbox ?Str(Err) + " 行号: " + Str(Erl) + " 错误信息saveworkflowxml: " + Error $???? ???? Resume ? Next ? End?Sub ? ? 2、?javascript中调用 webservice ?
var
?xmlfilename
=
document.all.xmlfilename.value
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
?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 ,?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 " ,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();????????}????} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |