PHP5中使用Web服务访问J2EE应用程序(1)

j2ee|php5|web|web服务|程序|访问

很多 Web 开发人员喜欢 PHP 的丰富功能和简单易用,但有时候他们需要访问 J2EE 应用程序服务器中已有的业务逻辑。本文将通过一些例子说明如何通过 PHP 5 中新的 SOAP 扩展使用 Web 服务来访问 J2EE 应用程序,而不必脱离 PHP 环境,也不用学习新的编程模型。

  PHP、Web 服务和 SOAP 简介

  本文将介绍如何从 PHP 脚本中访问企业应用程序。您可能是一位 PHP 程序员,需要为部门 Web 应用程序编写代码,以便访问公司总部以 Web 服务方式提供的服务。您或许是一位有经验的 J2EE 开发人员,希望多了解一点 PHP 及其应用。本文中的例子是一个运行在 IBM WebSphere? 应用程序服务器上的 Enterprise JavaBean(EJB),但本文并没有讨论 Web 服务的部署。它的主要目标是介绍如何从 PHP 中使用 Web 服务,这一点可以应用于各种 Web 服务实现。

  什么是 PHP?

  PHP:Hypertext Preprocessor(超文本预处理器,PHP)是一种流行的服务器端脚本语言,用于创建动态 Web 内容。PHP 解释器为主流平台提供了源代码或者编译好的二进制文件,这些平台包括大多数 Linux? 版本、Windows?、Mac OS X 和 iSeries?。

  确实有数百万台 Web 服务器正在运行 PHP,其中大部分使用的是 PHP 4。2004 年 7 月推出的 PHP 5 正在逐渐被采用。PHP 5 改进了对象模型,底层的内存管理也从多线程和性能的角度重新作了设计。但是需要注意少数无法向后兼容的修改,PHP 手册中对这些进行了记录。

  什么是 Web 服务技术?

  Web 服务指的是自成体系的、模块化的应用程序,客户机和服务在这种应用程序中是松耦合的。关于 Web 服务的详细信息,对于本文来说,您只需要了解其中的主要技术:

  SOAP(简单对象访问协议)定义了客户机与服务器之间传递的消息。消息采用 XML 格式。SOAP 独立于平台、编程语言、网络和传输层。本文将讨论 HTTP 上的 SOAP。

  WSDL(Web 服务描述语言)是用于描述 Web 服务的基于 XML 的语言,描述内容包括服务的位置、格式、操作、参数和数据类型。

  UDDI(统一描述、发现和集成)是用 API 和 UDDI Registry 实现来提供在网络上存储和检索 Web 服务信息的方法。

  本文包括 SOAP 消息和 WSDL 文档的一些例子,但没有提供 UDDI 的例子。

  XMethods 网站是一个有用的 Web 服务工具,在那里可以找到在各种服务器平台上实现的可公开使用的 Web 服务的列表。可以使用本文中的例子很方便地访问从 XMethods 中选择的服务。

  SOAP 和 PHP

  有多种产品允许在 PHP 4 脚本中使用 SOAP,最常见的产品是 PEAR::SOAP 和 NuSOAP。在写这篇文章的时候,这些产品在与 PHP 5 的兼容方面还存在问题,估计很快就会升级。

  PHP 5 中新增了内置的 SOAP 扩展,我们称之为 ext/soap。它是作为 PHP 的一部分提供的,因此不需要下载、安装和管理单独的包。这是第一个用 C 而不是 PHP 为 PHP 编写的 SOAP 实现,因此作者声称它的速度要快得多。

  因为新的扩展是 PHP 的完整组成部分之一,相关文档包含在 PHP 手册的 Function Reference 部分。SOAP 参考是以一个重要的免责声明开始的:

  警告:该扩展是试验性的(EXPERIMENTAL)。本扩展的行为,包括关于本扩展的函数名和其他内容,在以后的 PHP 版本中随时可能改变,不另行通知。使用该扩展的风险自负。

  警告看起来有点让人担心,但实际上这个扩展似乎得到了很好的支持。和任何新代码一样,该扩展也存在缺陷,但是报告的问题通常很快就能得到修正。在 PHP 站点上可以看到缺陷列表。我们估计,在将来的 PHP 版本中,该扩展将从试验性功能转为主流功能。

  安装 PHP SOAP 扩展

  应该在 Web 服务器上安装并运行 PHP 5。我们的实验采用 PHP 5.0.2,这是现在最新的版本,修正了 PHP 5 初始版本中的很多错误。上面已经提到,ext/soap 是作为 PHP 5 的一部分提供的,因此不需要单独下载,但是您可能需要对它做一些修改来启用它。需要做哪些修改则取决于您是下载源代码,自己编译 PHP,还是直接下载二进制文件。

  如果下载的是 PHP 源代码,并在自己的平台上编译,那么可能需要重新进行构建,因为在默认情况下没有启用 ext/soap。重复以前的构建过程,并在 configure 命令中添加 --enable-soap 选项。

  如果下载的是预编译平台的二进制文件,ext/soap 可能已经编译但没有加载,因此需要更新 PHP 配置,以便加载 ext/soap。编辑 php.ini 并找到 Dynamic Extensions 部分,在这里增加一行代码来自动加载该扩展。

  在 Windows 上,这一代码行是:

extension=php_soap.dll
  在 UNIX 上是:

extension=php_soap.so
  如果以前没有加载过任何可选的扩展,可能还要设置 extension_dir 指令,让它指向包含扩展库(其中包括 php_soap)的目录,比如:

extension_dir="C:/php/ext/"(在 Windows 上使用正斜杠)
  不要将目录信息放到 extension 指令中,需要的话可以使用 extension_dir。

  对于 Windows,可以下载其他两个二进制包。Windows 安装程序包不含任何扩展,因此要使用 Windows zip 压缩包,这个压缩包中包含 ext/soap。

  注意,ext/soap 依赖于 GNOME xml 库,这个库必须使用 2.5.4 或更高版本。如果版本不够高,可以从 xmlsoft安装 libxml2。

  最后,ext/soap 在 php.ini 中有自己的配置部分,在完成配置之后,ext/soap 如下所示:

[soap]
; Enables or disables WSDL caching feature.
soap.wsdl_cache_enabled=1
; Sets the directory name where SOAP extension will put cache files.
soap.wsdl_cache_dir="/tmp"
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
soap.wsdl_cache_ttl=86400
  这段配置控制了 SOAP 扩展的 WSDL 缓存特性。默认情况下,WSDL 描述文件在 24 小时(86400 秒)内都缓存在 /tmp 目录下。我们迟些时候再讨论这些内容,现在要设置 soap.wsdl_cache_enabled=0,否则,在开发代码时,您会遇到一些莫名其妙的行为。完成开发之后,要记得打开 WSDL 缓存,使代码运行得更快。

  为了便于参考,我们将在两种环境中使用 ext/soap:

Linux Centos 3.3(Red Hat EL 3 的免费重建版本)、Apache 2.0.47、PHP 5.0.2,需要升级 libxml2 到 2.6.12。
Windows XP SP1、Apache 2.0.46、PHP 5.0.2 二进制压缩包、libxml2 2.6.11。

  这些说明同样适用于其他配置。

Weather Forecast 应用程序

  我们要从 PHP 中访问的 Web 服务是一个天气预报应用程序。这是 WebSphere Version 5.1 Application Developer 5.1.1 Web Services Handbook 中开发的示例应用程序。下载示例 Weather Forecast 应用程序,请参阅本文后面的下载部分。这本书设计了几种不同的场景,但我们只考虑一种,在该书中,这种场景称为“自下而上的开发,使用 HTTP 传输和 SOAP 消息从会话 EJB 生成 Web 服务”。在这里,自下而上的意思是说,Web 服务是围绕现有企业应用程序进行包装的。

图 1. 天气预报应用程序

  图 1 中标出的 Weather Forecast 应用程序的主要组成包括:

  预测天气的后台 WEATHER 数据库。天气预报中的信息包括:

   风向,八个方位
   风速,公里/小时
   气温,摄氏度
   天气状况:晴、有时阴、阴、雨、暴雨
   日期

  WeatherPredictor 类用于访问 WEATHER 数据库。如果数据库中没有适用于请求日期的预报,那么 WeatherPredictor 会随机生成天气预测(与实际的天气预报不同),并将它保存到数据库中。

  业务逻辑由 WeatherForecastEJB 会话 bean 提供,并公开为 Web 服务,它提供三项操作:

  getDayForecast 返回某一天的天气预报。

  getForecast 返回某个时期的天气预报。

  getTemperatures 返回某个时期的气温预测。

  将这个会话 bean 部署为 Web 服务所需的所有元素都是由 WebSphere Studio Application Developer 的 Web 服务向导生成的,并且是作为 ItsoWebService2RouterWeb 项目生成的。路由器 servlet 是连接 SOAP 消息和 EJB 容器的桥梁,需要配置和部署路由器 servlet,通过 URL ItsoWebService2EJBRouterWeb/services/WeatherServiceEJB 来使 Weather 服务可用。WSDL 文档 itso.session.WeatherForecastEJB.wsdl 在 ItsoWebService2EJBRouterWeb/wsdl 目录中。

  Java 客户机是这本书中开发的多个 Weather Service 客户机之一。ItsoWebService2EJBClient 项目中的 WeatherClientEJB 是一个简单的 Java servlet,调用 getForecast Web 服务操作。典型的运行结果如下所示:


图 2. Java WeatherClient
  下一步是在 PHP 中建立等价的客户机功能。

  阅读本文不需要自己运行这个例子,可以针对从 XMethods 网站选择的服务建立 PHP 客户机。

时间: 2024-10-03 23:32:27

PHP5中使用Web服务访问J2EE应用程序(1)的相关文章

PHP5中使用Web服务访问J2EE应用程序(4)

j2ee|php5|web|web服务|程序|访问 处理 SOAP 错误 如果运行客户机时出现错误怎么办?与其他语言(如 Java)一样,PHP 5 新增加了一种异常机制.ext/soap 使用这种新的机制,以 SoapFault 对象的形式返回错误.比方说,可以用下面这种形式将代码包装起来: try {... some SOAP operation} catch (SoapFault $soapFault) {echo $soapFault;} 注意,与 Java 有所不同,PHP 语言的 t

PHP5中使用Web服务访问J2EE应用程序

j2ee|php5|web|web服务|程序|访问 很多 Web 开发人员喜欢 PHP 的丰富功能和简单易用,但有时候他们需要访问 J2EE 应用程序服务器中已有的业务逻辑.本文将通过一些例子说明如何通过 PHP 5 中新的 SOAP 扩展使用 Web 服务来访问 J2EE 应用程序,而不必脱离 PHP 环境,也不用学习新的编程模型. PHP.Web 服务和 SOAP 简介 本文将介绍如何从 PHP 脚本中访问企业应用程序.您可能是一位 PHP 程序员,需要为部门 Web 应用程序编写代码,以便

PHP5中使用Web服务访问J2EE应用程序(3)

j2ee|php5|web|web服务|程序|访问 解释 WSDL 我们已经成功地调用了 Weather 服务,但是还没有看过它的 WSDL 文档.WSDL 中的细节要比 SoapClient 公开的多.我们如何知道应该在 startDate 参数中放什么呢?我们应该期望从返回的数据中实际得到什么?要回答这些问题,必须更深入地分析 WSDL. 可以从下载部分下载 Weather Forecast 应用程序的 WSDL.如果使用不同的 Web 服务,只需要在浏览器中打开相应的 WSDL 文档即可.

PHP5中使用Web服务访问J2EE应用程序(2)

j2ee|php5|web|web服务|程序|访问 PHP Weather 客户机 这一节将建立我们自己的 PHP Weather 客户机.这里提供了一些代码片段,建议下载完整的客户机和 WSDL 文件. 用于表示 Weather Service 的 ext/soap 类是 SoapClient.正如我们介绍 Weather Forecast 应用程序时所讨论的,我们知道应用服务器在 http://host:port/ItsoWebServer2RouterWeb/wsdl/itso/sessi

内网中的web服务在另一个内网中要访问应该怎么实现?

问题描述 内网中的web服务在另一个内网中要访问应该怎么实现?两个内网都有自己的网关和自己的防火墙,曾经考虑用p2p穿透,实现起来太麻烦,服务器中转也不能考虑,不知道哪位达人给些建议 解决方案 解决方案二:搞个VPN解决方案三:从网络物理架构上考虑可以吧?内网间搞个静态路由解决方案四:vpn没办法搞,我们属于小区宽带类似的,整个小区出去的ip是一个,服务商不可能给开vpn端口映射

WF从入门到精通(第十八章):在你的工作流中调用Web服务

学习完本章,你将掌握: 1.在你的工作流中调用web服务 2.添加和配置web服务代理 3.在你的工作流中进行会话(sessions)管理 拿我来说,一些基于网络进行数据的发送和接收的事情很吸引我,由此多年以来我很喜欢写基于通信的代码.当我看到wf内置了连接web服务和作为web服务的能力时,我就更深入地对其进行了研究. wf集成了几个基于xml web服务的活动,我们将在本章调查客户端(client)一侧的活动.(在最后一章"把工作流作为web服务"中我们将讨论服务器一侧的活动).在

Java EE 5中的Web服务(JAX-WS)

Java API for XML Web Services (JAX-WS) 2.0,JSR 224 是 Java EE 5 平台的重要组成部分.作为 Java API for XML-based RPC 1.1 (JAX-RPC) 的后续发行版本,JAX-WS 简化了使用 Java 技术开发 Web 服务的工作.并且通过对多种协议(如 SOAP 1.1.SOAP 1.2.XML)的支持,以及提供用于支持其他协议和 HTTP 的工具,它解决了 JAX-RPC 1.1 中存在的一些问题.JAX-W

手把手教你在.NET中创建Web服务实现方法

 这篇文章主要介绍了.NET中创建Web服务实现方法,有需要的朋友可以参考一下 最近发现在.NET平台下使用Web服务还是很简单的. 下面举个在.NET平台下创建Web服务的简单例子.首先用Visul Studio .Net创建一个C# 项目Asp.Net Web服务程序,源代码如下: 代码如下: using System; using System.Collections; using System.ComponentModel; using System.Data; using System

xml-从android外部文件中获取web服务的 uri?

问题描述 从android外部文件中获取web服务的 uri? 我开发一个 android 应用程序调用rest web服务,解析结果到 Json 对象.我想在一个单独的文件中保存 web 服务的 URI,所以我在 strings.xml 文件中添加了基础的 uri: <string name="BaseRestURL">http://192.168.1.2:8080/SensorRestService/webresources/</string> 在 java