基于 XML 的最著名的通信协议就是 SOAP 了,全称简单对象访问协议(Simple Object Access Protocol)。它使用 XML 编写简单的请求和回复消息,并用 HTTP 协议进行传输。
SOAP 将请求和回复放在一个信封里面,就像传递一个邮件一样。信封里面的信分抬头和正文。
- POST /purchaseOrder HTTP/1.1
- Host: www.geektime.com
- Content-Type: application/soap+xml; charset=utf-8
- Content-Length: nnn
- "1.0"?>
- <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
- <soap:Header>
- <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
- soap:mustUnderstand="1">1234
- m:Trans>
- soap:Header>
- <soap:Body xmlns:m="http://www.geektime.com/perchaseOrder">
-
- <order>
- <date>2018-07-01date>
- <className>趣谈网络协议className>
- <Author>刘超Author>
- <price>68price>
- order>
- m:purchaseOrder>
- soap:Body>
- soap:Envelope>
一种相对比较严谨的 Web 服务描述语言,WSDL(Web Service Description Languages)。它也是一个 XML 文件。
在这个文件中,要定义一个类型 order,与上面的 XML 对应起来。
- <wsdl:types>
- <xsd:schema targetNamespace="http://www.example.org/geektime">
- <xsd:complexType name="order">
- <xsd:element name="date" type="xsd:string"></xsd:element>
- <xsd:element name="className" type="xsd:string"></xsd:element>
- <xsd:element name="Author" type="xsd:string"></xsd:element>
- <xsd:element name="price" type="xsd:int"></xsd:element>
- </xsd:complexType>
- </xsd:schema>
- </wsdl:types>
接下来,需要定义一个 message 的结构。
- <wsdl:message name="purchase">
- <wsdl:part name="purchaseOrder" element="tns:order"></wsdl:part>
- </wsdl:message>
接下来,应该暴露一个端口。
- <wsdl:portType name="PurchaseOrderService">
- <wsdl:operation name="purchase">
- <wsdl:input message="tns:purchase"></wsdl:input>
- <wsdl:output message="......"></wsdl:output>
- </wsdl:operation>
- </wsdl:portType>
然后,我们来编写一个 binding,将上面定义的信息绑定到 SOAP 请求的 body 里面。
- <wsdl:binding name="purchaseOrderServiceSOAP" type="tns:PurchaseOrderService">
- <soap:binding style="rpc"
- transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="purchase">
- <wsdl:input>
- <soap:body use="literal" />
- </wsdl:input>
- <wsdl:output>
- <soap:body use="literal" />
- </wsdl:output>
- </wsdl:operation>
- </wsdl:binding>
最后,我们需要编写 service。
- <wsdl:service name="PurchaseOrderServiceImplService">
- <wsdl:port binding="tns:purchaseOrderServiceSOAP" name="PurchaseOrderServiceImplPort">
- <soap:address location="http://www.geektime.com:8080/purchaseOrder" />
- </wsdl:port>
- </wsdl:service>
UDDI(Universal Description, Discovery, and Integration),也即统一描述、发现和集成协议。它其实是一个注册中心,服务提供方可以将上面的 WSDL 描述文件,发布到这个注册中心,注册完毕后,服务使用方可以查找到服务的描述,封装为本地的客户端进行调用。
此文章为10月Day3学习笔记,内容来源于极客时间《趣谈网络协议》,推荐该课程。