仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1208|回复: 18
打印 上一主题 下一主题

[学习教程] PHP教程之PHP5中利用Web办事会见J2EE使用法式

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:54:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
要想从事软件开发工作,那么,还有很多的知识要学习,其实,不管是以后想去从事哪个工作,都需要自己去利用空闲的时间去不断的学习新的知识,不断的充实自己。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 客户机。
  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=0 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 文档来懂得完全的接口标准。
  注释 WSDL

  咱们已胜利地挪用了 Weather 办事,然而还没有看过它的 WSDL 文档。WSDL 中的细节要比 SoapClient 公然的多。咱们若何晓得应当在 startDate 参数中放甚么呢?咱们应当希冀从前往的数据中实践失掉甚么?要回覆这些成绩,必需更深切地剖析 WSDL。

  可以从下载局部下载 Weather Forecast 使用法式的 WSDL。假如利用分歧的 Web 办事,只需求在阅读器中翻开响应的 WSDL 文档便可。

  getForecast 操作的 WSDL 是:


<wsdl:operation name="getForecast">
<wsdl:input message="intf:getForecastRequest" name="getForecastRequest"/>
<wsdl:output message="intf:getForecastResponse" name="getForecastResponse"/>
</wsdl:operation>

  个中的 getForecastRequest 动静被界说为:


<wsdl:message name="getForecastRequest">
<wsdl:part element="intf:getForecast" name="parameters"/>
</wsdl:message>

  而 getForecast 布局被界说为:


<element name="getForecast">
<complexType>
<sequence>
<element name="startDate" nillable="true" type="xsd:dateTime"/>
<element name="days" type="xsd:int"/>
</sequence>
</complexType>
</element>

  因而咱们晓得该函数需求两个参数,xsd:dateTime 类型的 startDate 和整数类型的 days。这与咱们所懂得的 SoapClient::_getTypes 函数完整婚配,然而如今咱们还晓得 startDate 可觉得空(nillable)。毫无疑问,假如咱们简化输出参数,那末该函数将以下所示:

$forecastResponse = $soapClient->getForecast(array('startDate'=>Null, 'days'=>3));

  假如明白指定明天的日期,了局会与所指定的完整分歧。

  假如但愿制订其他肇端日期怎样办呢?XML Schema将 dateTime 界说成一种根基类型,依照 ISO 8601 尺度格局化,好比“2004-12-01T00:00:00”。假定但愿懂得三天以后的天色预告,可使用内置函数 strtotime("+3 days") 取得需求的日期,该函数与 time() 函数不异,都前往尺度 UNIX 格局的日期工夫,即暗示从公元编年入手下手到如今的秒数的一个整数。咱们晓得 XML Schema 请求日期采取具有字符串字段的 ISO 8601 格局停止编码,因而在示例客户机中编写了 timeToIso8601 函数,将整很多天期转换成 SOAP 编码界说的格局。但咱们受惊地发明,其实其实不需求如许做,ext/soap 十分伶俐地将整很多天期转化成了需求的字符串字段格局。不管传递的是整数仍是预格局化的字符串,都没有关系,终究传送的 SOAP 动静都是一样的。

  呼应中的日期又若何呢?在回程中,ext/soap 从 SOAP 呼应取得了 dateTime 字段,然而没有做任何格局转换。咱们但愿它前往一个整数,以暗示从公元编年到如今的秒数,但实践上失掉的是依照 ISO 8601 格局化的字符串。因而咱们利用 strtotime 函数将其转化成整数,然后利用 strftime 格局化该整数,以便于暗示。

  Weather Service 按日期供应预告,但它疏忽了 dateTime 编码中的工夫成份。所以咱们没有思索这方面的调剂,假如从运转在分歧时区内的办事中恳求天色预告,那末能够必需如许做。假如但愿进一步懂得时区转换,请参阅参考材料中给出的描写 ISO 8601 尺度的文章。

  如今再回到呼应格局下去。上一节中已经提到 getForecast 前往数据的纷歧致性。WSDL 描写告知咱们 getForecast 前往一个 getForecastResponse 对象,getForecastResponse 可以包括无穷多个称为 Weather 的庞杂类型的列表:


<element name="getForecastResponse">
<complexType>
<sequence>
<element maxOccurs="unbounded" name="getForecastReturn" type="tns2:Weather"/>
</sequence>
</complexType>
</element>

<complexType name="Weather">
<sequence>
<element name="condition" nillable="true" type="xsd:string"/>
<element name="date" nillable="true" type="xsd:dateTime"/>
<element name="windDirection" nillable="true" type="xsd:string"/>
<element name="windSpeed" type="xsd:int"/>
<element name="temperatureCelsius" type="xsd:int"/>
<element name="dbflag" type="xsd:boolean"/>
</sequence>
</complexType>

  WSDL 不答应呈现单位素数组这类特例。不幸的是,当呼应只包括一个 Weather 对象时,ext/soap 没有思索 WSDL 中使用于 getForecastResponse 的 <sequence> 标签,由于这类行动在客户机代码中形成了不用要的庞杂性。

  最初,WSDL 文档还告知 SOAP 客户机可以从收集中的哪一个中央找到该办事:


<wsdl:service name="WeatherForecastEJBService">
<wsdl:port binding="intf:WeatherForecastEJBSoapBinding"
name="WeatherForecastEJB">
<wsdlsoap:address location=
"http://localhost:9080/ItsoWebService2RouterWeb/services/WeatherForecastEJB"/>
</wsdl:port>
</wsdl:service>
  处置 SOAP 毛病

  假如运转客户机时呈现毛病怎样办?与其他言语(如 Java)一样,PHP 5 新增添了一种异常机制。ext/soap 利用这类新的机制,以 SoapFault 对象的模式前往毛病。例如说,可以用上面这类模式将代码包装起来:

try {
... some SOAP operation
} catch (SoapFault $soapFault) {
echo $soapFault;
}
  注重,与 Java 有所分歧,PHP 言语的 try - catch 块不克不及包括 finally 子句。

  SoapFault 可以在当地生成。例如说,假定输错了 getForecast 的 startDate 参数。客户机的输入就会酿成:

SoapFault exception: [SOAP-ENV:Client]
SOAP-ERROR: Encoding: object hasn't 'startDate' property in WeatherClientEJB.php:32
Stack trace: #0 WeatherClientEJB.php(32): SoapClient->getForecast('getForecast', Array)
#1 WeatherClientEJB.php(73): displayForecast(Array)
#2 {main}
  注重,个中没有 trace 输入,由于并没有发送恳求。SOAP_ENV:Client 是 SOAP 标准中为 Faulty body 元素 Faultcode 字段界说的值之一。

  这个 SoapFault 是在 ext/soap 外部发明毛病时生成的,它没有发送 SOAP 动静。然而 SoapFaults 也能够呈报办事器上发明的毛病。好比,假定修正代码,将 startDate 参数的值设成“badDateString”。这是一个不法的 ISO 8601 字符串,然而 ext/soap 没有反省供应的格局,仅仅把动静发送到办事器,而办事器回绝该恳求:

Request :
<?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>badDateString</ns1:startDate>
<ns1:days>2</ns1:days>
</ns1:getForecast>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Response :
<?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>
<Fault xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode xmlns="">Server.generalException</faultcode>
<faultstring xmlns="">
<![CDATA[java.lang.NumberFormatException:
WSWS3046E: Error: Invalid date/time: badDateString]]>
</faultstring>
<detail xmlns=""/>
</Fault>
</soapenv:Body>
</soapenv:Envelope>

SoapFault exception: [Server.generalException] java.lang.NumberFormatException:
WSWS3046E: Error: Invalid date/time: badDateString in WeatherClientEJB.php:32
Stack trace: #0 WeatherClientEJB.php(32): SoapClient->getForecast('getForecast', Array)
#1 WeatherClientEJB.php(73): displayForecast(Array)
#2 {main}
  这一次,SOAP 恳求传递给了办事器,然而由于日期格局有效而被回绝。WeatherForecastEJB 完成抛出一个 java.lang.NumberFormatException,该异常在 SOAP 应对中作为 Faulty body 元素前往,然后作为一个 SoapFault 异常呈报给客户机。

  回护 Web 办事

  咱们考查了三种平安办法,和若何在 PHP 中利用它们:

  根基 HTTP 身份验证

  假如 HTTP 办事器请求客户机停止身份验证,就会恳求用户输出 id 和口令并在应对中增添 Authentication Required HTTP 头文件。在停止后续操作之前,客户机必需呼应包括可承受 Authorization HTTP 头文件的恳求。

  恳求 HTTP 身份验证的凡是是 Web 办事器,而不是 Web 办事供应者。Authentication Required HTTP 头文件被传递给阅读器,阅读器弹出对话框恳求用户 id 和口令,然后将用户的应对作为 HTTP Authorization 头文件发送给 Web 办事器。在 PHP 剧本中很轻易完成这一点,可使用 header() 函数发送需求的 HTTP 头文件字段。例如:

if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Weather"');
header("HTTP/1.0 401 Unauthorized");
}
echo "Welcome " . $_SERVER['PHP_AUTH_USER'];
  PHP 手册中的利用 PHP 停止 HTTP 身份验证 一章具体引见了这个进程。

  您能够碰到如许一些 Web 办事,这些办事的供应者请求 PHP Web 办事客户机利用 HTTP 停止验证身份。ext/soap 供应了一种复杂的发送 HTTP Authorization 恳求头文件的办法,利用传递给 SoapClient 机关函数的 options 数组:

$soapClient = new SoapClient("http://localhost:9080/" .
"ItsoWebService2RouterWeb/wsdl/itso/session/WeatherForecastEJB.wsdl",
array('login' => "userid",
'password' => "password"));
  然而,人们以为 HTTP 根基身份验证不是一种平安的用户验证办法(除非联合利用其他内部平安体系,如 SSL),由于用户名和口令是以明文模式在收集上传递的。 HTTP Digest 验证经由过程加密口令改善了这类办法,然而并非一切的阅读器都撑持这类改善。并且,PHP 的 header() 函数只撑持根基身份验证。

  SSL(平安套接字层)

  一种加倍平安的协定是 HTTPS(HTTP over SSL),它利用 SSL 加密 HTTP 动静。SSL 在传输层上任务,不懂得 HTTP 或 SOAP 协定。因而,它不克不及只加密动静中的敏感成份,而必需加密全部动静。HTTPS 可以在阅读器与 Web 办事器之间,或 Web 办事器与 Web 办事供应者之间利用。

  假如编译并启用了 OpenSSL,那末 PHP 还可以撑持 HTTPS。若何在 PHP 剧本中利用 SSL,请参阅 PHP 手册中的 OpenSSL 一章。

  身份验证怎样呢?SSL 可以发送平安证书,对方可以承受或回绝该平安证书。假如请求客户机验证 Web 办事供应者(如电子商务使用法式),那末这类办法很无效。然而假如 Web 办事自己供应敏感信息的会见,那末 Web 办事供应者仍是需求验证每一个客户。基于证书的身份验证其实不适合,由于客户能够良多,并且是静态的,事前为每一个客户分发恰当的证书不太实际。

  WS-Security

  WS-Security 尺度为 Web 办事平安供应了分歧的办法。今朝咱们所考查的平安掌握都在 SOAP 协定以外。然而 WS-Security 是经由过程在 SOAP 动静中增添平安头文件来完成平安掌握的。好比,关于 WS-Security 根基身份验证(与 HTTP 根基身份验证分歧),上面的标签将呈现在 SOAP 头文件中:

<wsse:UsernameToken>
<wsse:Username>userid</wsse:Username>
<wsse:Password>password</wsse:Password>
</wsse:UsernameToken>
  这只是一个复杂的例子,不外,完全的平安扩大集长短常完美的,不但包含身份验证,还包含完全性、保密性,等等。

  今朝 ext/soap 中还没无为 WS-Security 供应很好的撑持。因而,假如要在 PHP 中发送和吸收 WS-Security 头文件,那末必需深切到更底层的接口,显式地创立 SOAP 头文件。到今朝为止,示例中利用的都是 ext/soap 的 WSDL 形式。然而,还有一种非 WSDL 形式,可以用它来掌握全部 SOAP 动静。固然也必需在代码中做大批的任务。可使用 SoapHeader、SoapParam 和 SoapVar 类创立动静,然后用 SoapClient::__call 发送 SOAP 恳求和吸收呼应。假如没有任何内置撑持,那末在 PHP 中编写 Web 办事平安扩大(或其他初级标准如 WS-Transactions)将是一项相当艰难的义务,咱们不盘算在本文中停止这方面的测验考试。

  停止语

  利用 PHP SOAP 扩大其实不难。不管办事器是若何完成的,只需求几行代码,就能够开辟出会见复杂 Web 办事的 PHP 剧本。与平常一样,PHP 在易用性上体现十分精彩。本文次要会商了若何利用 SoapClient 类会见异构收集上的现有 Web 办事,然而经由过程利用 ext/soap,使用 SoapServer 类也能够安排 Web 办事,一样十分直不雅。

  假如要处置更庞杂的交互,ext/soap 以后的版本不克不及给咱们供应良多匡助。从 XML 形式到 PHP 的映照有时分不敷明晰,只能经由过程实验或研讨源代码来验证。假如但愿利用更先辈的 Web 办事协定,唯一的选择就是深切研讨非 WSDL 形式,用本人的剧本创立 SOAP 头文件,但如许做十分有趣并且轻易失足。

  Web 办事的一项主要主意是分歧平台、操作体系和编程言语的互操作性。自力的 WS-I (Web Services Interoperability) Organization 供应了一个测试包,以验证对其 Basic Profile 的顺应性,咱们但愿看到 ext/soap 可以到达某种水平,体现出它可以顺应。咱们也但愿 ext/soap 持续开展,成为 PHP 的主流扩大。
多个成员之间重复做相同的工作,很容易因为交流沟通的时候没有进行一致性的文档要求而出现不明错误,严重影响开发进度,导致在预定时间内无法完成该项目或者完成的项目跟原先计划所要实现的项目功能不符合。
谁可相欹 该用户已被删除
沙发
发表于 2015-2-4 07:01:57 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
再现理想 该用户已被删除
板凳
发表于 2015-2-7 16:10:06 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
再见西城 该用户已被删除
地板
发表于 2015-2-10 02:46:10 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
爱飞 该用户已被删除
5#
发表于 2015-2-17 07:53:46 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
灵魂腐蚀 该用户已被删除
6#
发表于 2015-3-1 07:23:48 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
若天明 该用户已被删除
7#
发表于 2015-3-1 14:33:59 | 只看该作者
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
兰色精灵 该用户已被删除
8#
发表于 2015-3-10 18:44:15 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
愤怒的大鸟 该用户已被删除
9#
发表于 2015-3-19 18:29:07 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
10#
发表于 2015-3-24 11:26:08 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
蒙在股里 该用户已被删除
11#
发表于 2015-4-2 22:52:48 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
海妖 该用户已被删除
12#
发表于 2015-4-4 17:23:56 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
admin 该用户已被删除
13#
发表于 2015-5-2 18:57:55 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
莫相离 该用户已被删除
14#
发表于 2015-5-3 19:42:43 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
乐观 该用户已被删除
15#
发表于 2015-5-8 05:09:16 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
飘灵儿 该用户已被删除
16#
发表于 2015-6-21 16:21:00 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
透明 该用户已被删除
17#
发表于 2015-6-22 02:17:39 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
小妖女 该用户已被删除
18#
发表于 2015-6-26 20:27:40 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
因胸联盟 该用户已被删除
19#
发表于 2015-7-11 04:41:34 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-29 07:08

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表