php soap wsdl和WSDL的理解问题

青青子衿, 悠悠我心, 但为君故, 沉吟至今
通过Web Service调用Google SOAP Search API
  我曾经介绍过&&的一些步骤,做为一个更有特色的应用范例,本次我将介绍使用Axis通过Web Service调用Google SOAP Search API,实现Google搜索、Google快照、Google拼写这三项功能,包括示例源代码。  一、环境配置  首先,没有Java开发环境的,需要安装一下环境,点这里查看《》,其实,本示例安装JDK 1.42以及Eclipse 3.2就可以了。  二、将Apache Axis相关包文件放在WEB-INF\lib目录下  从Apache的主页上下载Axis包文件,复制到lib目录下。  三、申请Google SOAP Search API license key  要使用Google的服务,必须要有&license key&,如果你有Gmail帐号,就可以申请license key,这个license key是一段很长的字符串,每个key可以支持每天1000次的Google搜索。  四、下载WSDL文件,生成客户端Java代码  WSDL文件的下载地址参见:  生成客户端代码的批处理文件如下:set Axis_Lib=D:\workspace\test\WEB-INF\libset Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%set Output_Path=D:\workspace\test\srcset Package=com.google.api%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% GoogleSearch.wsdl  最后会生成下列代码文件:DirectoryCategory.javaGoogleSearchBindingStub.javaGoogleSearchPort_PortType.javaGoogleSearchResult.javaGoogleSearchService.javaGoogleSearchServiceLocator.javaResultElement.java  五、编写程序,调用Google SOAP Search API  在上面那个包下,编写你自己的Java程序,就可以调用Google SOAP Search API.目前可以使用的Google服务有:网页搜索,网页快照,拼写检查这三个。  Java示例代码如下,请使用前将clientKey替换为你自己的。替换后直接运行即可得出结果。package com.google.import java.rmi.RemoteEimport javax.xml.rpc.ServiceEpublic class ClientGoogle {& public static void main(String[] args) throws ServiceException,&&& RemoteException {&&& String clientKey = &kkkkkkkkkkkkkkkkkkkkkkkkkkey&;&&& GoogleSearchServiceLocator service = new GoogleSearchServiceLocator();&&& GoogleSearchPort_PortType gsp = service.getGoogleSearchPort();&&& //Google Search API&&& GoogleSearchResult searchResult = gsp.doGoogleSearch(clientKey,&&&&&&& &&, 0, 10, false, &&, false, &&, &latin1&,&&&&&&& &latin1&);&&& System.out.println(&Google Search Results:&);&&& System.out.println(&======================&);&&& ResultElement results[] = searchResult.getResultElements();&&& for (int counter = 0; counter & results. ++counter) {&&&&& ResultElement result = results[counter];&&&&& String returnResult = &('& + result.getTitle() + &','&&&&&&&&&& + result.getURL() + &','& + result.getSnippet() + &')&;&&&&& System.out.println(&Return Result&);&&&&& System.out.println(returnResult);&&& }&&& //Google CachedPage&&& byte[] cachedBytes = gsp.doGetCachedPage(clientKey,&&&&&&& &/&);&&& System.out.println(&Cached page:&);&&& System.out.println(&============&);&&& String cachedString = new String(cachedBytes);&&& System.out.println(cachedString);&&& //Google SpellingSuggestion&&& String suggestion = (String) gsp.doSpellingSuggestion(clientKey,&&&&&&& &williamlong&);&&& System.out.println(suggestion);& }}  当然,你也可以不使用Apache Axis,Google自己也提供了一个API包可以做为客户端调用,下载地址参见。  最后声明一下,Google SOAP Search API是属于实验产品,每个license每天最多只允许搜索一千次,其许可协议注明不能使用于商业模式的网站,而对于个人研究来说,每天一千次的搜索也就足够了。  相关专业名词解释:  Web Service:是一种革命性的分布是计算技术。它使用基于XML的消息处理作为基本的数据通讯方式,消除使用不同组件模型、操作系统和编程语言的系统之间存在的差异,使异类系统能够作为计算网络的一部分协同运行。开发人员可以使用像过去创建分布式应用程序时使用组件的方式,创建由各种来源的Web服务组合在一起的应用程序。由于Web服务是建立在一些通用协议的基础上,如HTTP(Hypertext Transfer Protocol, WWW服务程序所用的协议),SOAP(Simple Object Access Protocol,简单对象访问协议),XML,WSDL(Web Services Description Language,Web服务描述语言),UDDI(Universal Description,Discovery,and Integration,通用描述发现和集成协议)等,这些协议在涉及到操作系统、对象模型和编程语言的选择时,没有任何倾向,因此Web服务将会有很强的生命力。  SOAP:是&Simple Object Access Protocol&的缩写,SOAP是消息传递的协议,它规定了Web Services之间是怎样传递信息的。简单的说,SOAP规定了:  1. 传递信息的格式为XML.这就使Web Services能够在任何平台上,用任何语言进行实现。  2. 远程对象方法调用的格式。规定了怎样表示被调用对象以及调用的方法名称和参数类型等。  3. 参数类型和XML格式之间的映射。这是因为,被调用的方法有时候需要传递一个复杂的参数,例如,一个Person对象。怎样用XML来表示一个对象参数,也是SOAP所定义的范围。  WSDL:是&Web Services Description Language&的缩写。WSDL是Web Services的定义语言。当实现了某种服务的时候(如:股票查询服务),为了让别的程序调用,必须告诉大家服务接口。例如:服务名称,服务所在的机器名称,监听端口号,传递参数的类型,个数和顺序,返回结果的类型等等。这样别的应用程序才能调用该服务。WSDL协议就是规定了有关Web Services描述的标准。  UDDI:是&Universal Description, Discovery,and Integration&的缩写。简单说,UDDI用于集中存放和查找WSDL描述文件,起着目录服务器的作用。  XML:(eXtensible Markup Language,可扩展标记语言)是Internet上数据表示和数据交换的新标准。它是ISO(International Organization for Standardization,国际标准化组织)的SGML(Standard for General Markup Language,通用标记语言标准)的一个简化子集。XML关注信息本身,是Web上表示结构化信息的一种标准文本格式。与传统的注重页面信息显示的HTML(Hypertext Markup Language, 超文本链接标示语言)相比,关注于内容的XML具有以下诸多优点:良好的可扩展性,语言简单有效,可自行定义标记;内容与形式的分离,主要刻画数据内容,不考虑显示效果;有严格的语法要求,便于分析统一和与数据库信息转换;便于传输,为纯文本形式,可通过Http协议直接传输,可跨越防火墙;等等。XML的出现和发展对于Internet和Intranet产生了巨大的影响。
  除非注明,文章均为原创,转载请以链接形式标明本文地址
  本文地址:
唉, Google的soapapi 都不开放了。。
发现你的Feedburner广告开始展示了
.又帅又可爱
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.WSDLException (at /wsdl:definitions/types): faultCode=INVALID_WSDL: Encounteredillegal extension element 'types' in the context of a 'javax.wsdl.Definition'. Extension elements must be in a namespace other than WSDL's.:
at com.ibm.wsdl.xml.WSDLReaderImpl.parseExtensibilityElement(Unknown Source)...生成客户端代码出现这种错误!
我按照你的代码写批处理时遇到了问题set Axis_Lib=D:\work\edu\sourcecode\v.85\web\WEB-INF\libset Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%set Output_Path=D:\testset Package=com.google.api%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% GoogleSearch.wsdlAxis_Lib是我axis所在的目录Output_Path是生成java文件的目录这是我的理解 ,所以只修改了这两个,但还是报了错我把错也贴了出来,向你请教一下WARN - JavaUtils.isAttachmentSupported(1308) | Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachmentsupport is disabled.
感谢提供的信息,可惜谷歌以停止发上述Key了,我想做一个可以自动用多个关键词同时查询不同搜索引擎的工具,并且将第一页的结果同时存储下来。想请教是否可以指点如何做。感谢。
.flybutterfly
我在《Java Servlet & JSP Cookbook》(January 2004)第27章Using the Google and Amazon Web APIs看过类似的范例,不过我能运行google的范例程序,却不能运行Amazon的,因他给的好多链接都失效了。
赞助商广告
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享. 转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议.中国Java开发网 - 对WSDL规范中,soap:operation理解不是很深,style="rpc|document",有什么区别?
Topic: 对WSDL规范中,soap:operation理解不是很深,style="rpc|document",有什么区别?
1.对WSDL规范中,soap:operation理解不是很深,style="rpc|document",有什么区别?
Posted by: feiggle
Posted on:
如题,对这个理解不深,规范上说。。。。。。。。。。。。。。。。。The style attribute indicates whether the operation is RPC-oriented (messages containing parameters and return values) or document-oriented (message containing document). This information may be used to select an appropriate programming model.。。。。。。。。。。。。。。。。。这样是否意味着在实现时,编程模型是不一样的?具体情况如何呢?请各位赐教,或者给个link, thanks
2.Re:对WSDL规范中,soap:operation理解不是很深,style="rpc|document",有什么区别?
[Re: feiggle]
Posted by: pcdos
Posted on:
Powered by & Version Jute 1.5.6 Ent
Copyright &
Cjsdn Team. All Righits Reserved.
客服电话&&&&&客服信箱&&&&&客服QQ&714923IBM Bluemix
点击按钮,开始云上的开发!
developerWorks 社区
深入理解 WSDL 如何映射到 SOAP。在一般环境下,无须考虑 SOAP 消息中的命名空间。然而,在某些情况下,就必须要考虑这个问题。您可能需要手工创建 SOAP 消息,并在没有其它工具辅助下处理命名空间的问题。本文将专门针对这些情况来解决相关问题。
(), Web 服务顾问, IBM
Russell Butek 是一名 IBM Web 服务顾问。他是 IBM WebSphere Web 服务引擎的开发人员之一,也是 JAX-RPC Java Specification Request(JSR)专家组的成员。Russell Butek 的工作涉及 Apache 的 AXIS SOAP 引擎的实现,使 AXIS 1.0 符合 JAX-RPC。之前,他曾是一名 IBM CORBA ORB 的开发人员,也是许多 OMG 任务组的 IBM 代表,其中包括在可移植式拦截器任务组中担任要职。
引言在典型的 Web 服务场景中,通常使用工具技术来处理命名空间的所有细微差别。但是有些时候,特别是在使用 SAAJ(SOAP with Attachments API for Java)为特定的 Web 服务构造 SOAP 消息时,您必须自己处理命名空间问题。在没有任何工具辅助的情况下构造消息——或是部分消息时——可以使用该技巧。
虽然命名空间看似复杂,但您真正只需要掌握的是以下一份简短的规则清单:如果 WSDL 样式为 RPC,那么可在 WSDL 绑定的 wsdlsoap:body 元素中查看命名空间。
如果 wsdlsoap:body 有命名空间属性(且 Web 服务互操作性组织(WS-I)的 Basic Profile(参见参考资料部分)需要该属性用于 RPC 样式),那么这就是 SOAP 消息中操作元素的命名空间。如果 wsdlsoap:body 没有命名空间,那么该操作元素不符合要求。对于数据元素而言:如果元素通过根元素(不是根类型)定义,那么它的命名空间就是根元素的命名空间;如果元素不是通过根定义的,那么该元素不符合要求(对于该规则的说明请参见以下
部分的讨论。)这些都是简单的规则,但如同大多数规则一样,需要对其进行少许说明。本文的其余部分将展示使用这些规则的各类实例。
有两种常用类型的 Web 服务描述语言(WSDL)文件: RPC/literal 和 document/literal 封装。当然还有其它的类型,但在本文中只包含这两种。(各类 WSDL 的详细内容参见文章“我应该使用哪种样式的 WSDL?”——参见。)RPC/literal WSDL 中的 RPC/literal WSDL 有三个操作:op1、op2 和 op3。注意 WSDL 文件中用粗体强调的不同命名空间。清单 1. RPC/literal WSDL&?xml version="1.0" encoding="UTF-8"?&
&definitions
targetNamespace=""
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns=""
xmlns:data=""
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"&
targetNamespace=""
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns=""&
&element name="RefDataElem" type="int"/&
targetNamespace=""
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:ref=""
xmlns:tns=""
xmlns:xsd="http://www.w3.org/2001/XMLSchema"&
&import namespace=""/&
&complexType name="Data"&
&sequence&
&element name="data1" type="int"/&
&element name="data2" type="int"/&
&/sequence&
&/complexType&
&element name="DataElem" nillable=
"true" type="tns:Data"/&
&complexType name="Data2"&
&sequence&
&element ref="ref:RefDataElem"/&
&/sequence&
&/complexType&
&message name="op1Request"&
&part name="in" type="data:Data"/&
&/message&
&message name="op1Response"&
&part name="op1Return" type="data:Data"/&
&/message&
&message name="op2Request"&
&part name="in" type="data:Data"/&
&/message&
&message name="op2Response"&
&part name="op2Return" type="data:Data"/&
&/message&
&message name="op3Request"&
&part name="in1" element="data:DataElem"/&
&part name="in2" type="data:Data2"/&
&/message&
&message name="op3Response"&
&part name="op3Return" type="data:Data2"/&
&/message&
&portType name="Sample"&
&operation name="op1"&
&input message="tns:op1Request"/&
&output message="tns:op1Response"/&
&/operation&
&operation name="op2"&
&input message="tns:op2Request"/&
&output message="tns:op2Response"/&
&/operation&
&operation name="op3"&
&input message="tns:op3Request"/&
&output message="tns:op3Response"/&
&/operation&
&/portType&
&binding name="SampleSoapBinding" type="tns:Sample"&
&wsdlsoap:binding style="rpc" transport=
"http://schemas.xmlsoap.org/soap/http"/&
&operation name="op1"&
&wsdlsoap:operation soapAction=""/&
&wsdlsoap:body namespace=
"" use="literal"/&
&wsdlsoap:body namespace=
"" use="literal"/&
&/operation&
&operation name="op2"&
&wsdlsoap:operation soapAction=""/&
&wsdlsoap:body namespace=
"" use="literal"/&
&wsdlsoap:body namespace=
"" use="literal"/&
&/operation&
&operation name="op3"&
&wsdlsoap:operation soapAction=""/&
&wsdlsoap:body use="literal"/&
&wsdlsoap:body use="literal"/&
&/operation&
&/binding&
&service name="SampleService"&
&port binding="tns:SampleSoapBinding" name=
&wsdlsoap:address location=
"http://localhost:9080/RPCNamespaces/services/Sample"/&
&/service&
&/definitions&
查看用于每个操作的绑定的 wsdlsoap:body 元素中的命名空间。op1 和 op2 是规则
1.1 的实例(参见以下有关 SOAP 消息的内容)。op3 是规则 1.2 的实例。op1 展示了使用 targetNamespace 的常规实例——在这种情况下是“”——作为该操作的命名空间,但是这仅仅是通常情况。op2 使用的命名空间将不会在 WSDL 中的其他任何地方被使用。op3 无需定义任何命名空间。清单 、 和
分别展示了 op1、op2 和 op3 的 SOAP 消息。注意消息中用粗体强调的命名空间。清单 2. op1 的 RPC/literal 请求/响应 SOAP 消息&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p582:op1 xmlns:p582=""&
&data1&1&/data1&
&data2&2&/data2&
&/p582:op1&
&/soapenv:Body&
&/soapenv:Envelope&
&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p582:op1Response xmlns:p582=""&
&op1Return&
&data1&10&/data1&
&data2&20&/data2&
&/op1Return&
&/p582:op1Response&
&/soapenv:Body&
&/soapenv:Envelope&在上文中已经提及, 中的 SOAP 消息遵从规则 1.1。op1 的命名空间为“”。这些消息同样遵从规则 2.2。所有参数数据都不通过根元素定义,仅仅是根类型——数据——以及它的子元素。既然没有使用根元素,那么这些元素都是不合要求的。清单 3. op2 的 RPC/literal 请求/响应 SOAP 消息&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p999:op2 xmlns:p999=""&
&data1&3&/data1&
&data2&4&/data2&
&/p999:op2&
&/soapenv:Body&
&/soapenv:Envelope&
&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p999:op2Response xmlns:p999=""&
&op2Return&
&data1&300&/data1&
&data2&400&/data2&
&/op2Return&
&/p999:op2Response&
&/soapenv:Body&
&/soapenv:Envelope&
op1 和 op2 消息中的唯一真正差别(比较 和 )是:op2 的消息说明了可以使用任意选择的命名空间;无需使用 WSDL 定义的 targetNamespace。清单 4. op3 的 RPC/literal 请求/响应 SOAP 消息&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p10:DataElem xmlns:p10=
&data1&5&/data1&
&data2&6&/data2&
&/p10:DataElem&
&p971:RefDataElem xmlns:p971=
""&7&/p971:RefDataElem&
&/soapenv:Body&
&/soapenv:Envelope&
&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&op3Response&
&op3Return&
&p971:RefDataElem xmlns:p971=""&7&/p971:RefDataElem&
&/op3Return&
&/op3Response&
&/soapenv:Body&
&/soapenv:Envelope&
op3 和其它两个操作区别很大。首先,没有定义命名空间,因此根据规则 1.2, &op3& 和 &op3Response& 标签都是不合要求的。(注意:请记住 op3 不遵从 WS-I——参见 部分)。
第二,名为 in1 的部分是根元素而不是根类型。由于它是元素部分,因此它的名称被元素名称 DataElem 取代。由于使用了元素名称,则根据规则 2.1,必须使用元素的命名空间“”。
最后,规则 2.1 再次为 in2 的类型元素而调用。in2 引用了根元素:RefDataElem。该元素用其它命名空间定义:“”。 document/literal 封装的 WSDL 中的 WSDL 和 中的 WSDL 是等价的。它是 document/literal 封装而不是 RPC/literal。为这个 WSDL 而生成的 Java API 和为 RPC/literal WSDL 生成的 Java API 是相同,但它们的 SOAP 消息可能还是有些差别。命名空间再次用粗体标出。清单 5. document/literal 封装的 WSDL&?xml version="1.0" encoding="UTF-8"?&
&definitions
targetNamespace=""
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns=""
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"&
targetNamespace=""
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns=""&
&element name="RefDataElem" type="int"/&
targetNamespace=""
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:ref=""
xmlns:tns=""
xmlns:xsd="http://www.w3.org/2001/XMLSchema"&
&import namespace=""/&
&complexType name="Data"&
&sequence&
&element name="data1" type="int"/&
&element name="data2" type="int"/&
&/sequence&
&/complexType&
&element name="DataElem" nillable="true" type="tns:Data"/&
&complexType name="Data2"&
&sequence&
&element ref="ref:RefDataElem"/&
&/sequence&
&/complexType&
targetNamespace=""
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:data=""
xmlns:xsd="http://www.w3.org/2001/XMLSchema"&
&import namespace=""/&
&element name="op1"&
&complexType&
&sequence&
&element name="in" type="data:Data"/&
&/sequence&
&/complexType&
&/element&
&element name="op1Response"&
&complexType&
&sequence&
&element name="op1Return" type="data:Data"/&
&/sequence&
&/complexType&
&/element&
&element name="op2"&
&complexType&
&sequence&
&element name="in" type="data:Data"/&
&/sequence&
&/complexType&
&/element&
&element name="op2Response"&
&complexType&
&sequence&
&element name="op2Return" type="data:Data"/&
&/sequence&
&/complexType&
&/element&
&element name="op3"&
&complexType&
&sequence&
&element ref="data:DataElem"/&
&element name="in2" type="data:Data2"/&
&/sequence&
&/complexType&
&/element&
&element name="op3Response"&
&complexType&
&sequence&
&element name="op3Return" type="data:Data2"/&
&/sequence&
&/complexType&
&/element&
&message name="op1Request"&
&part element="tns:op1" name="parameters"/&
&/message&
&message name="op1Response"&
&part element="tns:op1Response" name="parameters"/&
&/message&
&message name="op2Request"&
&part element="tns:op2" name="parameters"/&
&/message&
&message name="op2Response"&
&part element="tns:op2Response" name="parameters"/&
&/message&
&message name="op3Request"&
&part element="tns:op3" name="parameters"/&
&/message&
&message name="op3Response"&
&part element="tns:op3Response" name="parameters"/&
&/message&
&portType name="Sample"&
&operation name="op1"&
&input message="tns:op1Request"/&
&output message="tns:op1Response"/&
&/operation&
&operation name="op2"&
&input message="tns:op2Request"/&
&output message="tns:op2Response"/&
&/operation&
&operation name="op3"&
&input message="tns:op3Request"/&
&output message="tns:op3Response"/&
&/operation&
&/portType&
&binding name="SampleSoapBinding" type="tns:Sample"&
&wsdlsoap:binding style="document" transport=
"http://schemas.xmlsoap.org/soap/http"/&
&operation name="op1"&
&wsdlsoap:operation soapAction=""/&
&wsdlsoap:body namespace=
"" use="literal"/&
&wsdlsoap:body namespace=
"" use="literal"/&
&/operation&
&operation name="op2"&
&wsdlsoap:operation soapAction=""/&
&wsdlsoap:body namespace=
"" use="literal"/&
&wsdlsoap:body namespace=
"" use="literal"/&
&/operation&
&operation name="op3"&
&wsdlsoap:operation soapAction=""/&
&wsdlsoap:body use="literal"/&
&wsdlsoap:body use="literal"/&
&/operation&
&/binding&
&service name="SampleService"&
&port binding="tns:SampleSoapBinding" name="Sample"&
&wsdlsoap:address location=
"http://localhost:9080/Wrapped/services/Sample"/&
&/service&
&/definitions&
对于 op1 而言,用于 document/literal 封装服务的 SOAP 消息和用于 RPC/literal 服务的 SOAP 消息是相同的。(参见 )。这是最常见的一类 document/literal 封装操作。请注意此时遵从的是规则 2.1 而不是规则 1.1;命名空间是从元素而不是从 wsdl:soapbody 获得。请注意 WSDL 中的约定,封装元素和 WSDL 自身一样,都是用相同的命名空间定义:“”。它们可以用任意的命名空间定义,根据该约定,document/literal 封装的消息和 RPC/literal 消息是相同的。op2 的 document/literal 封装的 SOAP 消息如 所示。清单 6.op2 的 Document/literal 封装的请求/响应 SOAP 消息&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p582:op2 xmlns:p582=""&
&data1&3&/data1&
&data2&4&/data2&
&/soapenv:Body&
&/soapenv:Envelope&
&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p582:op2Response xmlns:p582=""&
&op2Return&
&data1&300&/data1&
&data2&400&/data2&
&/op2Return&
&/p582:op2Response&
&/soapenv:Body&
&/soapenv:Envelope&
从 op2 的 document/literal 封装的消息可以更明显的看出,您遵循的是规则 2.1 而不是规则 1.1。此时完全忽略了绑定的 wsdl:soapbody 中的命名空间。
最后,对比 RPC/literal op3 的 SOAP 消息()和 document/literal 封装的 op3 SOAP 消息()。和 op2 一样,唯一的差别是 op3 的命名空间。 RPC 版本没有命名空间,但是 document 版本有命名空间;按照规则 2.1,如同其它所有的 document 消息一样,它从元素的命名空间来获取命名空间。清单 7. op3 的 Document/literal 封装的请求/响应 SOAP 消息&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p582:op3 xmlns:p582=""&
&p10:DataElem xmlns:p10=""&
&data1&5&/data1&
&data2&6&/data2&
&/p10:DataElem&
&p971:RefDataElem xmlns:p971=
""&7&/p971:RefDataElem&
&/p582:op3&
&/soapenv:Body&
&/soapenv:Envelope&
&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p582:op3Response xmlns:p582=""&
&op3Return&
&p971:RefDataElem xmlns:p971=
""&7&/p971:RefDataElem&
&/op3Return&
&/p582:op3Response&
&/soapenv:Body&
&/soapenv:Envelope&关于缺省命名空间您可以使用缺省命名空间来取消对前缀的需求。例如,如 所示,e 和 f 都在缺省命名空间中,此时定义命名空间为 urn:default;e 在缺省命名空间中的原因是因为缺省命名空间定义在 e 上,且 f 在其中的原因是因为 f 是 e 的子元素。清单 8. 缺省命名空间使用实例&e xmlns="urn:default"&
&/e&以下是一些建议:在实例数据中不要使用缺省命名空间。
如果使用缺省命名空间,在从上下文中取出某些内容时,例如&f/&——那么此时根本不知道该元素是否符合要求,或者该元素是否已通过某父元素定义为符合要求。
如果想使子元素符合要求,则必须引入空命名空间。例如,在 中,e 在 urn:default 命名空间中,且 f 通过看起来有些奇怪的方式,被定义为不合要求。清单 9. 缺省命名空间中不合要求名称的实例&e xmlns="urn:default"&
&f xmlns=""/&
&/e&elementFormDefault="qualified"
可对命名空间产生影响的模式属性是 elementFormDefault。该属性的缺省设置是“unqualified”,到目前为止您已经看到的,子元素是不合要求的。但是如果您将 elementFormDefault="qualified" 添加到 document/literal 封装的 WSDL 中的所有模式中,那么消息中所有的元素将通过其父元素的命名空间而被定义为符合要求。例如, 包含了 op3 操作的 document/literal 封装的消息,该消息来自 中的 WSDL,此时 elementFormDefault 是符合要求的。通常,您不希望使用 elementFormDefault="qualified" 属性,因为它会使消息变得臃肿。但是在一年甚至更久以前,在各厂商之间存在着互操作性问题,通过设置该属性有时可以解决这些问题。清单 10.使用 elementFormDefault="qualified" 的 op1 Document/literal 封装请求/响应 SOAP 消息&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p582:op1 xmlns:p582=""&
&p10:data1 xmlns:p10=
""&1&/p10:data1&
&p10:data2 xmlns:p10=
""&2&/p10:data2&
&/p582:in&
&/p582:op1&
&/soapenv:Body&
&/soapenv:Envelope&
&soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"&
&soapenv:Body&
&p582:op1Response xmlns:p582=""&
&p582:op1Return&
&p10:data1 xmlns:p10=
""&10&/p10:data1&
&p10:data2 xmlns:p10=
""&20&/p10:data2&
&/p582:op1Return&
&/p582:op1Response&
&/soapenv:Body&
&/soapenv:Envelope&结束语在一般环境下,无须考虑 SOAP 消息中的命名空间。然而,在某些情况下,例如,必须手工创建 SOAP 消息,就必须予以考虑。此时,您必须对 WSDL 如何映射到 SOAP 有深入的了解。如果按照本文中的规则操作,您就可以用合适的命名空间手写 SOAP 消息,并且不会出现问题。
您可以参阅本文在 developerWorks 全球站点上的 。查阅 W3C 的
规范。阅读文章(developerWorks,2003 年 10 月),了解 document/literal 封装的相关知识。
查阅 WSDL 规范 。了解更多关于
的内容。查阅 。浏览
组织的 Web 页面。 提供 JAX-RPC 1.1 规范的链接。 访问
以获取技术书籍的详细清单,其中有大量有关 的文章。通过参与
加入 developerWorks 社团。IBM developerWorks 组在全世界范围内有大量的,您可以免费查阅。需要更多资料?developerWorks 的 专区有大量信息丰富的文章,以及关于开发 Web 服务应用程序的初级、中级和高级教程。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
为灾难恢复构建应用,赢取现金大奖。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=SOA and web servicesArticleID=88446ArticleTitle=Web 服务编程技巧和窍门: 手工创建的 SOAP 消息中命名空间的处理publish-date=

我要回帖

更多关于 soap服务wsdl 的文章

 

随机推荐