使用 PHP/C# 开发 SOAP Web 服务






4.75/5 (12投票s)
讨论使用 C# 开发 PHP/SOAP Web 服务及其实现。
引言
本次研究的目标是
- 了解什么是 Web 服务。
- 了解什么是 SOAP。
- 学习如何从 PHP 网站和 Windows 桌面应用程序中消费 PHP/SOAP Web 服务。
1.0 什么是 Web 服务?
W3C 将 Web 服务定义为“一个旨在支持网络上可互操作的机器对机器交互的软件系统”。Web 服务通常只是可以通过网络(例如 Internet)访问的 Internet 应用程序编程接口 (API)。
Web 服务只是两个机器在本地或广域网(如 Internet)上进行通信的标准方式,无论主机平台或软件语言如何。Web 服务是一组 API,以标准化的方式向客户端应用程序提供数据。这些数据可以通过结合(通常)HTTP、支持的超文本处理器(如 PHP)和 SOAP 等通信协议在网络上传输。
2.0 什么是 SOAP?
SOAP 是一种在客户端-服务器配置中,在两台机器之间传输数据的标准化方法。SOAP 是 W3C 标准化的(W3C, 2004)一种在网络(本地或 Internet)上与 Web 服务通信的方式。“SOAP 是一种基于 XML 的消息协议。”
SOAP 消息(信封)以 XML 格式构成,XML 本身是 W3C 的开放标准。客户端必须有一个 XML 解析器来解释文档。XML 是平台和编程语言无关的,因此可以被广泛的计算机系统使用。由于 SOAP 只是一种标准而不是一种进程,因此它不限于任何特定的协议(尽管 HTTP 是常见的)。
2.1 SOAP 信封
SOAP 信封是一个在客户端和服务器之间发送的 XML 文档,其中包含请求/响应数据。该文档有三个主要元素(w3schools, 2009)
- 信封
- 标题
- 正文
包含方案和编码数据。
包含 ID、源、目标数据。
包含请求/响应数据(Silver Spoon Sokpop, 2009)。
SOAP 实现(如 NuSOAP)的主要目标之一是封装创建 SOAP 信封的过程,以确保与 SOAP 规范的兼容性和合规性。
2.2 什么是 WSDL?为什么它对 SOAP/Web 服务很重要?
WSDL 是一个用 XML 编写的文档。该文档描述了一个 Web 服务。它指定了服务的位置以及服务公开的操作(或方法)。
WSDL(Web 服务描述语言)向客户端定义了 Web 服务和可用方法。这适用于所有从任何上下文中消费该应用程序的客户端。
WSDL 文档还定义了以下内容
- 方法参数
- 参数数据类型
- 返回值数据类型
- 端口和绑定数据
WSDL 文档的示例结构
<definitions>
<types>
definition of types
</types>
<message>
definition of a message
</message>
<portType>
definition of a port
</portType>
<binding>
definition of a binding
</binding> </definitions>
2.3 什么是 NuSOAP?
最可行的 PHP SOAP 实现似乎是 Dietrich Ayala 的 SOAPx4,也称为 NuSOAP(Apple Inc, 09)。
NuSOAP 是一组类,可用于快速开发支持 SOAP 的 PHP Web 服务。NuSOAP 本身不是一种技术,因为它不需要服务器进行任何重新配置,而是充当中间人,简化应用程序开发过程。
<?php
// Pull in the NuSOAP code
require_once('nusoap.php');
// Create the server instance
$server = new soap_server;
// Register the method to expose
$server->register('hello');
// Define the method as a PHP function
function hello($name) {
return 'Hello, ' . $name;
}
// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
上面的示例演示了一个 NuSOAP 服务器,它有一个方法,该方法返回传递给它的值(作为字符串)。
演练
- 引用 NuSOAP 实现。
- 创建服务器对象的实例,并为其命名。
- 将“hello”方法注册到服务器对象。
- 编写相应的方法并让它“做某事”。(在这种情况下,返回与最初传递给它的字符串相同的值。)
- 如果 [当] 有 POST 数据时,将其传递给服务器对象并对其进行处理。
上面的代码是 NuSOAP 示例中最基本的,但它清楚地展示了在不必编写(甚至完全理解)实现本身的情况下开始使用 SOAP 所需的步骤。
<?php
// Pull in the NuSOAP code
require_once('nusoap.php');
// Create the client instance
$client = new soapclient('https:///phphack/helloworld.php');
// Call the SOAP method
$result = $client->call('hello', array('name' => 'Scott'));
// Display the result
print_r($result);
?>
客户端代码在设计上是相似的。尽管此示例仅使用 PHP,但可以使用几乎任何其他语言来访问服务器。
演练
- 引用 NuSOAP 实现。
- 创建 SOAPClient 的实例,并指定 Web 服务的远程路径。
- 调用所需的方法并传递一个参数(称为 'name')。
- Web 服务响应(如果请求有效),并将结果打印到屏幕上。
使用第三方实现的一个缺点是调试和错误处理更加困难,因为您不了解底层代码。
3.0 消费 SOAP/PHP Web 服务
消费 SOAP/PHP Web 服务有很多方法。本节仅侧重于通过 Windows Forms (C#) 应用程序消费 Web 服务,尽管任何支持 XML SOAP Web 服务的编程语言都是兼容的。
3.1 Windows Forms 应用程序
Microsoft Visual Studio 对 SOAP/XML Web 服务有广泛的支持。Microsoft .NET Framework(1.1 版及更高版本)有一个内置对象,可以继承该对象,从而无需理解 XML 或读取 XML 文档即可访问 Web 服务。对象:SoapHttpClientProtocol
(Microsoft MSDN, 2010)。
3.1.1 如何在 Visual Studio 2008 中消费 Web 服务
连接到 Web 服务
- 打开 Visual Studio 2008。
- 创建一个新项目(C# 或 VB.NET,过程相同)。
- 在解决方案资源管理器中,右键单击“引用”,然后单击“添加 Web 引用”。
- 键入 Web 服务描述语言 (WSDL) 文档的地址。例如:https:///customerswebservice/index.php?wsdl。
- 单击“转到”。
- Visual Studio 现在将检索 WSDL 文档并显示可用的方法。
- 为引用起一个有意义的名称,例如“CustomersLookup”。
- 单击“添加引用”。
调用服务
- 转到您的代码,即加载事件。
- 创建
CustomerLookup
类的新实例(自动为您生成)。
CustomersLookup.CustomerLookup cl = new CustomersLookup.CustomerLookup();
Customer[] c = cl.GetAllCustomers();
注意:这是一个示例;您键入的代码取决于您的 Web 服务公开的方法。
4.0 关键分析
本次研究的目标是了解 PHP/SOAP 是什么以及如何从 Windows 桌面应用程序中消费它。为了支持这项研究,已经完成了两个项目。(有关 Web 服务详情,请参阅本文档开头的实现说明)。这些应用程序通过以下方式支持研究:
Web服务
- Web 服务实现了 NuSOAP,NuSOAP 本身是 SOAP 的一个实现。
- NuSOAP 是用 PHP 编写的,使用 NuSOAP 实现的代码也是用 PHP 编写的。
桌面应用程序
- 消费 Web 服务本身的所有功能,并利用通过调用 Web 服务检索到的所有数据。
- 桌面应用程序使用 WSDL 来描述代码中的类和变量。
桌面应用程序完全实现了 Web 服务。但是,Web 服务可以扩展以提供更多返回简单类型和复杂类型的方法,以及需要简单/复杂类型作为参数。可以通过在 WSDL 中编写更多支持性文档来改进 Web 服务,说明每个方法的作用、所需参数以及返回值。桌面应用程序也可以通过相同的方式进行改进。
Web 服务与开发人员高度相关,因为它为应用程序和服务器之间的通信提供了跨平台/跨浏览器的手段。
使用 Web 服务为应用程序提供数据这一概念,对大多数开发人员都很有用。例如,Web 服务可以用来同步用户所有设备(笔记本电脑、台式机、手机、智能手机)或操作系统(Windows Mobile、Android、Symbian)上的数据。
5.0 参考/书目
- Answers.com. (2009, Nov 21). Web Services: Definition from Answers.com. Retrieved Nov. 21, 2009, from Answers.com: http://www.answers.com/topic/web-service。
- Apple Inc. (09, Nov. 21). Using SOAP with PHP. Retrieved Nov. 21, 09, from Apple Developer Connection: http://developer.apple.com/internet/webservices/soapphp.html。
- Microsoft. (2009, Nov. 21). Anatomy of an XML Web Service Lifetime. Retrieved Nov. 21, 2009, from Microsoft MSDN: http://msdn.microsoft.com/en-us/library/x05s00wz%28VS.80,loband%29.aspx。
- Microsoft MSDN. (2010, 01 01).
SoapHttpClientProtocol
class (System.Web.Services.Protocols
). Retrieved 01 12, 2010, from MSDN: http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soaphttpclientprotocol.aspx。 - Nichol, S. (2004, Nov. 03). Introduction to NuSOAP. Retrieved Nov. 21, 2009, from Scott Nichol: http://www.scottnichol.com/nusoapintro.htm。
- Silver Spoon Sokpop. (2009, Oct. 9). File:SOAP.svg. Retrieved Nov. 22, 2009, from Wikipedia: http://en.wikipedia.org/wiki/File:SOAP.svg。
- SoapUser.com. (2009, Nov 21). SOAP Basics 1: What is SOAP? Retrieved Nov. 21, 2009, from SoapUser.com: http://www.soapuser.com/basics1.html。
- W3C. (2004, Jan. 01). SOAP specifications. Retrieved Nov. 22, 2009, from W3C: http://www.w3.org/TR/soap/。
- W3schools. (2009, Nov. 21). Introduction to WSDL. Retrieved Nov. 21, 2009, from W3schools: https://w3schools.org.cn/WSDL/wsdl_intro.asp。
- Zend.com. (2004, March 16). PHP SOAP Extension. Retrieved Nov. 21, 2009, from Zend.com: http://devzone.zend.com/article/689。
历史
- 首次发布:2010 年 5 月 28 日。
原始发布:http://www.jpreece.com/csharp-tutorials/implementing-php-xmlsoap-web-services-via-c/。