信息化 频道

如何用Zend Framework实现SOAP服务?

  【IT168 信息化】

  Web服务最近非常流行,其中基于REST的服务吸引了大部分的关注。REST之所以流行,是由于它简单、直接和能够处理现有HTTP方法。但是也要记住,REST并不是唯一的方法:SOAP,即Simple Object Access Protocol,是一种更正式和更标准的处理 Web 信息交换问题的方法。

  虽然基于SOAP的服务实现一般被认为是一个复杂的、耗费时间的过程,但是有许多工具可以显著简化这个过程。其中一个工具是Zend Framework,它是使用PHP构建可扩展Web应用的一个完整的MVC框架。除了许多强大功能之外 —OOP形式、i18n支持、查询和页面缓存和Dojo集成等等—Zend Framework也提供了大量通过它的Zend_Soap组件创建和部署SOAP服务的工具包。

  在本文中,您将了解使用Zend Framework创建一个简单的基于SOAP Web服务的过程。除了学习处理客户端请求和返回符合SOAP响应之外,您还将了解处理异常和产生SOAP错误的过程。最后,您也将使用Zend_Soap自动生成一个描述SOAP服务的WSDL文件,从而使客户端能 “自动发现”SOAP服务API。

  理解SOAP

  首先,我们要理解一些关于SOAP的词汇。SOAP是使用与语言无关的XML在Web上交换信息的方法,从而允许与使用不同语言编写的应用实现互连。这个XML通过HTTP传输协议在客户端和服务器之间进行传输,它具有强数据类型,可以保证数据完整性。

  REST以资源和行为为中心,而SOAP则与之不同,它基于方法 和 数据类型。一个REST服务一般只有4个操作,它们对应于4个HTTP方法GET、POST、PUT和DELETE,而SOAP服务则没有这样的限制;开发人员可以根据自己的需要使用更多或较少的方法。而且,这些方法一般是通过POSTHTTP方法调用的,而这个方法与所请求的操作类型则完全没有关系。

  为了演示SOAP的用法,我们使用一个简单的例子。假设您有一个社交书签应用,而您希望允许第三方开发人员使用SOAP向应用添加书签和从应用查询书签。一般情况下,您会使用getBookmark()和addBookmark()等函数实现一组服务对象,并将这些服务对象通过一个SOAP服务器发布出去。这个服务也会负责将SOAP数据类型转换成原生数据类型,解析 SOAP 请求数据包,执行相应的服务器函数,并生成包含结果的一个SOAP响应数据包。

  清单 1 显示了 getBookmark() 过程的一个可能的SOAP请求例子:

  清单 1. 一个 SOAP 请求例子   

  以下是引用片段:
  POST /soap HTTP/1.1
  Host: localhost
  Connection: Keep-Alive
  User-Agent: PHP-SOAP/5.3.1
  Content-Type: application/soap+xml; charset=utf-8
  Content-Length: 471
  <?xml version="1.0" encoding="UTF-8"?>
  <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope
  xmlns:ns1="http://example.localhost/index/soap
  xmlns:xsd="http://www.w3.org/2001/XMLSchema
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
  xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
  <env:Body>
  <ns1:getBookmark env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
  <param0 xsi:type="xsd:int">4682</param0>
  </ns1:getBookmark>
  </env:Body>
  </env:Envelope>
  而清单 2 显示了一个示例响应:

  清单 2. 一个SOAP响应例子

  以下是引用片段:
  HTTP/1.1 200 OK
  Date: Wed, 17 Mar 2010 17:13:28 GMT
  Server: Apache/2.2.14 (Win32) PHP/5.3.1
  X-Powered-By: PHP/5.3.1
  Content-Length: 800
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: application/soap+xml; charset=utf-8
  <?xml version="1.0" encoding="UTF-8"?>
  <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope
  xmlns:ns1="http://example.localhost/index/soap
  xmlns:xsd="http://www.w3.org/2001/XMLSchema
  xmlns:enc="http://www.w3.org/2003/05/soap-encoding
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <env:Body xmlns:rpc="http://www.w3.org/2003/05/soap-rpc">
  <ns1:getBookmarkResponse 
  env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
  <rpc:result>return</rpc:result>
  <return enc:itemType="xsd:string" enc:arraySize="3" 
  xsi:type="enc:Array">
  <item xsi:type="xsd:string">http://www.google.com</item>
  <item xsi:type="xsd:string">http://www.php-programming-solutions.com
  </item>
  <item xsi:type="xsd:string">http://www.mysql-tcr.com</item>
  </return>
  </ns1:getBookmarkResponse>
  </env:Body>
  </env:Envelope>


  在一个典型的SOAP事务中,服务器会接收一个像 清单 1 所示的以 XML 编码的请求,解析这个 XML,执行相应的服务对象方法,然后返回一个如 清单 2 所示的以XML编码的响应到请求客户端。客户端通常能够解析和响应这个SOAP,并将它转换成一个特定语言的对象或数据结构以作进一步处理。您可以选择使用一个WSDL文件告诉客户端关于可用函数的信息,以及输入参数和返回值的个数和数据类型。

  Zend Framework具SOAP客户端和服务器的实现,同时支持自动生WSDL文件。服务器和客户端实现在PHP中封装了SOAP扩展;这意味着如果PHP没有包含SOAP扩展支持,那么它们将无法生效。这样,使用带有原生扩展的Zend Framework库大大简化了开发过程,因为开发人员只需要定义一组实现服务API的对象,并将它们附加到服务器以便处理到达的请求。下面的各部分将详细讨论这个方面。

  创建示例应用

  在开始实现一个SOAP服务之前,您需要知道一些注意点和约定。在本文中,我将假定您拥有正常运行的Apache、PHP+SOAP和MySQL 的开发环境,Zend Framework会安装到您的PHP包含路径,同时您要熟悉SQL、XML和SOAP基础知识。我还将假定您熟悉使用Zend Framework进行应用开发的基本原则,理解行为与控制器之间的交互,并熟悉Zend_Db数据库抽象层。最后,我还假定您的Apache Web服务器配置支持虚拟主机和使用 .htaccess进行URL重写。如果您不熟悉这些概念,您可以通过本文的 参考资料 的链接了解更多信息。

  在本文中您将实现的示例SOAP服务允许第三方开发人员将产品添加到应用数据库,以及编辑、删除和查询应用数据库中的产品列表。它使用下面的函数,您可以使用一个标准的SOAP客户端访问所有这些函数:

  getProducts():返回数据库中的所有产品
  getProduct($id):返回数据库中的一个特定产品
  addProduct($data):添加一个新产品到数据库中
  deleteProduct($id):从数据库删除一个特定产品
  updateProduct($id, $data):将数据库中一个特定产品更新为新值
  第 1 步:初始化一个新应用

  首先,我们要创建一个标准的Zend Framework应用,它包含本文所显示的代码上下文。使用Zend Framework工具脚本(Windows?上则是zf.bat,UNIX是zf.sh)创建一个新项目,如下所示:

  以下是引用片段:
  shell> zf.bat create project example


  您现在可以在您的Apache配置中为这个应用定义一个新的虚拟主机,如http://example.localhost/,然后将虚拟主机的文档根目录指向应用的 public/ 目录。然后,如果您访问这个主机,您应该能看到默认的Zend Framework欢迎页面,如 图 1 所示。 

 

  图 1. 默认的Zend Framework欢迎页面

0
相关文章