像是老古董那般听起来的SOAP这项技术,然而它于企业级系统交互里仍然起着关键作用。理解SOAP消息的结构,是掌握跨平台、跨语言服务通信的根基所在呀。
一则SOAP消息,从本质层面来讲,实则就是一份普通的XML文档。其最外层必然得是Envelope元素,此元素好似信封那般,将整个消息给包裹起来,告知接收方“这可是一条SOAP消息呀”。Envelope的内部,结构清晰明了,划分成Header和Body这两大模块,Header用以存放元质信息,Body则用来存放核心业务数据。这般具有强制性的结构,确保了消息于任何系统当中都能够被精准解析,不会产生歧义。
消息里不能少了Body元素,它承担着实际的调用请求或者响应结果。举例来说,当你调用查天气的服务时,请求的城市代码会放置在Body当中;服务器返回的天气信息也会放置于Body里面。要是处理期间出现错误,Fault元素会作为Body的一部分露面,详尽说明错误的类型、缘由以及具体位置,以此协助开发者迅速定位问题。
即便Header元素属于可选择的范畴,然而其具备高度关键之作用。诸多高级功能依靠Header达成,诸如安全所涉及的认证信息,又如与事务处理相关的标识,还像消息路由所遵循的各种规则等。这些信息并不归属于业务逻辑自身,不过却必然要随着消息进行配送。把这般类型的控制信息放置于Header之内,达成该消息自身业务数据和控制数据走向拆分,使得消息结构变得更加清晰,同时也便利中间件实施统一处理。
SOAP消息具备支持附件功能,在有传递图片、PDF文档或者二进制数据需求时,为扩展消息可借助添加附件的方式。附件并非直接嵌入XML文档里,而是以MIME格式同SOAP部分组合起来。这样的设计不但维持了XML部分的可读性,还能高效传输大型二进制文件,使得SOAP在实际应用里更为实用。
分布技术发展进程里,CORBA曾占重要位置,它是跨平台的分布式对象标准,重视不同操作系统间的互操作性,DCOM也曾具重要地位,它是微软推出的组件模型,主要针对Windows平台,它们都可使客户端远程调用服务端对象,然而实现方式繁杂,并且难以穿透防火墙。
出现的SOAP,解决了这个痛点,它基于XML以及HTTP,天生具备穿透防火墙的能力,原因在于HTTP是绝大多数网络都开放的协议,SOAP并非要取代CORBA或者DCOM,而是充当了通信桥梁的角色,使得原本仅能运行在CORBA或者DCOM环境中的对象,也能够借助SOAP协议对外提供服务,达成了不同技术体系间的互操作。
在J2EE平台开展Web服务开发工作,JAXM属于重要选项当中的一个,JAXM专门是针对依托XML的消息处理情况的,它不但支持同步请求响应模式,还支持异步消息传递方式,这表明客户端于发送消息之后并非必须马上等待响应,能够在稍后的时候再去获取结果,这样的一种机制在处理耗时较长的业务之际相当实用。
JAXM的核心API集中于javax.xml.soap包内,开发者借助这个包能够创建,构建以及解析SOAP消息,不用手动去拼接XML字符串,包里面的MessageFactory类承担生成SOAPMessage对象的职责,SOAPPart、SOAPEnvelope、SOAPBody等类各自对应SOAP消息的各个构成部分,凭借这些API,程序员能够以面向对象的方式来操作SOAP结构。
生成JAXM SOAP消息的起始步骤乃是获取MessageFactory实例,要是应用于容器内已然运行且运用了JAXM提供者途径之时,能够借助连接去请求工厂,不然的话直接调用MessageFactory的静态方法newInstance可行。把东西拿到工厂那儿之后,调用createMessage方法呢,就能够得到SOAPMessage对象,紧接着,借助getSOAPPart、getEnvelope等方法,层层地深入进去,一级一级地构建Header和Body里面的具体内容。
当编写SOAP客户端之际,需要去确立到服务端的点对点连接,开发者要引入JAXM开发包,借由SOAPConnectionFactory来创建连接,接着运用call方法把构建好的消息发送出去,并且接收返回的响应消息。整个流程类似于播送一个经过包装的HTTP请求,然而JAXM封装了大量底层细节,使得开发者能够专注于业务逻辑。
在服务端接收SOAP消息,并且对其进行处理,JAXM给出了两种在容器内的实现办法。其一为使用Servlet,这种办法部署于Web容器内,借助重写service方法来解析SOAP请求,然后返回响应;其二是使用消息驱动Bean,它运行于EJB容器中,运用EJB的事务以及安全机制来处理消息。这两种方式各自有着适用的场景,开发者能够依据应用的规模以及复杂度来进行选择。
存在于JAXM API里的javax.xml.messaging.ReqRespListener接口被提供了,借助SOAPService类能够迅速达成SOAP服务器。服务程序得去扩展SOAPService并将该接口予以实现,于onMessage方法之中撰写处理逻辑。这样的方式具备轻量以及灵活的特性,适宜在不存在完整Java EE容器的环境里快速构建SOAP服务。
SOAP跟CORBA、COM/DCOM并非是替代关系,而是属于协同关系。于企业级开发当中,依据业务场景去挑选合适的技术组合,这才算是明智的做法。你在实际项目里使用过SOAP吗?碰到过哪些棘手的兼容性问题?欢迎在评论区分享你的经历。
Copyright © 2002-2025 尊时凯龙 版权所有 非商用版本 备案号:ICP备202132526号