首页 php教程 php手册 PHP5中使用Web服务访问J2EE应用程序(2)

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

Jun 21, 2016 am 09:08 AM
soap soapclient weather

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

PHP Weather 客户机

  这一节将建立我们自己的 PHP Weather 客户机。这里提供了一些代码片段,建议下载完整的客户机和 WSDL 文件。

  用于表示 Weather Service 的 ext/soap 类是 SoapClient。正如我们介绍 Weather Forecast 应用程序时所讨论的,我们知道应用服务器在 http://host:port/ItsoWebServer2RouterWeb/wsdl/itso/session/WeatherForecastEJB.wsdl 中提供了 WSDL。我们使用的是默认端口,并且在作为服务器的计算机上工作,这样就可以通过查找 WSDL 文件创建第一个 SoapClient:

<?php
$soapClient = new SoapClient("http://localhost:9080/" .
"ItsoWebService2RouterWeb/wsdl/itso/session/WeatherForecastEJB.wsdl");
?>
  注意,因为 ext/soap 是内置的,所以,在引用 SoapClient 之前,不需要任何 include 或 require 语句。

  现在已经实例化了客户机,还要联系 Weather 服务,并调用它的 getForecast 操作。在 WSDL 模式下使用 SoapClient 时,ext/soap 有一种很好的特性,即可以直接引用远程操作,就像它是 SoapClient 自身的函数一样。但是在建立输入参数时需要一点技巧。ext/soap 可以提供从 WSDL 中发现的操作和参数的数组:

$functions = $soapClient->__getFunctions();
print_r($functions);
$types = $soapClient->__getTypes();
print_r($types);
  只需要显示与 getForecast 相关的结果,并重新格式化这些结果,以方便阅读,于是我们看到以下代码:

getForecastResponse getForecast(getForecast $parameters)

struct getForecast {
dateTime startDate;
int days;
}

struct getForecastResponse {
Weather getForecastReturn;
}

struct Weather {
string condition;
dateTime date;
string windDirection;
int windSpeed;
int temperatureCelsius;
boolean dbflag;
}
  ext/soap 实际上并没有为我们定义 getForecast 类,我们必须创建该操作所需要的输入参数数组:

$getForecastParam = array('startDate' =>time(), 'days' => 3);
  然后像 SoapClient 的方法那样调用该操作:

$forecastResponse = $soapClient->getForecast($getForecastParam);
  最后我们得到了返回的 getForecastResponse 对象,它本身是一个 Weather 对象数组,然后在表格中显示结果:

echo "<table border=1 cellpadding=5>";
echo "<tr><th>Date</th><th>Condition</th><th>Temperature</th><th>Wind</th></tr>";
$weatherArray = $forecastResponse->getForecastReturn;
foreach ($weatherArray as $weather) {
echo "<tr>",
"<td>",strftime("%a. %b %d, %Y", strtotime($weather->date)),"</td>",
"<td>$weather->condition</td>",
"<td>$weather->temperatureCelsius</td>",
"<td>$weather->windDirection $weather->windSpeed</td>",
"</tr>";
}
echo "</table>";
  PHP 客户机与 Java 客户机的输出相同,于是我们知道圣诞节期间 San Jose 不会下雪……

图 3. PHP WeatherClient


  观察 SOAP 流

  我们成功地与 Weather 服务取得了联系,并显示了结果。但是如果出现错误,得不到预期的结果,该怎么办?ext/soap 可以显示客户机与服务器之间交换的 SOAP 消息,能够帮助我们确定问题所在。

  只有使用 trace 选项创建 SoapClient 时,才要使用跟踪功能。我们在 options 数组参数中设置 trace 选项,将该参数传递给 SoapClient 构造函数。我们将构造函数的使用改为:

$soapClient = new SoapClient("http://localhost:9080/" .
"ItsoWebService2RouterWeb/wsdl/itso/session/WeatherForecastEJB.wsdl",
array('trace' => 1));
  并在调用 goForecast 之后调用 trace 方法:

echo "Request :<br>", htmlspecialchars($soapClient->__getLastRequest()), "<br>";
echo "Response :<br>", htmlspecialchars($soapClient->__getLastResponse()), "<br>";
  一定要使用 htmlspecialchars 内置函数对 trace 输出进行编码,因为它将 SOAP xml 分界符转换成特殊字符,如
  下面是某个请求的 trace 输出:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://session.itso">
<SOAP-ENV:Body>
<ns1:getForecast>
<ns1:startDate>2004-11-30T13:41:59</ns1:startDate>
<ns1:days>0</ns1:days>
</ns1:getForecast>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  对应的应答是:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getForecastResponse xmlns="http://session.itso">
<getForecastReturn xmlns:ns-239399687="http://mapping.itso">
<ns-239399687:condition>sunny</ns-239399687:condition>
<ns-239399687:date>2004-11-30T00:00:00.000Z</ns-239399687:date>
<ns-239399687:windDirection>W</ns-239399687:windDirection>
<ns-239399687:windSpeed>18</ns-239399687:windSpeed>
<ns-239399687:temperatureCelsius>6</ns-239399687:temperatureCelsius>
<ns-239399687:dbflag>1</ns-239399687:dbflag>
</getForecastReturn>
</getForecastResponse>
</soapenv:Body>
</soapenv:Envelope>
  如果在开启跟踪功能的情况下运行客户机来收集这些输出,那么需要将 days 参数设置为 0,只有这样做,SOAP 应答才会输出较少的行。但是我们遇到了没有预料到的行为。我们本来期望 getForecastResponse 和以前一样是一个 Weather 对象数组,但是它应该只有一个元素,而不是 4 个元素。然而,它被转换成了一个简单的 Weather 对象,我们必须根据这种行为进行编码,就像您在最终的示例 PHP 客户机代码中看到的那样。这与 Java 客户机的行为有所不同,在客户机行为中,getForecast 总是返回 Weather 对象数组,无论服务器响应中有多少个 Weather 对象。SoapClient::_getTypes() 输出并没有为我们理解这种差异提供足够的细节,因此我们要求助于 WSDL 文档来了解完整的接口规范。



本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1663
14
CakePHP 教程
1420
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
如何使用PHP和SOAP实现Web服务的调用和开发 如何使用PHP和SOAP实现Web服务的调用和开发 Jun 25, 2023 am 09:59 AM

在Web开发领域中,Web服务是一种非常重要的技术,它可以使不同的应用程序之间互相通信,从而构建更加复杂和强大的系统。在本文中,我们将深入探讨如何使用PHP和SOAP实现Web服务的调用和开发。SOAP(SimpleObjectAccessProtocol)是一种基于XML的协议,它用于在不同的应用程序之间进行信息交换。SOAP是一个重要的Web服务标

PHP和SOAP:如何实现数据的同步和异步处理 PHP和SOAP:如何实现数据的同步和异步处理 Jul 28, 2023 pm 03:29 PM

PHP和SOAP:如何实现数据的同步和异步处理引言:在现代Web应用程序中,数据的同步和异步处理变得越来越重要。同步处理指的是一次只处理一个请求,并等待该请求完成后再处理下一个请求;而异步处理则是同时处理多个请求,并不等待某个请求的完成。在本文中,我们将介绍如何使用PHP和SOAP来实现数据的同步和异步处理。一、SOAP简介SOAP(SimpleObjec

PHP和SOAP:如何实现远程过程调用(RPC) PHP和SOAP:如何实现远程过程调用(RPC) Jul 29, 2023 pm 02:45 PM

PHP和SOAP:如何实现远程过程调用(RPC)简介:近年来,随着分布式系统的兴起,远程过程调用(RemoteProcedureCall,RPC)在Web开发中被广泛采用。本文将介绍如何使用PHP和SOAP实现RPC,以及通过代码示例演示其用法。一、什么是远程过程调用(RPC)?远程过程调用(RemoteProcedureCall,RPC)是一种通信

PHP中的SOAP协议指南 PHP中的SOAP协议指南 May 20, 2023 pm 07:10 PM

随着互联网技术的不断发展,越来越多的企业级应用需要向其它应用程序提供接口以实现数据和业务的交互。在这种情况下,我们需要一种可靠的协议来传输数据并确保数据的完整性和安全性。SOAP(SimpleObjectAccessProtocol)就是一种基于XML的协议,可用于在Web环境中实现应用之间的通信。而PHP作为一种流行的Web编程语言,

使用Python解析SOAP消息 使用Python解析SOAP消息 Aug 08, 2023 am 09:27 AM

使用Python解析SOAP消息SOAP(SimpleObjectAccessProtocol)是一种基于XML的远程过程调用(RPC)协议,用于在网络上不同的应用程序之间进行通信。Python提供了许多库和工具来处理SOAP消息,其中最常用的是suds库。suds是Python的一个SOAP客户端库,可以用于解析和生成SOAP消息。它提供了一种简单而

如何使用PHP和SOAP实现数据的压缩和解压缩 如何使用PHP和SOAP实现数据的压缩和解压缩 Jul 29, 2023 pm 12:28 PM

如何使用PHP和SOAP实现数据的压缩和解压缩导言:在现代互联网应用中,数据的传输是非常常见的操作,然而,随着互联网应用的不断发展,数据量的增加和传输速度的要求,合理地使用数据压缩和解压缩技术成为了一个非常重要的话题。在PHP开发中,我们可以使用SOAP(SimpleObjectAccessProtocol)协议来实现数据的压缩和解压缩。本文将介绍如何

如何使用PHP和SOAP实现Web服务的部署和发布 如何使用PHP和SOAP实现Web服务的部署和发布 Jul 28, 2023 pm 01:57 PM

如何使用PHP和SOAP实现Web服务的部署和发布引言:在当今互联网时代,Web服务的部署和发布成为了一个非常重要的话题。PHP是一种流行的服务器端编程语言,而SOAP(SimpleObjectAccessProtocol)是一种XML协议,用于在Web服务之间进行通信。本文将向您介绍如何使用PHP和SOAP实现Web服务的部署和发布,并提供一些代码示

利用PHP和SOAP构建基于Web的应用程序的完整指南 利用PHP和SOAP构建基于Web的应用程序的完整指南 Jul 30, 2023 am 10:25 AM

利用PHP和SOAP构建基于Web的应用程序的完整指南在当今互联网的时代,基于Web的应用程序已经成为了管理和交互数据的重要工具。PHP作为一种强大的开发语言,可以与其他技术进行无缝集成,而SOAP(SimpleObjectAccessProtocol)作为一种基于XML的通信协议,为我们提供了一种简单、标准和可扩展的方法来构建Web服务。本文将为您提

See all articles