SOAP异常处理

简介:

在客户端调用服务端方法时候,并不是一帆风顺的,就需要soap的异常处理来找到问题的所在:

调试我们的程序 —— 捕获异常
考虑一个我们编写代码时很可能出现的错误:在为调用的操作输入参数时,参数中某个元素的名字错误或是没有提供。例如我们把查询需要的产品代码的名字错误地写成了"ProductCod",这时运行客户端代码,是不可能得到正确的结果的。我们怎么才能发现这个错误呢?
PHP 5 中新增了很多编程语言中都提供的异常处理机制 try...catch,我们可以把客户端的实现代码包含在这个结构里 ( 需要注意的是,PHP 5 中不支持 finally 子句 ):

清单 14. 加入异常处理部分的客户端代码

try 

$client = new SoapClient('./ProductQuery.wsdl'); 
$result = $client->__soapCall('QuerySpec', array( array( "ProductCod" => '1175-PXA' ) ) ); 
echo "Product Code:" . $client->ProductCode . "<br />"; 
echo "Product Code:" . $client->CPU . "<br />"; 
echo "Product Code:" . $client->RAM . "<br />"; 
echo "Product Code:" . $client->Screen . "<br />"; 
echo "Product Code:" . $client->HDD . "<br />"; 

catch (SoapFault $e) 

echo $e; 
}

我们会在浏览器中得到这样的输出:


清单 15. Web 服务端返回的异常信息:缺少属性

SoapFault exception:  [Client] SOAP-ERROR: Encoding: object hasn't 'ProductCode' property in  C:\xampp\htdocs\soapTest\GetProductInfo.php:17  Stack trace:  #0 C:\xampp\htdocs\soapTest\GetProductInfo.php(17): SoapClient->__soapCall('QuerySpec',  Array)  #1 {main}

在 这个例子中,异常是由 SoapClient 对象直接抛出的,它检查输入的参数,如果发现某个 WSDL 文件中定义的项没有被提供,便抛出这个异常,告诉我们"ProductCode"属性没有被提供。而我们通过有针对性的检查代码,就可以比较容易的发现错 误所在。服务端同样也可能抛出异常,这些异常通常是客户端检查时无法发现的,例如某些逻辑错误,如果我们输入了一个不合法的产品代码,就可能捕获到服务端 抛出的“不合法的产品代码”异常。为了实现这一功能,我们需要在服务端的代码中加入下面的一段语句:



清单 16. Web 服务端抛出产品代码无效的异常

if( !$result ){  throw new SoapFault("Server", "Invalid Product Code!");  }

这 段语句在未得到查询结果的情况下(这时认为原因是提供了无效的产品代码),抛出了一个 SoapFault 异常,用于创建 SoapFault 对象的参数包括错误代码,以及必要的错误信息。需要注意的是,错误代码只能使用 SOAP 标准中已定义的值,使用其他的值不会返回正确的信息。具体可使用的值可以查看 W3C 的 SOAP 文档。这样,在客户端提供无效的产品代码时,会捕获到的异常信息:


清单 17. Web 服务端返回的异常信息:产品代码无效

SoapFault exception:  [SOAP-ENV:Server] Invalid Product Code! in C:\xampp\htdocs\soapTest\GetProductInfo.php:17  Stack trace:  #0 C:\xampp\htdocs\soapTest\GetProductInfo.php(17): SoapClient->__soapCall('QuerySpec', Array)  #1 {main}

于是我们就知道提供的产品代码是无效的了。





      本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/925195,如需转载请自行联系原作者

相关文章
|
前端开发
调试前端时,在浏览器上修改参数并重新调用接口
有时候我们的页面点击过了,但是接口出问题,想修改参数再调用一次,一般是用apiPost工具把接口复制,再加上token和参数,但是这样非常的效率比较低。
1871 0
|
存储 运维 Kubernetes
Kubernetes密钥管理安全方案和最佳实践
众所周知,Kubernetes作为编排引擎为应用开发者提供了Secrets模型用于在应用Pod中加载和使用敏感信息(如数据库密码、应用证书、认证token等)。Secrets的使用对于K8s开发者来说应该已经比较熟悉了,下面是一些Secrets相关的基本概念:Secrets是一个namespace维度的模型,结合K8s RBAC访问控制可以实现集群内namespace维度的读写隔离Secrets可
1378 0
Kubernetes密钥管理安全方案和最佳实践
|
Docker 容器
Mac Docker下安装与使用ShowDoc在线文档
Mac Docker下安装与使用ShowDoc在线文档
259 0
|
机器学习/深度学习 并行计算 Linux
PyCharm+Docker:打造最舒适的深度学习炼丹炉
PyCharm+Docker:打造最舒适的深度学习炼丹炉
518 0
|
9月前
|
SQL 人工智能 关系型数据库
PolarDB-PG AI最佳实践 2 :PolarDB AI X EAS实现自定义库内模型推理最佳实践
PolarDB通过POLAR_AI插件支持使用SQL调用AI/ML模型,无需专业AI知识或额外部署环境。结合阿里云EAS在线模型服务,可轻松部署自定义模型,在SQL中实现如文本翻译等功能。
|
11月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
机器学习/深度学习 编解码 监控
深入解析YOLOv2
深入解析YOLOv2
|
机器学习/深度学习 编解码 人工智能
深度学习与CV教程(16) | 生成模型(PixelRNN,PixelCNN,VAE,GAN)
本文讲解了无监督学习(聚类、PCA、特征学习、密度估计)和三种常用生成模型的原理及优缺点:Pixel RNN / Pixel CNN、变分自编码器(VAE)、生成对抗网络(GAN)【对应 CS231n Lecture 13】
20022 1
 深度学习与CV教程(16) | 生成模型(PixelRNN,PixelCNN,VAE,GAN)
|
关系型数据库 MySQL Linux
在Linux下安装Mysql教程(图文)
在Linux下安装Mysql教程(图文)
815 0
在Linux下安装Mysql教程(图文)
|
开发工具 Android开发 数据安全/隐私保护
AppsFlyer 研究(十四)创建 Facebook App 获取FaceBook App ID
AppsFlyer 研究(十四)创建 Facebook App 获取FaceBook App ID
837 0