上一节:
下一节:

  XML Soap

  • 定义和使用

    SOAP 代表简单对象访问协议
    SOAP 是一种应用程序通信协议
    SOAP 是一种用于发送和接收消息的格式
    SOAP 与平台无关
    SOAP 基于 XML
    SOAP 是 W3C 的建议

    SOAP 构建块

    SOAP 消息是包含以下元素的普通XML文档:
    • 将 XML 文档标识为 SOAP 消息的 Envelope 元素
    • 包含标题信息的 Header 元素
    • 包含通话和响应信息的 Body 元素
    • 包含错误和状态信息的故障元素
    以下是一些重要的语法规则:
    • SOAP消息必须使用XML进行编码
    • SOAP消息必须使用SOAP Envelope命名空间
    • SOAP消息必须使用SOAP编码名称空间
    • SOAP消息不得包含DTD参考
    • SOAP消息不得包含XML处理指令
    骨架 SOAP 消息
    <?xml version="1.0"?>
    
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    
    <soap:Header>
    ...
    </soap:Header>
    
    <soap:Body>
    ...
      <soap:Fault>
      ...
      </soap:Fault>
    </soap:Body>
    
    </soap:Envelope>
    
    必需的 SOAP Envelope 元素是 SOAP 消息的根元素。 此元素将XML文档定义为 SOAP 消息。骨架 SOAP 消息
    <?xml version="1.0"?>
    
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      ...
      Message information goes here
      ...
    </soap:Envelope>
    
    注意上面示例中的 xmlns:soap 命名空间。 它的值应始终为:"http://www.w3.org/2003/05/soap-envelope/"。
    命名空间将信封定义为SOAP信封。
    如果使用其他名称空间,则应用程序将生成错误并丢弃消息。
  • encodingStyle 属性

    encodingStyle 属性用于定义文档中使用的数据类型。 此属性可以出现在任何 SOAP 元素上,并且适用于该元素的内容和所有子元素。
    SOAP 消息没有默认编码。
    语法
    soap:encodingStyle="URI"
    
    示例
    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      ...
      消息信息在这里
      ...
    </soap:Envelope>
    
  • SOAP 标头元素

    可选的 SOAP Header 元素包含有关 SOAP 消息的特定于应用程序的信息(例如,身份验证,付款等)。
    如果存在 Header 元素,则它必须是 Envelope 元素的第一个子元素。
    注意:Header 元素的所有直接子元素必须是名称空间限定的。
    <?xml version="1.0"?>
    
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    
    <soap:Header>
      <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
      soap:mustUnderstand="1">234
      </m:Trans>
    </soap:Header>
    ...
    ...
    </soap:Envelope>
    
    上面的示例包含带有 "Trans" 元素的标头,值为 1 的 "mustUnderstand" 属性和值为 234。
    SOAP 在默认名称空间中定义了三个属性。 这些属性是:mustUnderstand,actor和encodingStyle。
    SOAP 标头中定义的属性定义了接收者应如何处理 SOAP 消息。
  • mustUnderstand 属性

    SOAP mustUnderstand 属性可用于指示标题条目对于接收者来说是必需的还是可选的。
    如果将 mustUnderstand ="1" 添加到 Header 元素的子元素,则表明处理 Header 的接收者必须识别该元素。 如果接收方无法识别该元素,则在处理标头时它将失败。
    语法
    soap:mustUnderstand="0|1"
    
    示例
    <?xml version="1.0"?>
    
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    
    <soap:Header>
      <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
      soap:mustUnderstand="1">234
      </m:Trans>
    </soap:Header>
    ...
    ...
    </soap:Envelope>
    
  • actor 属性

    通过沿着消息路径传递不同的端点,SOAP 消息可以从发送者传播到接收者。 但是,并非 SOAP 消息的所有部分都可以用于最终端点,而是可以用于消息路径上的一个或多个端点。
    SOAP actor 属性用于将 Header 元素寻址到特定端点。
    语法
    soap:actor="URI"
    
    示例
    <?xml version="1.0"?>
    
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    
    <soap:Header>
      <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
      soap:actor="http://www.w3schools.com/appml/">234
      </m:Trans>
    </soap:Header>
    ...
    ...
    </soap:Envelope>
    
  • encodingStyle 属性

    encodingStyle 属性用于定义文档中使用的数据类型。 此属性可以出现在任何 SOAP 元素上,并将应用于该元素的内容和所有子元素。
    SOAP消息没有默认编码。
    语法
    soap:encodingStyle="URI"
    
  • SOAP 主体元素

    必需的 SOAP Body 元素包含用于消息最终端点的实际 SOAP 消息。
    SOAP Body 元素的直接子元素可以是名称空间限定的。
    <?xml version="1.0"?>
    
      <soap:Envelope
      xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
      soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      
      <soap:Body>
        <m:GetPrice xmlns:m="http://www.w3schools.com/prices">
          <m:Item>Apples</m:Item>
        </m:GetPrice>
      </soap:Body>
      
    </soap:Envelope>
    
    上面的示例要求苹果的价格。 请注意,上面的 m:GetPrice 和 Item 元素是特定于应用程序的元素。 它们不是 SOAP 名称空间的一部分。
    SOAP 响应可能如下所示:
    <?xml version="1.0"?>
    
      <soap:Envelope
      xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
      soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      
      <soap:Body>
        <m:GetPriceResponse xmlns:m="http://www.w3schools.com/prices">
          <m:Price>1.90</m:Price>
        </m:GetPriceResponse>
      </soap:Body>
      
    </soap:Envelope>
    
  • SOAP Fault 元素

    可选的 SOAP Fault 元素用于指示错误消息。
    SOAP Fault 元素保存 SOAP 消息的错误和状态信息。
    如果存在 Fault 元素,则它必须显示为 Body 元素的子元素。 Fault 元素只能在 SOAP 消息中出现一次。
    SOAP Fault 元素具有以下子元素:
    子元素 描述
    <faultcode> 识别故障的代码
    <faultstring> 易于理解的故障解释
    <faultactor> 有关由谁引起故障的信息
    <detail> 包含与Body元素相关的应用程序特定的错误信息
  • SOAP 故障代码

    描述故障时,必须在故障代码元素中使用以下定义的故障代码值:
    Error 描述
    VersionMismatch 为SOAP Envelope元素找到了无效的名称空间
    MustUnderstand 必须理解 MustUnderstand 必须将 mustUnderstand 属性设置为 "1" 的 Header 元素的直接子元素。
    Client 邮件格式不正确或包含错误信息
    Server 服务器出现问题,因此消息无法继续
  • HTTP 协议

    HTTP 通过 TCP/IP 进行通信。 HTTP 客户端使用 TCP 连接到 HTTP 服务器。 建立连接后,客户端可以向服务器发送 HTTP 请求消息:
    POST /item HTTP/1.1
    Host: 189.123.255.239
    Content-Type: text/plain
    Content-Length: 200
    
    然后,服务器处理该请求,并将HTTP响应发送回客户端。 响应包含指示请求状态的状态码:
    200 OK
    Content-Type: text/plain
    Content-Length: 200
    
    在上面的示例中,服务器返回了状态代码 200。这是 HTTP 的标准成功代码。
    如果服务器无法解码请求,则它可能返回了以下内容:
    400 Bad Request
    Content-Length: 0
    
    SOAP 规范定义 SOAP 消息的结构,而不是如何交换它们。 所谓的 "SOAP绑定" 填补了这一空白。 SOAP 绑定是允许使用传输协议有效交换 SOAP 消息的机制。
    大多数 SOAP 实现都为常见的传输协议(例如HTTP或SMTP)提供绑定。
    HTTP 是同步的并且被广泛使用。 SOAP HTTP 请求至少指定两个 HTTP 标头:Content-Type 和 Content-Length。
    SMTP 是异步的,在万不得已时或在特定情况下使用。
    SOAP 的 Java 实现通常为 JMS(Java消息系统)协议提供特定的绑定。

    Content-Type

    SOAP 请求和响应的 Content-Type 标头定义了消息的 MIME 类型以及用于请求或响应的 XML 主体的字符编码(可选)。
    语法
    Content-Type: MIMEType; charset=character-encoding
    
    示例
    POST /item HTTP/1.1
    Content-Type: application/soap+xml; charset=utf-8
    

    Content-Length

    SOAP 请求和响应的 Content-Length 标头指定请求或响应的正文中的字节数。
    语法
    Content-Length: bytes
    
    示例
    POST /item HTTP/1.1
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: 250
    
  • SOAP 示例

    在下面的示例中,GetStockPrice 请求被发送到服务器。 该请求具有一个 StockName 参数和一个将在响应中返回的 Price 参数。 该函数的名称空间在 "http://www.example.org/stock" 中定义。

    SOAP请求:

    POST /InStock HTTP/1.1
    Host: www.example.org
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: nnn
    
    <?xml version="1.0"?>
    
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    
    <soap:Body xmlns:m="http://www.example.org/stock">
      <m:GetStockPrice>
        <m:StockName>IBM</m:StockName>
      </m:GetStockPrice>
    </soap:Body>
    
    </soap:Envelope>
    
    SOAP响应:
    HTTP/1.1 200 OK
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: nnn
    
    <?xml version="1.0"?>
    
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    
    <soap:Body xmlns:m="http://www.example.org/stock">
      <m:GetStockPriceResponse>
        <m:Price>34.5</m:Price>
      </m:GetStockPriceResponse>
    </soap:Body>
    
    </soap:Envelope>
    
上一节:
下一节: