工具资源

SOAP Web Services是什么,SOAP教程

Pinterest LinkedIn Tumblr

SOAP 是一种基于 XML 的协议,用于通过 HTTP 访问 Web 服务。它有一些规范可以用于所有的应用程序。SOAP 的开发是为了作为一种中间语言,以便使用各种编程语言构建的应用程序可以轻松地相互通信并避免极端的开发工作。SOAP教程介绍了Web服务开发工作的基础知识。

SOAP 被称为 Simple Object Access Protocol,但在后来的时间里,它只被简称为 SOAP v1.2。SOAP 是一种协议,或者换句话说,是一种定义 Web 服务之间或调用它们的客户端应用程序之间如何相互通信的方法。

SOAP教程

SOAP 简介

在当今世界上,有大量的应用程序是使用不同的编程语言构建的。例如,可能有一个用 Java 设计的 Web 应用程序,另一个用 .Net 设计的,还有一个用 PHP 设计的。

在应用程序之间进行数据交换在今天的网络化世界中至关重要。但是这些异构应用程序之间的数据交换将会很复杂。因此,完成此数据交换的代码的复杂性也会很高。

用于应对这种复杂性的方法之一是使用 XML(可扩展标记语言)作为应用程序之间交换数据的中间语言。

每种编程语言都可以理解 XML 标记语言。因此,XML 被用作数据交换的基础介质。

但是,没有关于在所有编程语言中使用 XML 进行数据交换的标准规范。这就是 SOAP 软件的作用所在。

SOAP 被设计为与 XML 在 HTTP 上工作,并且具有可以用于所有应用程序的某种规范。我们将在后续章节中详细介绍 SOAP 协议。

SOAP 的优点

SOAP 是用于应用程序之间数据交换的协议。以下是使用 SOAP 的原因。

  • 在开发基于 SOAP 的 Web 服务时,您需要具有一些可用于 Web 服务与调用应用程序交互的语言。SOAP 是实现此目的的完美介质。此协议也由 W3C 联盟推荐,该联盟是所有 Web 标准的管理机构。
  • SOAP 是用于应用程序之间数据交换的轻量级协议。请注意关键字“轻量级”。由于 SOAP 编程基于 XML 语言,而 XML 本身是一种轻量级数据交换语言,因此 SOAP 作为一种协议也属于同一类别。
  • SOAP 被设计为平台无关,并且也被设计为操作系统无关。因此,SOAP 协议可以在基于 Windows 和 Linux 平台的任何编程语言的应用程序上工作。
  • 它在 HTTP 协议上工作——SOAP 在 HTTP 协议上工作,这是默认协议,所有 Web 应用程序都使用它。因此,在运行基于 SOAP 协议构建的 Web 服务以在互联网上工作时,无需任何自定义。

SOAP 构建块

SOAP 规范定义了所谓的“SOAP 消息”,这是发送到 Web 服务和客户端应用程序的内容。

下面的 SOAP 架构图显示了 SOAP 消息的各个构建块。

SOAP 消息的构建块

SOAP 消息只是一个简单的 XML 文档,其中包含以下组件。

  • 一个信封元素,用于将 XML 文档标识为 SOAP 消息——这是 SOAP 消息的包含部分,用于封装 SOAP 消息中的所有细节。这是 SOAP 消息中的根元素。
  • 包含头信息的头元素——头元素可以包含例如调用应用程序可以使用的身份验证凭据之类的信息。它还可以包含可在 SOAP 消息中使用的复杂类型的定义。默认情况下,SOAP 消息可以包含参数,这些参数可以是简单类型(例如字符串和数字),但也可以是复杂对象类型。

下面是一个复杂类型的简单 SOAP 服务示例。

假设我们想要发送一个结构化数据类型,其中包含“教程名称”和“教程描述”的组合,那么我们将定义复杂类型如下所示。

通过元素标记 xsd:complexType 定义了复杂类型。然后,在复杂类型集合中定义了结构的所有所需元素及其各自的数据类型。

<xsd:complexType>
 <xsd:sequence>
 	<xsd:element name="Tutorial Name" type="string"/>
  	<xsd:element name="Tutorial Description"  type="string"/>
  </xsd:sequence>
</xsd:complexType>
  • 包含调用和响应信息的正文元素——该元素包含实际需要在 Web 服务和调用应用程序之间发送的数据。下面是一个 SOAP Web 服务示例,其中 SOAP 正文实际上是在标题部分定义的复杂类型。这是发送到调用此 Web 服务的应用程序的教程名称和教程描述的响应。
<soap:Body>
   <GetTutorialInfo>
		<TutorialName>Web Services</TutorialName>
		<TutorialDescription>All about web services</TutorialDescription>
   </GetTutorialInfo>
</soap:Body>

SOAP 消息结构

需要注意的一点是,当调用 Web 服务时,SOAP 消息通常是由 Web 服务自动生成的。

每当客户端应用程序调用 Web 服务中的方法时,Web 服务将自动生成 SOAP 消息,其中包含将从 Web 服务发送到客户端应用程序的数据的必要详细信息。

正如在本 SOAP 教程的上一主题中所讨论的那样,简单的 SOAP 消息具有以下元素 –

  • Envelope 元素
  • Header 元素和
  • Body 元素
  • Fault 元素(可选)

让我们看一下下面的简单 SOAP 消息示例,并查看实际执行什么元素。

SOAP 消息结构

  1. 如上所示,SOAP 消息的第一部分是封装整个 SOAP 消息的 envelope 元素。
  2. 接下来的元素是 SOAP body,其中包含实际消息的详细信息。
  3. 我们的消息包含一个名为“Tizivps”的 Web 服务。
  4. “Tizivps”接受类型为’int’的参数,名称为 TutorialID。

现在,上述 SOAP 消息将在 Web 服务和客户端应用程序之间传递。

您可以看到上述信息对客户端应用程序有多有用。SOAP 消息告诉客户端应用程序 Web 服务的名称,以及它期望的参数以及 Web 服务所采用的每个参数的类型。

SOAP Envelope 元素

构建块的第一部分是 SOAP Envelope。

SOAP Envelope 用于封装 SOAP 消息之间交换的所有必要细节,这些细节是 Web 服务和客户端应用程序之间交换的。

SOAP envelope 元素用于指示 SOAP 消息的开始和结束。这使得调用 Web 服务的客户端应用程序知道 SOAP 消息何时结束。

SOAP envelope 元素可以注意以下几点。

  • 每个 SOAP 消息都需要一个根 Envelope 元素。对于 SOAP 消息,必须具有 envelope 元素。
  • 每个 envelope 元素都需要至少一个 soap body 元素。
  • 如果 envelope 元素包含 header 元素,则它必须不多于一个,并且必须作为 envelope 的第一个子级出现,在 body 元素之前。
  • 当 SOAP 版本更改时,envelope 也会更改。
  • 满足 v1.1 标准的 SOAP 处理器在接收到包含 v1.2 envelope 命名空间的消息时会生成故障。
  • 满足 v1.2 标准的 SOAP 处理器会生成版本不匹配的故障,如果它接收不包括 v1.2 envelope 命名空间的消息。

以下是 SOAP Envelope 元素版本 1.2 的 SOAP API 示例。

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="<http://www.w3.org/2001/12/soap-envelope>" SOAP-ENV:encodingStyle=" <http://www.w3.org/2001/12/soap-encoding>">
          <soap:Body>
        <Tizivps xmlns="<http://tempuri.org/>">
                  <TutorialID>int</TutorialID>
                </Tizivps>
          </soap:Body>
</SOAP-ENV:Envelope>

Fault 消息

当向 SOAP Web 服务发出请求时,返回的响应可能是成功响应或错误响应。当生成成功时,服务器的响应将始终是 SOAP 消息。但是,如果生成 SOAP 故障,则将其作为“HTTP 500”错误返回。

SOAP 故障消息由以下元素组成。

  1. <faultCode> – 这是指定错误代码的代码。故障代码可以是以下任何一个值
    1. SOAP-ENV:VersionMismatch – 当遇到 SOAP Envelope 元素的无效命名空间时。
    2. SOAP-ENV:MustUnderstand – Header 元素的一个立即子元素,其 mustUnderstand 属性设置为“1”,未被理解。
    3. SOAP-ENV:Client – 消息格式不正确或包含不正确的信息。
    4. SOAP-ENV:Server – 服务器出现问题,因此消息无法继续进行。
  2. <faultString> – 这是给出错误详细信息的文本消息。
  3. <faultActor>(可选) – 这是一个文本字符串,指示谁引起了故障。
  4. <detail>(可选) – 这是应用程序特定错误消息的元素。因此,应用程序可以针对不同的业务逻辑情况具有特定的错误消息。

故障消息示例

如果客户端尝试在 GetTutorial 类中使用 TutorialID 方法,则会生成以下示例故障消息。

如果定义的类中不存在该方法,则生成以下故障消息。

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="<http://schemas.xmlsoap.org/soap/envelope/>" xmlns:xsi="<http://www.w3.org/1999/XMLSchema-instance>" xmlns:xsd="<http://www.w3.org/1999/XMLSchema>">
      <SOAP-ENV:Body>
         <SOAP-ENV:Fault>
         <faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode>
        <faultstring xsi:type="xsd:string">
            Failed to locate method (GetTutorialID) in class (GetTutorial)
         </faultstring>
    </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

输出:

当您执行上面的代码时,它将显示错误,如“找不到 GetTutorial 类中的方法 (GetTutorialID)”。

SOAP 通信模型

SOAP 的所有通信都通过 HTTP 协议完成。在 SOAP 出现之前,许多 Web 服务使用标准 RPC(Remote Procedure Call)样式进行通信。这是最简单的通信类型,但它有很多限制。

现在在这个 SOAP API 教程中,让我们考虑以下图表以了解此通信如何工作。在此示例中,假设服务器托管了一个 Web 服务,该服务提供了 2 种方法,如下所示:

  • GetEmployee – 这将获取所有员工详细信息
  • SetEmployee – 这将根据需要设置详细信息,如员工部门、工资等。

在正常的 RPC 样式通信中,客户端只需在其请求中调用方法并将所需参数发送到服务器,然后服务器将发送所需的响应。

上述通信模型具有以下严重限制

  1. 不是语言无关的 – 托管方法的服务器将位于特定的编程语言中,通常对服务器的调用只能使用该编程语言。
  2. 不是标准协议 – 当调用远程过程时,调用不通过标准协议执行。这是个问题,因为几乎所有的 Web 通信都必须通过 HTTP 协议完成。
  3. 防火墙 – 由于 RPC 调用不走常规协议,因此需要在服务器上打开单独的端口,以允许客户端与服务器通信。通常,所有防火墙都会阻止此类流量,并且通常需要进行大量配置,以确保客户端和服务器之间的此类通信可以正常工作。

为了克服上述所有限制,SOAP 将使用以下通信模型

  1. 客户端将过程调用及其任何参数的信息格式化为 SOAP 消息,并将其作为 HTTP 请求的一部分发送到服务器。将数据封装到 SOAP 消息中的过程称为封送
  2. 服务器然后会打开客户端发送的消息,查看客户端请求的内容,然后将适当的响应作为 SOAP 消息发送回客户端。解开客户端发送的请求的做法被称为解组

实际的 SOAP 示例

现在,在这个 SoapUI 教程中,让我们看一个实际的 SOAP 示例,

最好的一个查看 SOAP 消息如何生成的方法之一,是实际上看到一个 Web 服务的操作。

本主题将介绍如何使用 Microsoft.Net 框架构建 ASMX Web 服务。这种类型的 Web 服务支持 SOAP 版本 1.1 和版本 1.2。

ASMX Web 服务会自动生成 Web 服务定义语言(WSDL)文档。调用客户端应用程序需要此 WSDL 文档,以便应用程序知道 Web 服务能够做什么。

在我们的示例中,我们将创建一个简单的 Web 服务,该服务将用于向调用 Web 服务的应用程序返回字符串。

此 Web 服务将托管在 Asp.Net Web 应用程序中。然后,我们将调用 Web 服务,并查看 Web 服务返回的结果。

Visual Studio 还将向我们显示 Web 服务和调用应用程序之间传递的 SOAP 消息。

设置我们的 Web 服务应用程序的第一个先决条件是可以通过以下步骤完成。

请确保您的系统上安装了 Visual Studio 2013,以进行此示例。

步骤 1) 第一步是创建一个空的 ASP.Net Web 应用程序。从 Visual Studio 2013 中,单击菜单选项文件->新建项目。

一旦单击新项目选项,Visual Studio 将为您提供另一个对话框,以选择项目类型并提供项目的必要详细信息。下一步将对此进行解释。

步骤 2) 在此步骤中,

  1. 确保首先选择 ASP.NET Web 应用程序的 C# Web 模板。必须选择此类型的项目才能创建 SOAP 服务项目。通过选择此选项,Visual Studio 将执行必要的步骤,以添加任何基于 Web 的应用程序所需的必需文件。
  2. 为您的项目命名,在我们的示例中已经被赋予了 webservice.asmx 的名称。然后,请确保提供存储项目文件的位置。

完成后,您将在 Visual Studio 2013 的解决方案资源管理器中看到创建的项目文件。

步骤 3) 在此步骤中,

我们将在项目中添加一个 Web 服务文件

  1. 首先右键单击项目文件,如下所示
  2. 一旦右键单击项目文件,您就可以选择“添加->Web 服务(ASMX)”选项,以添加 Web 服务文件。只需为 Web 服务名称文件提供 Tutorial Service 的名称。

步骤 4) 将以下代码添加到您的 Tutorial Service asmx 文件中。

代码解释:

  1. 此行代码为您的 Web 服务文件提供名称。这是一个重要的步骤,因为它为客户端应用程序调用 Web 服务提供了途径。
  2. 通常使用类文件来封装 Web 服务的功能。因此,类文件将具有所有 Web 方法的定义,这些方法将为客户端应用程序提供一些功能。
  3. 这里 [WebMethod] 被称为属性,用于描述函数。随后的步骤创建了一个名为“Guru99WebService”的函数,但是通过添加 [WebMethod] 属性的步骤,确保该方法可以被客户端应用程序调用。如果没有此属性,则客户端应用程序永远无法调用该方法。
  4. 这里我们正在定义一个名为 ‘Guru99WebService’ 的函数,该函数将用于向调用客户端应用程序返回字符串。此功能是可通过任何客户端应用程序调用的 Web 服务。
  5. 我们使用 return 语句将字符串 “This is a Tizpvs Web service” 返回给客户端应用程序。

如果代码成功执行,则在您在浏览器中运行代码时将显示以下输出。

输出:

  • 输出清楚地显示我们的 Web 服务的名称是“Guru99 Web Service”,这是为我们的 Web 服务命名的结果。
  • 我们还可以看到我们可以调用 Web 服务。如果单击“调用”按钮,则会在 Web 浏览器中获得以下响应。

以上输出,

  • 它清楚地显示通过调用 Web 方法返回字符串“This is a Tizivps Web service”。
  • Visual Studio 还允许您查看调用上述 Web 服务时生成的 SOAP 消息请求和响应。

当调用 Web 服务时生成的 SOAP 请求如下所示。

代码解释:

  1. SOAP 消息的第一部分是封装元素,这是在前几章中讨论的。这是每个 SOAP 消息中都存在的封装元素。
  2. SOAP 正文是下一个元素,包含 SOAP 消息的实际详细信息。
  3. 第三部分是元素,它指定我们要调用名为“tizivps”的服务。
<soap:Envelope xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>">

    <soap:Body>

        <tizivps xmlns="<http://tempuri.org/>">

            <Tizivps>string</Tizivps>

        </tizivps>
    </soap:Body>
</soap:Envelope>

代码解释:

  1. SOAP 消息的第一部分是封装元素,这是在前几章中讨论的。这是每个 SOAP 消息中都存在的封装元素。
  2. SOAP 正文是下一个元素,包含 SOAP 消息的实际详细信息。
  3. 您现在将看到的有趣部分是 ‘string’ 属性。这告诉客户端应用程序调用返回类型为 string 的 Web 服务。这非常有用,因为客户端应用程序否则不会知道 Web 服务返回什么。