使用WSDL发布WebService简单对象访问协议_第1页
使用WSDL发布WebService简单对象访问协议_第2页
使用WSDL发布WebService简单对象访问协议_第3页
使用WSDL发布WebService简单对象访问协议_第4页
使用WSDL发布WebService简单对象访问协议_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用WSDL发布WebService(第二部分)简单对象访问协议一一学习SOAP语法和使用SOAP发布WSDL简单对象访问协议(SOAP)提供了访问远程对象的方法。这样的对象有JavaBean,EJB组件,COM和COM+对象等等。这些对象使用不同的公司,可能在互联网上随处可见。因此SOAP是一种在互联网上交换企业信息的机制。在本文中,笔者将讨论SOAP通信的细节,对象如何使用SOAP显示其功能,如何调用SOAP对象以及如何在SOAP感知软件中交换信息。他将演示如何将第一部分中的WSDL程序发布为SOAP服务,及其远程调用。SOAP和WSDL我在这个系列的第一部分介绍了WSDLoWSDL描述WebService的接口。WebService的拥有者将使用SOAP实现这些的接口。因此WSDL服务就以SOAP服务的形式存在。一旦WebService的用户拥有了WSDL文件,他就知道了接口的详细资料,就可以使用SOAP同WebService通信。可以将你通过WSDL接口发布的WebService看作对象,它可以通过SOAP从互联网上远程访问。既然服务都是对象,必然就会有一些属性跟每个服务及其行为相关。SOAP消息是可能工作在HTTP上的XML文件。使用SOAP的原因B2B(business-to-business)和A2A(application-to-application)需要通信的企业双方的指示以交换其信息。工作流的概念用于B2B,并贯穿于企业集成。例如,某个企业调用供应商的服务以满足客户的需求,这就形成了一条垂直的供应链。有的供应商也会拓展供应联调用其他企业的服务。显然这类应用软件的交互性极其重要。任一企业都只是实现SOAP通信的一端,而另一端由互联网上的其他人实现。在未来的几年里,企业集成和交互能力将成为软件工程师和企业极具挑战性的任务。平台依赖性也将是集成和交互能力达成的一大难题。SOAP是至今为止最简单的实现企业集成和交互能力的机制。SOAP架构在初步了解了SOAP及其作用后,下面我将讨论它的架构以了解其内部的情况。在图Figure1中,你可以看见下面的组件运用于典型的SOAP通信机制中:1.SOAPClient2.SOAPService3.ActualServiceFigure1.ComponentsofatypicalSOAPcommunicationarchitecture下面讨论上面提及的各个实体在架构中的角色。SOAPClientSOAPClient是一个SOAP感知机器,它可以产生SOAP请求并通过HTTP将SOAP请求发送给SOAPServer。SOAPClient是一种SOAP消息。一般来说有两种SOAP消息:SOAPClient发送给SOAPService的SOAP请求消息和SOAPService发送给SOAPClient的SOAP响应消息。Listing1是一个典型SOAP请求消息,而Listing2则是一个典型SOAP响应消息。<SOAP-ENV:Envelopexmlns:SOAP-ENV=〃/soap/envelope/〃><SOAP-ENV:Body><m:getListOfModelsxmlns:m="urireference"></m:getListOfModels></SOAP-ENV:Body></SOAP-ENV:Envelope>SOAPServerSOAPServer也是一个SOAP感知机器,它可以接受SOAPClient发来的请求并创建合适的响应。加密的响应会发给发出请求的SOAPClient。在SOAPServer内部有三个实体:ServicemanagerDeployedservicelistXMLtranslatorServicemanager管理响应请求的服务。在Listing1中的SOAP请求中,节点<m:getListOfModelsxmlns:m="urn:MobilePhoneService">包含了服务的名称。Servicemanager会读出ServiceClient向要调用的服务的名称并向包含SOAPService中所有服务列表的Deployedservicelist查询是否有该项服务。如果有Servicemanager就将SOAP请求发给XMLtranslator。XMLtranslator将SOAP请求的XML结构转换成程序员用来实现ActualService的程序语言。XMLtranslator还将ActualService返回的响应转回XML结构的SOAP响应。Listing2就是一个SOAP响应的例子。<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><m:getListOfModelsResponsexmlns:m="urn:MobilePhoneservice"><Model>M1</Model><Model>M2</Model><Model>M3</Model></m:getListOfModelsResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>ActualService在Figure1中标为ActualService的方框显示了ActualSrrvice的位置。服务的实现可能是一个COM组件或是一个JavaBean组件。XMLtranslator会把XML结构转换成合适的方法调用。当XMLtranslator调用ActualSrrvice的方法时,这些方法会执行其功能并返回结果给XMLtranslator。Figure1中连接XMLtranslator和ActualService的箭头的两端都在一个企业里,这意味着同一个组织控制着通信两端的接口。与此相反的是SOAPClient和SOAPService穿越了企业的边界。这就是SOAP的用途。SOAP请求响应机制SOAPClient传输SOAP消息给SOAPService时使用HTTP协议传输。这称为SOAP绑定HTTP.当SOAPService收到消息时,他将消息传给ServiceManeger.SOAPService检查Deployedservicelist中是否有SOAP消息请求的服务。如果没有该项服务,他将请求失败的响应发回给SOAPClient。但如果有该项服务,就由XMLtranslator进行适合的语言转换,访问actualservice的实现。服务的实现会处理请求并返回结果给XMLtranslator.XMLtranslator再将结果转换为SOAPClient理解的SOAP响应。同样,HTTP绑定也用在SOAP响应的传输上。SOAP绑定HTTP当你将HTTP同SOAP帮定绑定或是在HTTP上操作SOAP时,你实际上在SOAP请求和响应上添加了HTTP头listing1是典型的SOAP请求,而Listing3,4,5,6演示了在Listing1上添加了HTTP头的SOAP请求。与此类似的是Listing7演示了在Listing2上添加了HTTP头的SOAP响应。当你在HTTP上使用SOAP时,Content-Type字段必须为text/html.在Listing7中可以看到Listing3的细节。一个使用HTTP的SOAP请求你可以将SOAP联合在HTTP的请求方法POST上。要发送一个SOAPHTTP请求,你必须在HTTP头上提供一个SOAPAction字段。SOAPAction定义了SOAP请求的目的。服务器(例如过滤HTTP上SOAP请求消息的防火墙)可以使用SOAPAction的值做决定。HTTP客户端在发出SOAP请求时必须使用HTTP头的这个字段。SOAPAction可以取的值如下所示:SOAPAction:”URI-Reference”SOAPAction:”filename”SOAPAction:””SOAPActionPOST/VendorsHTTP/1.1Host:Content-Type:"text/xml”;Charset="utf-8”Content-Length:nnnnSOAPACtion:"/Vendors/MobilePhoneservice#getListOfModels”<?xmlversion="1.0”?><SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><m:getListOfModelsxmlns:m="urn:MobilePhoneservice"></m:getListOfModels></SOAP-ENV:Body></SOAP-ENV:Envelope>图Listing3在SOAPAction中包含了下面的URI引用/Vendors/MobilePhoneservice#getListOfModels这个SOAPAction说明了两件事:一是SOAP发布的详细地址/Vendors/MobilePhoneservice,二是我们感兴趣的方法的名称(#getListOfModels).POST/VendorsHTTP/1.1Host:Content-Type:"text/xml”;Charset="utf-8”Content-Length:nnnnSOAPAction:"MobilePhoneservice#getListOfModels”<?xmlversion="1.0”?><SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><m:getListOfModelsxmlns:m="urn:MobilePhoneservice"></m:getListOfModels></SOAP-ENV:Body></SOAP-ENV:Envelope>图Listing4在SOAPAction中包含了一个文件名(MobilePhoneservice#getListOfModels)。MobilePhoneservice文件必须放在主机URI下(www.M/Vendors)。主机URI是由HTTP头的host字段加文件夹名(/Vendors)组成的。POST/VendorsHTTP/1.1Host:Content-Type:"text/xml";Charset="utf-8"Content-Length:nnnnSOAPAction:""<?xmlversion="1.0”?><SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><m:getListOfModelsxmlns:m="urn:MobilePhoneservice"></m:getListOfModels></SOAP-ENV:Body></SOAP-ENV:Envelope>图Listing5的SOAPAction中包含了一个控字符串(””)。空字符串说明SOAP的目标跟主机URI相同(www.M/Vendors)。POST/VendorsHTTP/1.1Host:Content-Type:"text/xml”;Charset="utf-8”Content-Length:nnnnSOAPAction:<?xmlversion="1.0”?><SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><m:getListOfModelsxmlns:m="urn:MobilePhoneservice"></m:getListOfModels></SOAP-ENV:Body></SOAP-ENV:Envelope>图Listing6的SOAPAction没有值。这表明没有消息的目标的信息。使用HTTP的SOAP响应SOAP响应有两种类型:•成功的SOAP操作产生的SOAP结果。•不成功的SOAP操作产生的SOAP错误消息。HTTP/1.1Content-Type:"text/xml";Charset="utf-8”Content-Length:nnnn<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><m:getListOfModelsResponsexmlns:m="URI-Reference"><model>m1</model><model>m2</model></m:getListOfModels></SOAP-ENV:Body>图Listing7就是一个从SOAP服务返回的有意义的结果。图Listing8则是一个典型的SOAP错误消息。SOAPHTTP响应在HTTP中添加了通信状态信息的HTTP状态码的语义。当处理请求失败时,SOAPHTTP服务器必须发出一个包含带有SOAP错误元素的SOAP消息的HTTP500内部服务错误的响应。HTTP/1.1500InternalServerErrorContent-Type:"text/xml";Charset="utf-8"Content-Length:nnnn<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultstring>Failedtoprocesstherequest</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>SOAP和e-mailHTTP并非是绑定SOAP消息的唯一解决方案。你可以在HTTP步使用的地方使用其他的机制如SMTP进行SOAP绑定。绑定SOAP到SMTP,你可以创建一个单向的通道。两个单向的消息可以建立请求/响应通讯。为了使用SMTP发送SOAP消息,你必须按照下面的步骤做:使用SMTP头的MIME-Version字段MIME-Version字段使用版本号区别不同版本的MIME(多用途网际邮件扩充协议).他允许邮件服务代理(如pop服务)区别新老版本MIME产生的邮件消息。图Listing9就是用了SMTP头的MIME-Version字段。TO:<info@>From:<abc@>Reply-To:<abc@>Date:SAT,2Feb200216:00:00Message-Id:<4FAB345C8D93E93B7A6E9@>MIME-Version:1.0Content-Type:text/xml;charset=utf-8Content-Transfer-Encoding:QUOTED-PRINTABLE<?xmlversion="1.0"encoding="UTF-8"?><SOAP-ENV:Envelopexmlns:SOAP-ENV=〃/soap/envelope/〃><SOAP-ENV:Body><prnt:echoStringxmlns:prnt=""><msgString>PutyourmailMessage</msgString></prnt:echoString></SOAP-ENV:Body></SOAP-ENV:Envelope>使用SMTP头的Content-Type字段Content-Type字段用来标明消息体重的数据类型。”text/xml”就是一个可以去的值。图Listing9就使用了Content-Type字段。使用SMTP头的Content-Transfer-Encoding字段Content-Transfer-Encoding字段用来说明传输编码的类型,就是说你想传输什么样的数据,是字符格式还是二进制格式的。图Listing9使用了QUOTED-PRINTABLE编码就是ASCII字符集中可打印的字符。它是以邮件传出代理不太可能修改结果字节的方式进行数据编码的SOAP模式及其撰写SOAP消息SOAP消息就是一个XML文档,其中必须有一个包含可选SOAP头和必需的SOAP体的SOAPEnvelope。SOAP模式的元素:EnvelopeHeaderBodyFauleEnvelope:Envelope是SOAP消息的根结点。该节点在SOAP消息中是必须出现的。Envelope使用的SOAP名称空间标识:/soap/envelope/是必需的。如果Envelope节点包含错误的名称空间就会产生一个Envelope名称空间版本的错误。Listing10是一个空的Envelope节点。你称之为空信以强调在”post”之前Envelope节点必须包含一封”信”。SOAP模式中的信就是一个SOAP体而HTTPPOST则是传输机制。Listing10<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"></SOAP-ENV:Envelope>HeaderSOAP头是可选的。你可以跳过SOAP头直接在SOAPEnvelope中封装一个SOAP体。SOAP头提供了一个拓展SOAP消息功能的机制。例如,在SOAP头中添加验证就是一个典型的拓展。本例中就有一个将在底层传输的验证框架。Listing11中可以看到SOAP中Header的实现。Listing11<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Header><m:Orderxmlns:m="someURI"SOAP-ENV:mustUnderstand="1"></m:Order></SOAP-ENV:Header></SOAP-ENV:Envelope>BodyBody节点将会包含你想发送的消息。这是一个必需的节点,而它的字节点通常属于一个用户自定义的名称空间中。Listing12显示了一个含有用户自定义名称空间“u”的SOAP消息。Body节点用来包含必需的信息。Body节点是SOAP消息必需的,而且它必须是SOAPEnvelop节点的直接子节点。他必须直接跟在SOAPHeader后面。如果没有Header节点,则直接跟在Envelop节点后面。Body可以包含字节点,字节点可以有其名称空间。<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Header><m:Orderxmlns:m="someURI"SOAP-ENV:mustUnderstand="1"></m:Order></SOAP-ENV:Header><SOAP-ENV:Body><u:GetPricexmlns:u="someURI"><model>m1</model></u:GetPrice></SOAP-ENV:Body></SOAP-ENV:Envelope>Fault这个节点指示错误消息。它必须在Body中出现而最多出现一次。通常,Fault节点出现在SOAP响应中表明SOAP请求出错了。Fault的子节点:faultcode(fault标识)faultstring(fault描述)faultactor(引发错误的原因)detail(错误的细节。通常是相应遇SOAP请求的Body中名称空间的应用程序的错误细节。)Listing13是一个典型的fault消息。Listing13<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Header><m:Orderxmlns:m="someURI"SOAP-ENV:mustUnderstand="1"></m:Order></SOAP-ENV:Header><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Server</faultcode><faultstring>Notnecessaryinformation</faultstring><detail><d:faultdetailxmlns:d="uri-referrence"><msg>applicationisnotrespondingproperly.</msg><errorcode>12</errorcode></d:faultdetail></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>第一部分的WSDL文件的SOAP请求在大致介绍了SOAP消息的语法之后,我将演示如何为本系列文章中第一部分的MobilePhoneservice开发一个SOAP请求。在第一部分中你为MobilePhoneservice设计了一个完整的WDL接口。移动电话公司在MobilePhoneservice提供了两个方法:一个是getListOfModels,另一个是getPrice(modelNumber)。GetListOfModels没有参数,返回移动电话型号列表而getPrice(modelNumber)有一个参数modelNumber,返回请求型号的价格。你需要把他们做成SOAP请求的格式,在这之前我要展示一下SOAP请求和响应的一般格式。<SOAP-ENV:Envelopexmlns:SOAP-ENV="SOAPschema'sURI"<SOAP-ENV:Body><Instance:"MethodName"xmlns:Instance="URIwheremethodislocated"><parameter1>value</parameter1><parametern>value</parametern></Instance:"MethodName"></SOAP_Envelop:Body></SOAP-ENV:Envelope>一个SOAP请求或响应只能定义服务的一个方法。SOAP请求的一般形式如Listing14所示。而Listing16则是一个调用getListOfModels方法的实际请求。在Listing16中,我提供了方法的名称和URI。由于getListOfModels没有参数,因此<m:getListOfModels〉是一个空节点。Listing15<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><Instance:"MethodName"+"Response”xmlns:Instance="URIwheremethodislocated"><return><responseparameter1>value</responseparameter1><responseparametern>value</responseparametern></return></Instance:"MethodName"+"Response"></SOAP-ENV:Body></SOAP-ENV:Envelope>Listing15是一个一般的SOAP响应。ApachSOAP服务器在方法名后添加了Response关键字并将返回值封装在<return>节点中作为方法节点的直接子节点。如果返回值是一个复杂类型,那么<return>节点将包含一个或多个<item>节点。与Listing15相比Listing17则是方法getListOfModels的实际响应。Listing17中返回值是Vector类型的,因此<return>节点包含了一个<item>节点的列表。与此类似的是Listing18和Listing19,这两个图展示了MobilePhoneservice的getPrice()方法的SOAP请求和响应。<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><m:getListOfModelsxmlns:m=""></m:getListOfModels></SOAP-ENV:Body></SOAP-ENV:Envelope><?xmlversion="1.0"encoding="UTF-8"?><SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/">xmlns:xsi="/1999/XMLSchema-instance”xmlns:xsd="/1999/XMLSchema"><SOAP-ENV:Body><ns1:getListOfModelsResponsexmlns:ns1="urn:MobilePhoneservice”SOAP-ENV:encodingStyle="/soap/encoding/"><returnxmlns:ns2="/xml-soap”xsi:type="ns2:Vector"><itemxsi:type="xsd:string">M1</item><itemxsi:type="xsd:string">M2</item><itemxsi:type="xsd:string">M3</item><itemxsi:type="xsd:string">M4</item><itemxsi:type="xsd:string">M5</item></return></ns1:getListOfModelsResponse></SOAP-ENV:Body></SOAP-ENV:Envelope><SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/">xmlns:xsi="/1999/XMLSchema-instance”xmlns:xsd="/1999/XMLSchema"><SOAP-ENV:Body><m:getPricexmlns:m=""><modelNumberxsi:type="xsd:String">M1</modelNumber></m:getPrice></SOAP-ENV:Body></SOAP-ENV:Envelope><?xmlversion="1.0"encoding="UTF-8"?><SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/"xmlns:xsi="/1999/XMLSchema-instance”xmlns:xsd="/1999/XMLSchema"><SOAP-ENV:Body><ns1:getPriceResponsexmlns:ns1="urn:MobilePhoneservice”SOAP-ENV:encodingStyle="/soap/encoding/"><returnxsi:type="xsd:string">5000</return></ns1:getPriceResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>在SOAP服务器上发布基于WSDL的服务在这部分我们将把第一部分中的WSDL服务发布到一台ApacheSOAP服务器上。ApacheSOAP工具包把WSDL服务信息保存在一个发布描述文件中。发布描述文件包含了WSDL服务的名称及其方法。发布描述文件在运行时将这些信息提供给SOAP服务器。发布描述文件还包含了实现接口的JavaBean组件的地址。Listing20<isd:servicexmlns:isd=〃/xml-soap/deployment〃id=〃URN:SERVICE-URN〃><isd:providertype="java"scope="Request"methods=〃EXPOSED-METHODS〃><isd:javaclass=〃IMPLEMENTING-CLASS〃/></isd:provider><isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener></isd:service>Listing20是发布描述文件的骨架,基于WSDL服务的发布描述需要三个信息(URN:SERVICE-URN,EXPOSED-METHO和IMPLEMENT-CLASS)oURN:SERVICE-URN是发布的服务的名称。EXPOSED-METHO服务的方法列表。在本次发布中就是getListOfModels和getPrice。IMPLEMENT-CLASS就是带有完整名称的java类。如samples.phonequote.MobilePhoneservice。本例的试验中你有下面的路径结构:ApacheSOAPserver:C:/foo/SOAP-2-2Mobileponeservice实现C:/foo/SOAP-2-2/samples/phonequotes/MobilePhoneservice因此在安装SOAP工具包时实现类路径跟目录有关。我并没有提供实际的java实现类。这需要依据商务逻辑或者其他的什么东西。<isd:servicexmlns:isd=〃/xml-soap/deployment〃id="urn:MobilePhoneservice"><isd:providertype="java"scope="Request"methods="getListOfModelsgetPrice"><isd:javaclass=〃samples.phonequote.MobilePhoneservice〃/></isd:provider><isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener></isd:service>Listing21就是第一部分中WSDL文件的完整描述。SOAP客户端同SOAP服务器的通讯我准备了一个例子演示SOAP客户端同SOAP服务器的通讯。因此我给出了三个清单:Startup.html(Listing22),Operation.html(Listing23)和Excute.jsp(Listing24)。Startup.html是一个简单的html文件。它是一个用户界面,由用户决定调用哪个SOAP方法。Listing22<HTML><BODYbgcolor="Teal"><br/><palign="center"><fontsize="5"face="Arial"color="white"><b>SOAPmethodinvocationdemo</b></font></p><hr/><fontface="Arial"color="whitesmoke"size="3"><br/><b>Clickanyofthemethodnametoexecute.<br/>GettheListofallModelsthatwemanufacture<ahref="execute.jsp?index=1"><fontcolor="orange">GetListOfModels</font></a><br/>GetthePriceofanyparticularmodel <ahref="operation.html"><fontcolor="orange">GetPrice</font></a></b></BODY></HTML>Operation.html(Listing23)让用户输入调用方法的参数。Listing23<HTML><BODYbgcolor="Teal"><br/><palign="center"><fontsize="5"face="Arial"color="white"><b>GetPriceOperationinputForm</b></font></p><hr/><palign="center"><formaction="execute.jsp"method="POST"><inputtype="hidden"name="index"value="0"><tabletextColor="white"><tr><td><fontcolor="whitesmoke"><b>Description:</b></font></td><td><fontcolor="whitesmoke">MethodGetPriceisusedtoGetPriceofgivenModelNumber</font></td></tr><tr><td><fontcolor="whitesmoke"><b>Parameter(s)</b></font></td><td></td></tr><tr><td><fontcolor="whitesmoke">ModelNumber</td></font><td><fontcolor="whitesmoke"><inputtype="text"name="parameter"size="30">(required)</font></td></tr><tr><td></td><td><inputtype="Submit"value="Invoke"></td></tr></font></table></form></p></BODY></HTML>Excute.jsp(Listing24)才是重点。它侦查调用的方法及其参数,然后向远程服务器发送方法调用请求。Listing24<%@pagelanguage="java"import="java.util.Vector”%><%@pageimport=".MalformedURLException,.URL"%><%@pageimport="java.util.Vector”%><%@pageimport="org.apache.soap.SOAPException,org.apache.soap.Constants”%><%@pageimport="org.apache.soap.rpc.Call,org.apache.soap.rpc.Response,org.apache.soap.rpc.Parameter”%><%@pageimport="org.apache.soap.transport.http.SOAPHTTPConnection”%><%@pageimport="org.apache.soap.Fault”%><HTML><BODYbgcolor="Teal”><br/><palign="center"><fontcolor="whitesmoke"><%booleanisParameter=false;SOAPHTTPConnectionsoapTransport=newSOAPHTTPConnection();//Addressoftheremoteserver.//Normallythisshouldbedynamicallypassedanddetected.//Wehavehardcodeditonlyfordemonstration.URLurl=newURL("http://localhost:8080/soap/servlet/rpcrouter");//Buildthecall.Callcall=newCall();call.setTargetObjectURI("urn:MobilePhoneservice");call.setSOAPTransport(soapTransport);call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);//We'lldetectwhichmethoduserselected//andgiveacallaccordingly.//We'llpassparametersifpresent.if(request.getParameter("parameter")!=null)isParameter=true;if(request.getParameter(''index").equals(''0”)){call.setMethodName("getPrice");Vectorparams=newVector();Stringmessage=newString(request.getParameter("parameter"));params.addElement(newParameter("message”,String.class,message,null));call.setParams(params);}elsecall.setMethodName("getListOfModels");Responseresp=call.invoke(url,/*actionURI*/"");out.println("<palign=left><fontsize=/"4/"face=/"Arial/"color=/"white/">Responseof["+call.getMethodName()+"]</font><hr/>");//Checktheresponse.if(resp.generatedFault()){Faultfault=resp.getFault();out.println("<b>Faultis:</b>"+fault.getFaultCode()+"["+fault.getFaultString()+"]”);}else{Parameterresult=resp.getReturnValue();out.println("<b>Responseis:</b>"+result.getValue()+"");%><font></p></BODY></HTML>运行这个程序你需要两个ApacheSOAP服务器。一个用于用户跟主机的交互。另一个(又称远程服务器)用来发布第一部分中基于WSDL的服务。在Execute.jsp中硬编码的远程服务器地址(http://localhost:8080/soap/servlet/rpcouter)仅用于演示。实际上你将从WSDL文件中读出远程服务器地址。SOAP中的简单数据类型和组合数据类型下面介绍简单数据类型和组合数据类型的区别。我将展示在SOAP中如何封装它们。简单数据类型包括string,float,integer,enumeration等等。如移动电话的名称就是string类型的。组合数据类型则是简单数据类型的组合体。如学生类型就可能有多个属性:st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论