知识大全 PHP5中使用Web服务访问J2EE应用程序(2)
Posted 函数
篇首语:情况是在不断的变化,要使自己的思想适应新的情况,就得学习。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 PHP5中使用Web服务访问J2EE应用程序(2)相关的知识,希望对你有一定的参考价值。
PHP5中使用Web服务访问J2EE应用程序(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
我们成功地与 Weather 服务取得了联系 并显示了结果 但是如果出现错误 得不到预期的结果 该怎么办?ext/soap 可以显示客户机与服务器之间交换的 SOAP 消息 能够帮助我们确定问题所在 只有使用 trace 选项创建 SoapClient 时 才要使用跟踪功能 我们在 options 数组参数中设置 trace 选项 将该参数传递给 SoapClient 构造函数 我们将构造函数的使用改为 $soapClient = new SoapClient(//localhost: / ItsoWebService RouterWeb/wsdl/itso/session/WeatherForecastEJB wsdl array( trace => )); 并在调用 goForecast 之后调用 trace 方法 echo Request :<br> specialchars($soapClient >__getLastRequest()) <br> ; echo Response :<br> specialchars($soapClient >__getLastResponse()) <br> ; 一定要使用 specialchars 内置函数对 trace 输出进行编码 因为它将 SOAP xml 分界符转换成特殊字符 如 < 这样可以避免浏览器将其解释成标记 下面是某个请求的 trace 输出 <?xml version= encoding= UTF ?> <SOAP ENV:Envelope xmlns:SOAP ENV= xmlns:ns = > <SOAP ENV:Body> <ns :getForecast> <ns :startDate> T : : </ns :startDate> <ns :days> </ns :days> </ns :getForecast> </SOAP ENV:Body> </SOAP ENV:Envelope> 对应的应答是 <?xml version= encoding= UTF ?> <soapenv:Envelope xmlns:soapenv= xmlns:soapenc= xmlns:xsd= xmlns:xsi= instance > <soapenv:Body> <getForecastResponse xmlns= > <getForecastReturn xmlns:ns = > <ns :condition>sunny</ns :condition> <ns :date> T : : Z</ns :date> <ns :windDirection>W</ns :windDirection> <ns :windSpeed> </ns :windSpeed> <ns :temperatureCelsius> </ns :temperatureCelsius> <ns :dbflag> </ns :dbflag> </getForecastReturn> </getForecastResponse> </soapenv:Body> </soapenv:Envelope> 如果在开启跟踪功能的情况下运行客户机来收集这些输出 那么需要将 days 参数设置为 只有这样做 SOAP 应答才会输出较少的行 但是我们遇到了没有预料到的行为 我们本来期望 getForecastResponse 和以前一样是一个 Weather 对象数组 但是它应该只有一个元素 而不是 个元素 然而 它被转换成了一个简单的 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 > <plexType> <sequence> <element name= startDate nillable= true type= xsd:dateTime /> <element name= days type= xsd:int /> </sequence> </plexType> </element> 于是我们知道该函数需要两个参数 xsd:dateTime 类型的 startDate 和整数类型的 days 这与我们所了解的 SoapClient::_getTypes 函数完全匹配 但是现在我们还知道 startDate 可以为空(nillable) 毫无疑问 如果我们简化输入参数 那么该函数将如下所示 $forecastResponse = $soapClient >getForecast(array( startDate =>Null days => )); 如果明确指定今天的日期 结果会与所指定的完全一致 如果希望制定其他起始日期怎么办呢?XML Schema将 dateTime 定义成一种基本类型 按照 ISO 标准格式化 比如 T : : 假设希望了解三天之后的天气预报 可以使用内置函数 strtotime( + days ) 获得需要的日期 该函数与 time() 函数相同 都返回标准 UNIX 格式的日期时间 即表示从公元纪年开始到现在的秒数的一个整数 我们知道 XML Schema 要求日期采用具有字符串字段的 ISO 格式进行编码 于是在示例客户机中编写了 timeToIso 函数 将整数日期转换成 SOAP 编码定义的格式 但我们吃惊地发现 其实并不需要这样做 ext/soap 非常聪明地将整数日期转化成了需要的字符串字段格式 无论传递的是整数还是预格式化的字符串 都没有关系 最终传送的 SOAP 消息都是一样的 响应中的日期又如何呢?在回程中 ext/soap 从 SOAP 响应获得了 dateTime 字段 但是没有做任何格式转换 我们希望它返回一个整数 以表示从公元纪年到现在的秒数 但实际上得到的是按照 ISO 格式化的字符串 于是我们使用 strtotime 函数将其转化成整数 然后使用 strftime 格式化该整数 以便于表示 Weather Service 按日期提供预报 但它忽略了 dateTime 编码中的时间成分 所以我们没有考虑这方面的调整 如果从运行在不同时区内的服务中请求天气预报 那么可能必须这样做 如果希望进一步了解时区转换 请参阅参考资料中给出的描述 ISO 标准的文章 现在再回到响应格式上来 上一节中曾经提到 getForecast 返回数据的不一致性 WSDL 描述告诉我们 getForecast 返回一个 getForecastResponse 对象 getForecastResponse 可以包含无限多个称为 Weather 的复杂类型的列表 <element name= getForecastResponse > <plexType> <sequence> <element maxOccurs= unbounded name= getForecastReturn type= tns :Weather /> </sequence> </plexType> </element> <plexType 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> </plexType> WSDL 不允许出现单元素数组这种特例 不幸的是 当响应只包含一个 Weather 对象时 ext/soap 没有考虑 WSDL 中应用于 getForecastResponse 的 <sequence> 标签 因为这种行为在客户机代码中造成了不必要的复杂性 最后 WSDL 文档还告诉 SOAP 客户机可以从网络中的哪个地方找到该服务 <wsdl:service name= WeatherForecastEJBService > <wsdl:port binding= intf:WeatherForecastEJBSoapBinding name= WeatherForecastEJB > <wsdlsoap:address location= //localhost: /ItsoWebService RouterWeb/services/WeatherForecastEJB /> </wsdl:port> </wsdl:service> 处理 SOAP 错误 如果运行客户机时出现错误怎么办?与其他语言(如 Java)一样 PHP 新增加了一种异常机制 ext/soap 使用这种新的机制 以 SoapFault 对象的形式返回错误 比方说 可以用下面这种形式将代码包装起来 try some SOAP operation catch (SoapFault $soapFault) echo $soapFault; 注意 与 Java 有所不同 PHP 语言的 try catch 块不能包含 finally cha138/Article/program/PHP/201311/20772相关参考
知识大全 J2EE应用服务器(Jboss+Tomcat)安装攻略
J2EE应用服务器(Jboss+Tomcat)安装攻略 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
身份验证是检查以查看特定用户是否是他们所声称用户的过程通常通过常见的用户ID/口令项完成这一点保护Web服务安全的一种方法是强制尝试使用服务的任何人必须首先提供证书
知识大全 12.9远程Web服务—PocketPC应用程序[2]
12.9远程Web服务—PocketPC应用程序[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
改进的OracleJpublisher可以将数据库实体映射到Java和Web服务 编写客户端和中间层的Java与JEE应用程序来表示数据库实体如用户定义的SQL对象类型和集合类型时如果你需要
如何解决Web访问时提示输入密码? 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我的IIS服务
在web应用中对页面的访问控制通常通过程序来控制流程为登录>设置session>访问受限页面时检查session是否存在如果不存在禁止访问 对于较小型的web应用可以通过tomcat
知识大全 在ASP.NET AJAX的web应用中使用TODO服务
在ASP.NETAJAX的web应用中使用TODO服务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
知识大全 用Web Services来整合.NET和J2EE
用WebServices来整合.NET和J2EE 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
为Web服务构建Struts应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 当您要将企业
知识大全 J2EE WEB-Tomcat5.5.9中文问题解决方案
J2EEWEB-Tomcat5.5.9中文问题解决方案 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧