Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18672455
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-04-14 17:54:43

 《创建由Oracle 驱动的SOAP服务》

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

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

1)自己手动编写 WSDL 文档;
2)通过手动输入每个方法和类型化信息,使用基于 Web 的 WSDL 生成器来生成文件;
3)使用 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
 */
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 文档:

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

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

创建 BookManager 类
现在,您已经熟悉了用 PHP 实施 SOAP 服务的所有内容,下面我们来讨论。出于本手册的需要,我创建了一个名为 BookManager 的类。该类的作用将与前面示例中的 math 类相同,除了要与数据库进行交互,并提供一个 SOAP 服务,以允许您执行一般维护并查询本开头描述的书籍表。具体而言,BookManager 类将实施以下要公开为 SOAP 调用的方法:

addBook($isbn, $author, $title, $price); // Adds a Book to the database
delBook($isbn); // Deletes a book by ISBN number
findBookISBNByAuthor($author); // Returns an array of ISBN numbers of books written by a        
// specific author
findBookISBNByTitle($title); // Returns an array of ISBN numbers of books whose title
// matches the substring provided
getBookByISBN($isbn); // Returns the details of the book identified by ISBN
listAllBooks(); // Returns an array of all ISBN numbers in the database

尽管该类本身有其他几个方法,但只有上述六个方法是声明的公共方法(当然,除了构造函数以外),因而也是仅有的公开为 SOAP 服务的方法。虽然详细说明每个方法会超出本教程讨论范围(特别是它们在形式上基本相同),但出于完整性需要,我们来看一下 delBook() 方法:
/**
  * Delete a book from the database by ISBN
  *
  * @param string $isbn The ISBN serial number of the book to delete
  *
  * @return mixed SOAP Fault on error, true on success
  */
 public function delBook($isbn) {
  
  $query = "DELETE FROM books
                  WHERE isbn = :isbn";
  
  $stmt = oci_parse($this->getDB(), $query);
  
  if(!$stmt) {
   throw new SoapFault(-1, "Failed to prepare query (reason: " . 
                                         oci_error($stmt) . ")");
  }
  
  oci_bind_by_name($stmt, "isbn", $isbn, 32);

  if(!oci_execute($stmt)) {
   oci_rollback($this->getDB());
   throw new SoapFault(-1, "Failed to execute query (reason: " .
                                          oci_error($stmt) . ")");
  }
  
  oci_commit($this->getDB());
  
  return true;
 }

对于那些熟悉用于 PHP 的 Oracle API 的开发人员来说,上述方法应该很简单。对于其余开发人员来说,我们从 oci_parse() 方法开始来探究该函数的某些关键点。该方法以字符串的形式接受 SQL 查询(如果需要,在查询中包含每个变量的占位符),然后返回表示该查询的语句资源。在这里,该语句资源的占位符可以通过 oci_bind_by_name() 方法直接映射到 PHP 变量,该方法将接受语句、占位符名称、对应的 PHP 变量以及可选的当前最大列长度作为参数。一旦 PHP 将每个占位符绑定到一个 PHP 变量,就可以执行语句并获得结果了。当然,由于该操作是一个针对表的 write 操作,您可以通过将更改提交到数据库并返回成功状态,来成功完成函数执行。

相关连载

 

阅读(324) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~