|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
基础这个东西,有人问学php需要任何基础不?j2ee|php5|web|web办事|法式|会见 处置 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 的主流扩大。 大部分语言的基础,不是说c有多好,而是c相对起手容易学,让你认为这个是编程语言, |
|