当前位置导航:炫浪网>>网络学院>>编程开发>>Oracle教程

利用PHP创建由Oracle驱动的SOAP服务

  能够通过 Web 服务为其他基于 Internet 的 Web 应用程序提供数据和功能正迅速成为重大开发中必不可或缺的组成部分。尽管 Oracle 提供了许多托管 Web 服务的方法,但这么做始终不是最有效的方法,特别是在已经使用 PHP 来开发 Web 应用程序的情况下。在本手册中,我将引导您使用 PHP 逐步开发 SOAP 客户端和服务器,并使用 Oracle 作为数据的后端。

  要真正了解这个问题的答案,您需要了解 PHP 脚本执行的生命周期以及 Web 服务器对该生命周期的影响,本手册将从此开始逐步展开论述。

  必需组件
  出于本手册的需要,您将使用一个非常简单的数据库后端,该数据库后端将在一个表中存储有关已发表书籍的某些基本信息,该表由以下 CREATE 语句表示:

CREATE TABLE books(isbn VARCHAR(32) PRIMARY KEY,
author VARCHAR(50),
title VARCHAR(50),
price FLOAT);

  该表将充当 SOAP 服务器的数据源,而数据源又会根据需要将数据提供给一个或多个 SOAP 客户端。尽管在实际应用程序中,您的数据库可能比较复杂,但这里描述的方法仍然适用。

  建立数据库(最好在其中放置一些虚拟数据)之后,您现在就可以深入了解用 PHP 开发 SOAP 服务器所涉及的内容了。

  SOAP 服务在 PHP 中的工作方式

  用 PHP 开发 SOAP 服务的选择有多种,所有方法都涉及到 SoapServer PHP 类。该类是所有基于 PHP 的 SOAP 服务的核心部分,其语法如下:

$server = new SoapServer($wsdl [, $options]);
  其中,$wsdl 是描述托管服务的 Web 服务描述语言 (WSDL) 文档的位置;$options 是一组键/值对,其中包含了在创建服务时需要考虑的所有设置选项。稍后,您将了解有关 WSDL 文档的更多内容;现在,我们来看一下在创建新的 SOAP 服务时可用的选项:

  ·soap_version:与客户端通信时使用的 SOAP 协议版本。可能的选项是用于 SOAP 1.1 版的常量 SOAP_1_1 或用于 SOAP 1.2 版的 SOAP_1_2.

  ·encoding:用于该 SOAP 服务的字符编码(即字符串 ISO-8859-1)。

  ·actor:该 SOAP 服务的角色 URI.

  ·classmap:将 WSDL 数据类型映射到 PHP 中的类名的一组键/值对本身。如果使用该选项,PHP 将根据 WSDL 中定义的类型将这些类呈现给连接客户端。

  因此,要使用名为 bookman.wsdl 的 WSDL 文档创建一个使用 SOAP v1.2 协议的 SOAP 服务,您应该按如下方法构建服务器:

function add($a, $b) {
return $a + $b;
}

$server->addFunction(‘add’);

  您还可以通过提供一组函数名来添加多个函数:
function add($a, $b) {
return $a + $b;
}

function sub($a, $b) {
return $a - $b;
}

$server->addFunction(array(‘add’, ‘sub’));

  最后,您可以通过传递特殊常量 SOAP_FUNCTIONS_ALL 而非函数名来导出所有定义的函数,如下所示:
function add($a, $b) {
return $a + $b;
}

function sub($a, $b) {
return $a - $b;
}

$server->addFunction(SOAP_FUNCTIONS_ALL);

  正如您从上述示例中看到的那样,公开为 SOAP 服务的函数看上去与常规 PHP 函数完全相同。但是,根据定义,适用于在 SOAP 服务上下文中使用的函数的几个规则并不适用于常规 PHP 函数:

  ·函数必须以相同的顺序接受相同的输入参数,如提供给服务器的 WSDL 文档定义的那样。

  ·函数不能输出任何内容(即打印/回显)。

  ·函数必须返回一个或多个值(多个值以一组关联的键/值对的形式返回)。

  由于从体系结构或审美的角度看,在过程函数中表示所有公开的服务调用并不总是明智的选择,因此 PHP 还提供了一种使用对象表示 SOAP 服务的方法。通过使用 addClass() 方法,您可以指定一个类来表示整个 SOAP 服务的函数,其中的所有公共方法将自动公开为服务调用:

class math {
public function add($a, $b) {
return $a + $b;
    }

public function sub($a, $b) {
return $a - $b;
    }
}

$server->addClass("math");

  您稍后将看到,该方法是最简洁、最模块化的一个方法。

 

  要完成 SOAP 服务器,您必须指导它处理从连接的 SOAP 客户端传入的任何请求。这是通过 handle() 方法完成的,该方法不需要参数。

  总之,用 PHP 创建 SOAP 服务器就像以下示例一样简单:

<?php

class math {
public function add($a, $b) {
return $a + $b;
    }

public function sub($a, $b) {
return $a - $b;
    }
}

$server = new SoapServer(‘math.wsdl’);
$server->addClass(‘math’);
$server->handle();

?>

  如果出现错误用
  PHP 创建 SOAP 服务时必须解决的一个问题是:在出现错误的情况下,如何将错误报告给客户端。根据 SOAP 协议中的规范,在请求期间出现的错误应该通过将特殊 SOAP Fault 响应返回给请求客户端的方式来处理。在 PHP 中,这是通过发出 SoapFault 类的实例、向该类提供错误代码和描述错误本质的可选错误消息来完成的,如下所示:

public Function div($a, $b) {
if($b == 0) {
        throw new SoapFault(-1, “Cannot divide by zero!”);
    }

return $a / $b;
}

 

  注意,除了应用程序本身表达的意思外,这两个 SoapFault 参数没有任何其他含义。因此,尽管我在这里使用了负数作为错误代码,但仍然可以十分轻松地选择其他所需的整数值。

  生成 WSDL

  尽管前面的示例确实是一个用于创建 SOAP 服务的完整 PHP 脚本,但它根本没有解决 WSDL 文档的问题。查看 WSDL 文档是整个过程的一个重要组成部分,生成 WSDL 文档则需要采取一些额外的操作。

  遗憾的是,由于 PHP 的无类型本质,目前 PHP 还不能像强类型化语言(如 Java)或 .NET 服务那样拥有即席自动生成 WSDL 文档的合理方法。WSDL 文档必须指定每个参数的类型,因此您需要使用其他方法在脚本中表达,因为变量 $a 和 $b 提供的是非类型化信息。有多种选择可用:

  ·自己手动编写 WSDL 文档。

  ·通过手动输入每个方法和类型化信息,使用基于 Web 的 WSDL 生成器来生成文件。

  ·使用 Zend Studio 的自动 WSDL 生成器。

  尽管这三个选择都可行,但我将演示如何使用 Zend Studio 的 WSDL 生成器来生成 WSDL 文档,原因有两个:第一,这是目前为止生成 WSDL 文档的最简单、最可靠的方法;第二,Zend Studio 几乎在每个正规的 PHP 柜台都有售。

  为了使用 Studio WSDL 生成器生成 WSDL 文档,您首先必须为每个公开方法识别其参数的类型化信息,然后使用名为 PHPDoc(常用 JavaDoc 的 PHP 版本)的内嵌文档注释来返回值。PHPDoc 只是一个置于每个函数开头的块注释,其使用的特定可分析语法可用于自动生成文档。Zend Studio 还使用该信息收集生成 WSDL 文档所需的类型化信息。

 

  继续前面的示例,下面是先前使用的同一 math 类,但这次使用的是 PHPDoc 注释:

/**
* A simple math utility class
* @author John Coggeshall [email protected]
 */
class math {
    /**
* Add two integers together
     *
* @param integer $a The first integer of the addition
* @param integer $b The second integer of the addition
* @return integer The sum of the provided integers
     */
public function add($a, $b) {
return $a + $b;
    }

    /**
* Subtract two integers from each other
     *
* @param integer $a The first integer of the subtraction
* @param integer $b The second integer of the subtraction
* @return integer The difference of the provided integers
     */
public function sub($a, $b) {
return $a - $b;
    }
}

  正确使用这些 PHPDoc 注释之后,通过执行 Studio 的 Tools 菜单下的 WSDL 生成器,您可以让 Zend Studio 为该类自动生成合适的 WSDL 文档:

图 1

  正确使用 PHPDoc 注释之后,就可以减少为 SOAP 服务器生成 WSDL 文档所需的其他繁琐而无意义的任务,而只需遵循一个非常简单的分步向导即可。完成后,Studio 将打开其中的 WSDL 文档,以供您查看并保存到所选的位置。

  生成文档之后,必须将该文档放在服务器能够访问的位置(在实例化类时需要),以及可能使用该服务的潜在 SOAP 客户端能够访问的位置。通常,这很容易实现,只需将 WSDL 文档与托管 SOAP 服务的终端 PHP 脚本放在同一位置即可。

相关内容
赞助商链接