参考链接:http://www.blogjava.net/orangelizq/archive/2008/04/22/194903.html
名词解析:
有效负载:soap的body内容。
抽象类型定义(abstract type definitions):即在SOAP schema中已经定义的类型(
xmlns:soapenc
)。)。
1、 <wsdl:definitions>重要元素的定义
Target namespace :表示该文件定义Node的命名空间。比如:该文件定义的Binding,message,portType,types的名字(以免与其他文件定义的Node name一样的时候,可以区分)。
Prefix :表示前面的Target namespace在该文档的间写。当引用文档前面定义的Node,用Prefix+":"+nodeName来指代前面定义的Node。
如何定义wsdl:definitions:在本文中,prefix是tns.
如何使用prefix
2、<wsdl:service>定义
一个对外提供的服务,如果通过不同的方式被访问,就必须提供共用同一个portType的不同的port.
对于同一个portType(相当于服务的方法),可以通过不同的协议被其他程序(JMS,Soap,http)调用。同一个portType,如果同时用SOAP和JMS方式被调用,必须定义两个不同的binding和port.
3、<wsdl:port>
一个port只能定义一个address,而且不能定义其他binding的属性(除了Address)。
<wsdl:port>:定义一个binding的endpoint.
binding属性引用了一个前面定义的binding.
soap:Address节点提供给其他程序调用的一个endpoint.
注意:假如一个service提供了不同的port(这些port却共用同一个portType),他们的address或binding有可能不一样。
如何声明服务基于HTTP协议
如何声明服务基于JMS协议
4、<wsdl:binding>
定义了以下几个内容:
(1)定义了operation name
(2) 通过定义PortType 来定义operation 的input 和output message format.
(3) 定义了传输消息(SOAP)的文本格式
(4) 定义了网络传输协议(http,smtp,jms)或消息传输协议(soap,mine),比如可以讲PortType与SOAP/HTTP绑定,也可以将MIME/SMTP绑定。
(1)
style描述了服务调用方式,即rpc||document.rpc和document的差别在于soap消息是否包含了operation name.如果是rpc样式,要执行的方法也是有效负载的根目录。
------------style="document"的soap文本不需要说明operation name--------------------
transport:指定了soap消息传输的协议(soap/http,soap/smtp,soap/jms)
-----------soap消息传输基于http协议------------------------
5、
由于方法的多态性,所以单纯的一个name属性不能完全indentify一个operation,还需要input和output。binding定义的opeation name,input name,output name会和portType相对应的节点唯一对应。
style和wsdl:binding的style属性一样,有rpc||document两种。
soapAction:如果soap是基于http网络传输的话,就一定要有soapAction这个属性。且这个属性的值会放到request的header里面,且必须与wsdl定义的soapAction值一样。
req.setRequestHeader('SOAPAction','urn:getPrice');
(二)SOAP 元素解析
1、
说明了input,out,fault部分在SOAP BODY的structure.即定义了如何解析message的part部分。Message的part部分是简单抽象类型abstract type definitions(type="........"), or concrete schema definitions抽象具体的schema定义(element="........")。
encodingStyle属性的用法:
如果Message part是抽象类型定义(type="........"),将根据
use属性用法:
如果use="encoded",Message Part内容是采用标准编码来定义,即是否用XSD定义的原型类型(String,int,boolean等)来定义, 构造soap:body的具体消息
如果use="literal",Message Part内容将通过Element或type来引用Types中的
如果use属性值为encoded,那么每个message part将通过type属性指定一个抽象类型。通过encodingStyle属性所表示的编码规范,这些抽象类型将用于构造一个具体的消息。part names, types a以及 value of the namespace attribute将作为编码的输入,其中的namespace attribute仅仅在内容中被应用,没有被abstract types显式定义。如果所指定的encoding style允许variations(变化)它的格式,那么所有的variations(变化)都将被支持。
如果use属性值为literal,那么每个message part将通过element或者type属性指向一个具体的schema定义。在第一种情况下,part中的element 所指向的内容将直接位于Body元素下(对于document style bindings),或者位于Body元素下的wrapper element元素中(对于rpc style)。在第二种情况下,part中的type所指向的内容将作为其所对应元素的schema类型。
一个use="encoded" ,encodingStyle="....."的WSDL文档。
SOAP的发送消息:jsx1:getAttemptHistory 的命名空间和
SOAP的接收消息