<h2>传输处理流程图</h2>
<h2>soap 概念</h2>
SOAP(Simple Object Accrss Protocol,简单对象访问协议)是一种简单的基于XML的协议,可以使应用程序在分散或分布式的环境中通过HTTP来交换信息。
SOAP基于XML语言和XSD标准,其定义了一套编码规则,编码规则定义如何将数据表示为消息,以及怎样通过HTTP协议来传输SOAP消息,由四部分组成:
(1) SOAP信封(Envelope):定义了一个框架,框架描述了消息中的内容是什么,包括消息的内容、发送者、接收者、处理者以及如何处理消息。
(2)SOAP编码规则:定义了一种系列化机制,用于交换应用程序所定义的数据类型的实例。
(3) SOAP RPC表示:定义了用于表示远程过程调用和应答协定。
(4)SOAP绑定:定义了一种使用底层传输协议来完成在节点间交换SOAP信封的约定。
SOAP消息基本上是从发送端到接收端的单向传输,常常结合起来执行类似于请求/应答的模式。不需要把SOAP消息绑定到特定的协议,SOAP可以运行在任何其他传输协议(HTTP、SMTP、FTP等)上。另外,SOAP提供了标准的RPC方法来调用Web Service以请求/响应模式运行。
SOAP是Web Service的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,可以支持不同的底层接口,像HTTP(S)或者SMTP。
应用程序通过使用远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信的方式会产生兼容性以及安全问题;防火墙和代理服务器通常会阻止此类流量。通过 HTTP 在应用程序间通信是更好的方法,因为 HTTP 得到了所有的因特网浏览器及服务器的支持。SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信。
<h2>学习记录</h2>
portType 记录了访问的接口name 输入参数的关联message格式,返回参数的关联的message格式,是否有返回参数等
message 记录了输入/输出的参数内容以及参数格式等信息
<definitions><!--WSDL文档的根元素-->
<types>
<schema><!-- 定义数据类型 int float string等 -->
<element name="myMethod">
<complexType>
<sequence>
<element name="x" type="xsd:int"/>
<element name="y" type="xsd:float"/>
</sequence>
</complexType>
</element>
<element name="myMethodResponse">
<complexType/>
</element>
</schema>
</types>
<import></import>
<message name="aa">
<part name="param" type="xsd:string"/><!--参数名叫param 参数类型是string-->
</message>
<message name="bb">
<part name="res" type="xsd:string"/><!--返回的参数名叫res 参数类型是string-->
</message>
<portType name="testApi"><!--接口名-->
<operation name="api"><!-- 方法名 -->
<input message="typens:aa"> <!-- 接口传入的参数,详情查看message标签name="aa"-->
<output message="typens:bb"> <!-- 接口返回的参数,详情查看message标签name="bb" -->
</operation>
</portType>
<binding name="test" type="typens:testApi"><!-- 访问文件中的哪个接口 -->
<!--RPC: 采用客户端/服务器方式(请求/响应),发送请求到服务器端,服务端执行方法后返回结果。优点是跨语言跨平台,缺点是编译时无法排错,只能在运行时检查。 -->
<!--Document: 与RPC相比较Document方式在XML文件中不是做远程方法的映射,而是一份完整的自包含的业务文档。当服务器端收到这份文档后,先进行预处理(比如词汇的翻译和映射),然后再构造出返回消息。这个构造返回消息的过程中,往往不再是简简单单的一个方法调用,而是多个对象协同完成一个事务的处理,再将结果返回。 -->
<!-- style用于确定SOAP消息的格式,即是否使用Schema定义数据类型,以及operation名称是否出现在SOAP消息中。 -->
<soap:binding style="rpc" transport="web link"/><!-- 这是一个消息绑定语句 style是消息发送获取的方式投入 transport是请求网址 -->
<!-- rpc type -->
<!-- <message name="myMethodRequest"> -->
<!-- <part name="x" type="xsd:int"/> -->
<!-- <part name="y" type="xsd:float"/> -->
<!-- </message> -->
<!-- <message name="empty"/> -->
<!-- <portType name="PT"> -->
<!-- <operation name="myMethod"> 会在请求中带上operation-->
<!-- <input message="myMethodRequest"/> -->
<!-- <output message="empty"/> -->
<!-- </operation> -->
<!-- </portType> -->
<!-- document type -->
<!-- <types> -->
<!-- <schema> -->
<!-- <element name="xElement" type="xsd:int"/> -->
<!-- <element name="yElement" type="xsd:float"/> -->
<!-- </schema> -->
<!-- </types> -->
<!-- <message name="myMethodRequest"> -->
<!-- <part name="x" element="xElement"/> -->
<!-- <part name="y" element="yElement"/> -->
<!-- </message> -->
<!-- <message name="empty"/> -->
<!-- <portType name="PT"> -->
<!-- <operation name="myMethod"> -->
<!-- <input message="myMethodRequest"/> -->
<!-- <output message="empty"/> -->
<!-- </operation> -->
<!-- </portType> -->
<operation name="function name">
<!-- 如果使用HTTP作为底层传输协议,可以使用SOAPAction属性绑定操作的名称来解决消息分发的问题。虽然大多数情况下都是使用HTTP协议来传输SOAP消息,但是这种方法绑定了底层传输协议,限制了其他传输协议的使用。 -->
<soap:operation soapAction="urn:function name+Action"/>
<input><!-- 传入参数 -->
<soap:body namespace="urn:空间名" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<!-- use用于确定SOAP消息的编码方式,即数据类型是否出现在SOAP消息中 -->
<!-- literal,encoded literal使用文本的形式展现(类似文本传参) encoded编码形式-->
<!-- encode type -->
<!-- <soap:envelope> -->
<!-- <soap:body> -->
<!-- <myMethod> -->
<!-- <x xsi:type="xsd:int">5</x><!-- 有类型 int--> -->
<!-- <y xsi:type="xsd:float">5.0</y> -->
<!-- </myMethod> -->
<!-- </soap:body> -->
<!-- </soap:envelope> -->
<!-- literal type -->
<!-- <soap:envelope> -->
<!-- <soap:body> -->
<!-- <myMethod> -->
<!-- <x>5</x><!--没类型--> -->
<!-- <y>5.0</y> -->
<!-- </myMethod> -->
<!-- </soap:body> -->
<!-- </soap:envelope> -->
</input>
</operation>
</binding>
<service name="testname"><!-- name可设置成接口文件地址 -->
<port name="port" binding="typens:test">
<soap:address location=""/>
<!--
"soap:address" is used to specify an address where the Web service can be accessed.
用于指定可以访问的web服务器地址
location里面是访问接口文件的地址 -->
</port>
</service>
</definitions>