当前位置: 首页 > news >正文

SOAP协议初级指南(九)

   错误处理

  一个服务器有时将不能正确地为一个方法请求提供服务。这可能是由于一般的HTTP错误造成的(如请求-URI不能被映射到本地的资源或一个HTTP级的安全违反)。也可能是在SOAP翻译软件中的问题,如马歇尔打包错误或一个必须的头不能被认出。其它可能的原因包括一个请求不能正确地被服务,或者应用/对象代码决定要返回一个应用级的错误给调用者。这些情况在SOAP规范中都被清楚地加以处理。

  如果在分发对任何SOAP代码的调用之前一个错误发生在HTTP层,一个纯HTTP响应必须被返回。标准的HTTP状态代码编号将被采用,400级的代码表示一个客户引发的错误,500级的代码表示服务器引发的错误。这通常在代码执行前由Web服务器软件自动处理。

  假设在HTTP层一切正常,错误发生的下一个地方是在那些翻译和分发对应用代码(如COM对象和CORBA伺服对象)的SOAP调用。如果错误发生在这一层,服务器必须返回一个错误消息来代替一个标准的响应消息。一个错误消息是下列被编码为soap:Body的根元素的类型的实例。

<schema
targetNamespace=‘urn:schemas-xmlsoap-org:soap.v1‘

<element name=‘Fault‘>
<type>
<element name=‘faultcode‘ type=‘string‘ />
<element name=‘faultstring‘ type=‘string‘ />
<element name=‘runcode‘ type=‘string‘ />
<element name=‘detail‘ />
</type>
</element>
 
</schema>
 
  faultcode存取元素必须包含一个用已知的整数表示的SOAP错误代码或者一个专门应用的名域限制的值。当前的SOAP 错误代码如图12所示。Faultstring存取元素包含对发生的错误的可读性的描述。runcode 存取元素包含一个字符串,它的值必须是Yes, No或 Maybe,表明被请求的操作实际上是否在错误产生之前被执行。Detail存取元素是可选的,用于包含一个专门应用的异常对象。

  下面是一个对应于一个包含无法识别的必须的头元素的请求的SOAP错误的例子:

<soap:Envelope
xmlns:soap=‘urn:schemas-xmlsoap-org:soap.v1‘

<soap:Body>
<soap:Fault> ;
<faultcode>200</faultcode>
<faultstring>
Unrecognized ‘causality‘ header
</faultstring>
<runcode>No</runcode>
</soap:Fault>
</soap:Body>
</soap:Envelope>

  假设具体应用的错误需要被返回,你可能看到如图13所示的代码。在应用定义的错误的情况下,考虑应用的异常/错误对象时detail存取元素起到了soap:Body 元素的作用。

   奥秘

  一个遗留的HTTP问题还需要进一步阐明。SOAP支持(但不需要)HTTP扩展框架约定来指定必须的HTTP头扩展。这些约定主要有两个目的。首先,它们允许任意的URI被用于限定给定的HTTP头的范围(象XML名域一样)。第二,这些约定允许把必须的头与可选的头区分开来(象soap:mustUnderstand)。下面是一个使用HTTP扩展框架来把SOAPMethodName头定义成为一个必须的头扩展:

M-POST /foobar HTTP/1.1
Host: 209.110.197.2
Man: "urn:schemas-xmlsoap-org:soap.v1; ns=42"
42-SOAPMethodName: urn:bobnsid:IFoo#DoIt

  Man头映射SOAP URI到前缀为42的头,并表示没有认出SOAP的服务器必须返回一个HTTP错误,状态代码为501 (没有被实现) 或 510 (没有被扩展)。HTTP方法必须是M-POST,表明目前是必须的头扩展。

   结论

  SOAP是一个被类型化的序列化格式,它恰巧用HTTP 作为请求/响应消息传输协议。SOAP被设计为与正将出现的XML Schema规范密切配合,并支持在Internet的任何地方运行的COM, CORBA, Perl, Tcl, 和 Java-language, C, Python, 或 PHP 等程序间的互操作性。

  希望本文给了你一个对这个协议具体细节的更清晰的理解。我鼓励你用SOAP进行实验,或者试着使用SOAP使能的系统之一(列在http://www.develop.com/soap/),或者自己做一些工作。我本人发现采用脚本语言(Jscript),使一个基本的SOAP客户与服务器建立并运行只花费了不到一个小时。针对你对HTTP和XML的熟悉程度,以及你的目标平台的成熟度,你所花费的时间会有所不同。

相关文章:

  • python创建工作簿_使用工作表名称作为键从python中的excel工作簿创建词典
  • 参加developerWorks活动
  • mysql8.0.11 安装失败_mysql8.0.11安装遇到问题及解决方法。
  • ActiveBPEL引擎(4.0)启动步骤分析(ActiveBPEL Engine Startup Steps)
  • 3COM SS3 4400交换机VLAN功能设置
  • python集合的操作符_深入解析Python中的集合类型操作符
  • 一句话解释python的装饰器_如何理解python的描述器和装饰器?
  • 认识COS
  • 康佳lc32es62没声音_康佳LC32ES62有伴音,无图像无字符
  • 解析.Net框架下的XML编程技术
  • java as_Java对象转成AS的VO对象 | 学步园
  • .net2005怎么读string形的xml,不是xml文件。
  • java调用存储过程 oracle_Java调用Oracle存储过程详解
  • 章立民老师北京ASP.NET Ajax技术研讨会获广泛好评
  • java 1.7的新特性_JDK1.7新特性
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • canvas 绘制双线技巧
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • export和import的用法总结
  • iOS 颜色设置看我就够了
  • JavaScript 奇技淫巧
  • Swoft 源码剖析 - 代码自动更新机制
  • Vue组件定义
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 树莓派 - 使用须知
  • 用Canvas画一棵二叉树
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 阿里云重庆大学大数据训练营落地分享
  • ​业务双活的数据切换思路设计(下)
  • #define 用法
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $L^p$ 调和函数恒为零
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (pytorch进阶之路)扩散概率模型
  • (附源码)计算机毕业设计高校学生选课系统
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)c++ std::pair 与 std::make
  • **CI中自动类加载的用法总结
  • **PHP分步表单提交思路(分页表单提交)
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core控制台应用程序初识
  • .Net MVC + EF搭建学生管理系统
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 材料检测系统崩溃分析
  • .NET建议使用的大小写命名原则
  • .NET下的多线程编程—1-线程机制概述
  • [100天算法】-二叉树剪枝(day 48)
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [20190113]四校联考
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [AIGC] Spring Interceptor 拦截器详解
  • [c++] C++多态(虚函数和虚继承)