SOAP Web 服务教程:什么是 SOAP 协议?示例
什么是肥皂?
SOAP 是一种基于 XML 的协议,用于通过 HTTP 访问 Web 服务。它具有一些可用于所有应用程序的规范。
SOAP 被称为简单对象访问协议,但后来被缩短为 SOAP v1.2。SOAP 是一种协议,换句话说,它定义了 Web 服务如何相互通信或如何与调用它们的客户端应用程序通信。
SOAP 被开发为一种中间语言,以便基于各种编程语言构建的应用程序可以轻松地相互交流并避免过多的开发工作。
SOAP 简介
当今世界,有大量的应用程序是基于不同的编程语言构建的。例如,可能有一个用 Java,另一个在.Net 中,另一个在 PHP.
在当今的网络世界中,应用程序之间的数据交换至关重要。但这些异构应用程序之间的数据交换会很复杂。实现这种数据交换的代码也会很复杂。
解决这种复杂性的方法之一是使用 XML(可扩展标记语言)作为应用程序间交换数据的中间语言。
每种编程语言都可以理解XML标记语言。因此,XML被用作数据交换的底层媒介。
但目前还没有关于所有编程语言中 XML 数据交换使用的标准规范。这正是 SOAP 软件的用武之地。
SOAP 旨在通过 HTTP 与 XML 配合使用,并具有某种可用于所有应用程序的规范。我们将在后续章节中进一步详细了解 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 消息只不过是一个具有以下组件的简单 XML 文档。
- 一个 Envelope 元素,用于将 XML 文档标识为 SOAP 消息 – 这是 SOAP 消息的包含部分,用于封装 SOAP 消息中的所有详细信息。这是 SOAP 消息中的根元素。
- 包含标头信息的标头元素 – 标头元素可以包含调用应用程序可以使用的身份验证凭据等信息。它还可以包含可在 SOAP 消息中使用的复杂类型的定义。默认情况下,SOAP 消息可以包含参数,这些参数可以是简单类型(例如字符串和数字),也可以是复杂对象类型。
下面显示了一个复杂类型的简单 SOAP 服务示例。
假设我们想要发送一个结构化数据类型,其中包含“教程名称”和“教程 Description”,那么我们将定义复杂类型,如下所示。
复杂类型由元素标签定义. 然后在复杂类型集合中定义结构所需的所有元素及其各自的数据类型。
<xsd:complexType> <xsd:sequence> <xsd:element name="Tutorial Name" type="string"/> <xsd:element name="Tutorial Description" type="string"/> </xsd:sequence> </xsd:complexType>
- 包含调用和响应信息的 Body 元素 – 此元素包含需要在 Web 服务和调用应用程序之间发送的实际数据。下面是 SOAP Web 服务示例,其中 SOAP 主体实际上适用于标头部分中定义的复杂类型。以下是教程名称和教程的响应 Descript发送到调用此 Web 服务的调用应用程序的离子。
<soap:Body> <GetTutorialInfo> <TutorialName>Web Services</TutorialName> <TutorialDescription>All about web services</TutorialDescription> </GetTutorialInfo> </soap:Body>
SOAP 消息结构
需要注意的一点是,SOAP 消息通常在调用 Web 服务时由其自动生成。
每当客户端应用程序调用 Web 服务中的方法时,Web 服务都会自动生成一条 SOAP 消息,该消息包含从 Web 服务发送到客户端应用程序的必要数据详细信息。
正如本 SOAP 教程上一主题中讨论的那样,一个简单的 SOAP 消息具有以下元素 -
- 信封元素
- 标题元素和
- body 元素
- Fault 元素(可选)
让我们看下面一个简单的 SOAP 消息的示例,看看元素实际上起了什么作用。
- 从上面的 SOAP 消息看到,SOAP 消息的第一部分是信封元素,用于封装整个 SOAP 消息。
- 下一个元素是 SOAP 主体,它包含实际消息的详细信息。
- 我们的消息包含一个名为“Guru99WebService”的网络服务。
- “Guru99Webservice” 接受“int”类型的参数,名称为 TutorialID。
现在,上述 SOAP 消息将在 Web 服务和客户端应用程序之间传递。
您可以看到上述信息对客户端应用程序有多有用。 SOAP 消息告诉客户端应用程序 Web 服务的名称是什么,它期望哪些参数,以及 Web 服务所采用的每个参数的类型是什么。
SOAP 信封元素
构建块的第一位是 SOAP 信封。
SOAP 信封用于封装在 Web 服务和客户端应用程序之间交换的 SOAP 消息的所有必要细节。
SOAP 信封元素用于指示 SOAP 消息的开始和结束。这使调用 Web 服务的客户端应用程序能够知道 SOAP 消息何时结束。
在 SOAP 信封元素上,有以下几点值得注意。
- 每个 SOAP 消息都需要有一个根 Envelope 元素。SOAP 消息必须有一个 Envelope 元素。
- 每个 Envelope 元素至少需要有一个 soap 主体元素。
- 如果 Envelope 元素包含 header 元素,则它必须包含不超过一个 header 元素,并且它必须作为 Envelope 的第一个子元素出现在 body 元素之前。
- 当 SOAP 版本改变时,信封也会改变。
- 符合 v1.1 标准的 SOAP 处理器在收到包含 v1.2 信封命名空间的消息时会生成故障。
- 如果符合 v1.2 标准的 SOAP 处理器收到不包含 v1.2 信封命名空间的消息,则会生成“版本不匹配”错误。
下面是 SOAP 信封元素 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> <Guru99WebService xmlns="http://tempuri.org/"> <TutorialID>int</TutorialID> </Guru99WebService> </soap:Body> </SOAP-ENV:Envelope>
故障信息
当向 SOAP Web 服务发出请求时,返回的响应可以是两种形式:成功响应或错误响应。当成功生成时,来自服务器的响应将始终是 SOAP 消息。但如果生成了 SOAP 错误,则它们将作为“HTTP 2”错误返回。
SOAP Fault 消息由以下元素组成。
- – 这是指定错误代码的代码。故障代码可以是以下任意值
- SOAP-ENV:VersionMismatch – 当遇到 SOAP Envelope 元素的无效命名空间时会出现这种情况。
- SOAP-ENV:MustUnderstand—Header 元素的直接子元素(其 mustUnderstand 属性设置为“1”)无法理解。
- SOAP-ENV:客户端 — 消息格式不正确或包含不正确的信息。
- SOAP-ENV:服务器 – 服务器出现问题,因此消息无法继续。
- – 这是提供错误详细描述的文本消息。
- (选修的)– 这是一个文本字符串,表明谁导致了故障。
- (选修的) – 这是应用程序特定错误消息的元素。因此,应用程序可以针对不同的业务逻辑场景提供特定的错误消息。
故障信息示例
下面是一个错误消息示例。如果客户端尝试使用 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(远程过程调用)方式进行通信。这是最简单的通信方式,但有很多限制。
现在,在本 SOAP API 教程中,让我们考虑下图来了解此通信的工作原理。在此示例中,我们假设服务器托管一个 Web 服务,该服务提供了以下 2 种方法:
- 获取员工信息 – 这将获取所有员工详细信息
- 设置员工 – 这将相应地设置员工部门、工资等详细信息的值。
在正常的 RPC 风格通信中,客户端只需调用其请求中的方法并将所需的参数发送到服务器,然后服务器将发送所需的响应。
上述沟通模式有以下严重的局限性
- 不独立于语言 – 托管方法的服务器将采用特定的编程语言,并且通常对服务器的调用仅使用该编程语言。
- 非标准协议 – 当调用远程过程时,调用不会通过标准协议进行。这是一个问题,因为网络上的大多数通信都必须通过 HTTP 协议进行。
- 防火墙 – 由于 RPC 调用不通过常规协议,因此需要在服务器上打开单独的端口,以允许客户端与服务器通信。通常所有防火墙都会阻止此类流量,并且通常需要进行大量配置才能确保客户端和服务器之间的此类通信正常进行。
为了克服上述所有限制,SOAP 将使用以下通信模型
- 客户端会将有关过程调用和任何参数的信息格式化为 SOAP 消息,并将其作为 HTTP 请求的一部分发送到服务器。将数据封装到 SOAP 消息中的这一过程称为 编组。
- 然后,服务器将解开客户端发送的消息,查看客户端请求的内容,然后将适当的响应作为 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 服务将托管在 网络 web 应用程序。然后我们将调用 web 服务并查看 web 服务返回的结果。
Visual Studio 还将向我们展示在 Web 服务和调用应用程序之间传递的 SOAP 消息。
设置我们的 Web 服务应用程序的首要先决条件是按照以下步骤完成。
为了本示例,请确保您的系统上安装了 Visual Studio 2013。
步骤1) 第一步是创建一个空的 ASP.Net Web 应用程序。在 Visual Studio 2013 中,单击菜单选项文件->新建项目。
单击“新建项目”选项后,Visual Studio 将为您提供另一个对话框,供您选择项目类型并提供项目的必要详细信息。这将在下一步中解释。
步骤2) 在此步骤中,
- 确保首先选择 C# ASP.NET Web 应用程序的 Web 模板。项目必须是此类型才能创建 SOAP 服务项目。通过选择此选项,Visual Studio 将执行必要的步骤来添加任何基于 Web 的应用程序所需的文件。
- 为您的项目命名,在我们的例子中,该项目的名称为 webservice.asmx。然后确保指定项目文件的存储位置。
完成后,您将在 Visual Studio 2013 的解决方案资源管理器中看到创建的项目文件。
步骤3) 在此步骤中,
我们将向我们的项目添加一个 Web 服务文件
- 首先右键单击项目文件,如下图所示
- 右键单击项目文件后,您可以选择选项“添加->Web 服务 (ASMX)”来添加 Web 服务文件。只需为 Web 服务名称文件提供 Tutorial Service 的名称即可。
步骤4) 将以下代码添加到您的教程服务 asmx 文件中。
代码说明:
- 这行代码为您的 Web 服务文件提供了一个名称。这是一个重要的步骤,因为它为客户端应用程序提供了通过 Web 服务名称调用 Web 服务的方法。
- 通常,类文件用于封装 Web 服务的功能。因此,类文件将包含所有 Web 方法的定义,这些方法将为客户端应用程序提供一些功能。
- 此处的 [WebMethod] 是描述函数的属性。后续步骤将创建一个名为“Guru99WebService”的函数,但添加 [WebMethod] 属性这一步可确保此方法可由客户端应用程序调用。如果没有此属性,则客户端应用程序永远无法调用该方法。
- 这里我们定义了一个名为“Guru99WebService”的函数,它将用于向调用的客户端应用程序返回一个字符串。此函数是一个可由任何客户端应用程序调用的 Web 服务。
- 我们使用 return 语句将字符串“This is a Guru99 Web service”返回给客户端应用程序。
如果代码成功执行,则在浏览器中运行代码时将显示以下输出。
输出:
- 输出清楚地显示我们的 Web 服务的名称是“Guru99 Web Service”,这是为我们的 Web 服务命名的结果。
- 我们还可以看到我们可以调用 Web 服务。如果我们单击“调用”按钮,我们将在 Web 浏览器中获得以下响应。
上述输出,
- 它清楚地表明,通过调用 Web 方法,返回字符串“This is a Guru99 Web service”。
- Visual Studio 还允许您查看调用上述 Web 服务时生成的 SOAP 消息请求和响应。
调用Web服务时生成的SOAP请求如下所示。
代码说明:
- SOAP 消息的第一部分是信封元素,也就是前面章节讨论的内容。这是每个 SOAP 消息中都存在的封装元素。
- SOAP 主体是下一个元素,包含 SOAP 消息的实际详细信息。
- 第三部分是指定我们要调用名为“Guru99WebService”的服务的元素。
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soap:Body> <Guru99WebServiceResponse xmlns="http://tempuri.org/"> <Guru99WebServiceResult>string</Guru99WebServiceResult> </Guru99WebServiceResponse> </soap:Body> </soap:Envelope>
代码说明:
- SOAP 消息的第一部分是信封元素,也就是前面章节讨论的内容。这是每个 SOAP 消息中都存在的封装元素。
- SOAP 主体是下一个元素,包含 SOAP 消息的实际详细信息。
- 您现在将看到的有趣部分是“string”属性。这告诉客户端应用程序被调用的 Web 服务返回一个字符串类型的对象。这非常有用,因为否则客户端应用程序将不知道 Web 服务返回什么。
结语
- SOAP 是一种用于在不同平台上构建的应用程序之间交换数据的协议 编程语言.
- SOAP 建立在 XML 规范之上,并与 HTTP 协议配合使用。这使得它非常适合在 Web 应用程序中使用。
- SOAP 构建块由 SOAP 消息组成。每条 SOAP 消息均由一个信封元素、一个标头和一个正文元素组成。
- 信封元素是 SOAP 消息中的必需元素,用于封装 SOAP 消息中的所有数据。
- 标头元素可用于包含诸如身份验证信息或复杂数据类型的定义等信息。
- body 元素是主要元素,它包含 web 方法的定义以及任何所需的参数信息。