|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
根据功能来进行封装等。很多的不懂,在使用搜索引擎查找,或者请教老师和在老师详细的讲解、指导下,都能顺利解决。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 文档来懂得完全的接口标准。
看看西,人家这个编论坛,那个CMS,还有那啥CRM,我啥时候写一个呢? |
|