上一节讲述了webservice的发布,本节说明一下基于SOAP消息的调用实现细节,按顺序先后
1、创建要访问的ws服务对象
URL endpointURL = new URL("http://localhost:8889/ms?wsdl");//访问的URL //QName的第一参数是targetNamespace,第二个是name QName qName= new QName("http://service.soap.org/","MyServiceImplService"); //创建远程服务访问对象 Service service = Service.create(endpointURL, qName);
2、创建消息转发器
//基于消息的方式,因此,后两个参数是SOAPMessage.class, Service.Mode.MESSAGE,第一个参数是要访问的那个服务port的name Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName("http://service.soap.org/","MyServiceImplPort")/*一定要加上命名空间,否则出错*/, SOAPMessage.class, Service.Mode.MESSAGE);
3、组建要转发的请求
也就是你要访问那个方法,就组装那个方法的请求(参数),封装到SOAP消息中
SOAPMessage message = MessageFactory.newInstance().createMessage();//创建消息对象,用于获取信封对象 //获取body SOAPBody body = message.getSOAPPart().getEnvelope().getBody(); //指定具体访问那个方法 QName method = new QName("http://service.soap.org/","addUser","tt");//访问的方法 SOAPElement bodyElement = body.addBodyElement(method); //父元素写了namespace,子元素就不用写了,namespace具有继承性 SOAPElement user = bodyElement.addChildElement("user");//创建元素,然后添加调用方法的参数内容 user.addChildElement("id").setValue("12"); user.addChildElement("nickname").setValue("tudou123"); user.addChildElement("password").setValue("123123"); user.addChildElement("username").setValue("xxx");
需要说明的是SOAPMessage的是用方法,下面内容是jdk文档中的描述
所有 SOAP 消息的根类。因为 SOAP 消息是通过“导线”传输的,所以它是 XML 文档或第一个正文部分为 XML/SOAP 文档的 MIME 消息。 SOAPMessage 对象由一个 SOAP 部分和一个或多个附件部分(可选)组成。SOAPMessage 对象的 SOAP 部分是一个 SOAPPart 对象,包含了用于消息路由和标识的信息,并可以包含特定于应用程序的内容。消息 SOAP 部分中的所有数据都必须是 XML 格式。 默认情况下,新的 SOAPMessage 对象包含以下对象: 一个 SOAPPart 对象 一个 SOAPEnvelope 对象 一个 SOAPBody 对象 一个 SOAPHeader 对象 可以通过调用方法 SOAPMessage.getSOAPPart() 检索消息的 SOAP 部分。SOAPEnvelope 对象是从 SOAPPart 对象检索的,SOAPEnvelope 对象用于检索 SOAPBody 和 SOAPHeader 对象。 SOAPPart sp = message.getSOAPPart(); SOAPEnvelope se = sp.getEnvelope(); SOAPBody sb = se.getBody(); SOAPHeader sh = se.getHeader(); 除强制性 SOAPPart 对象之外,SOAPMessage 对象还可以包含零个或多个 AttachmentPart 对象,每个 AttachmentPart 对象都包含特定于应用程序的数据。SOAPMessage 接口提供了一些用于创建 AttachmentPart 对象的方法,以及一些将它们添加到 SOAPMessage 对象的方法。收到 SOAPMessage 对象的一方可以通过检索各个附件部分来检查消息内容。 与 SOAP 消息的其余部分不同,附件不需要是 XML 格式,因此可以是简单文本或图像文件等任何形式。因此,任何非 XML 格式的消息内容必须在 AttachmentPart 对象中。 MessageFactory 对象可以创建行为特定于具体 SAAJ 实现或应用程序的 SOAPMessage 对象。例如,MessageFactory 对象可以生成符合特定配置文件(如 ebXML)的 SOAPMessage 对象。在这种情况下,MessageFactory 对象可以生成使用 ebXML 头初始化的 SOAPMessage 对象。
4、第3步组装了消息,这里就需要将消息转发给webservice的提供者,并获取响应
SOAPMessage response = dispatch.invoke(message);
很简单,只有一条语句,我们看看返回的内容:
//将结果打印出来 response.writeTo(System.out);
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header/><S:Body><ns2:addUserResponse xmlns:ns2="http://service.soap.org/"><user><id>12</id><nickname>tudou123</nickname><password>123123</password><username>xxx</username></user></ns2:addUserResponse></S:Body></S:Envelope>
这样,就获取了数据,解析出对象即可。
5、附件(是对应的wsdl文件)
This XML file does not appear to have any style information associated with it. The document tree is shown below. <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --> <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.soap.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service.soap.org/" name="MyServiceImplService"> <types> <xsd:schema> <xsd:import namespace="http://service.soap.org/" schemaLocation="http://localhost:8889/testService?xsd=1"/> </xsd:schema> </types> <message name="addUser"> <part name="parameters" element="tns:addUser"/> </message> <message name="addUserResponse"> <part name="parameters" element="tns:addUserResponse"/> </message> <message name="add"> <part name="parameters" element="tns:add"/> </message> <message name="addResponse"> <part name="parameters" element="tns:addResponse"/> </message> <portType name="IMyService"> <operation name="addUser"> <input message="tns:addUser"/> <output message="tns:addUserResponse"/> </operation> <operation name="add"> <input message="tns:add"/> <output message="tns:addResponse"/> </operation> </portType> <binding name="MyServiceImplPortBinding" type="tns:IMyService"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="addUser"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="add"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="MyServiceImplService"> <port name="MyServiceImplPort" binding="tns:MyServiceImplPortBinding"> <soap:address location="http://localhost:8889/testService"/> </port> </service> </definitions>
相关推荐
用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC).
用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)
android端基于soap协议的webservice接口的调用demo
网络上很多基于ksoap2开发包的WEB SERVICE调用,虽然ksoap2不大,但是内部细节不是很清楚。本代码可以基于http协议,拼凑SOAP协议,完成.net以及java开发的web service调用。供大家分享!内部也有一例是基于ksoap2...
Android 基于 Retrofit2+Okhttp3 通过SOAP协议请求WebService
用Java实现SOAP的XML文档网络传输及远程过程调用(RPC)
java实现基于soap的xml文档网络传输及远程过程调用(RPC)。详细的实例,可以看看。
用Java实现基于SOAP的XML文档网络传输及远程过程调用.doc
主要介绍了PHP使用SOAP调用API操作,结合实例形式分析了php基于SOAP调用API的常见操作技巧及相关问题解决方法,需要的朋友可以参考下
这里介绍的Web Services JavaScript Library扩展了该基础机制,其通过引入对调用基于SOAP的Web服务的支持来增强Ajax设计模式。本文是系列文章的第1部分,演示了如何使用针对Web应用程序的Ajax设计模式来实现跨平台的...
基于 .NET, Java and MS SOAP Toolkit进行Web Services 的客户端调用程序例子
这是一个基于XML的协议,同时它由四部分组成: 一个作为描述在消息中的内容以及如何处理消息的信息框架的信封(envelope),一组用于表示应用定义的数据类型的编码规则(encoding rules),一个用于表示远程过程调用和...
基于契约优先的soap+wsdl开发小功能
1、基于WCF框架对REST架构的WEB(支持SOAP)服务实现; 2、支持javascript的多种方式跨域访问(GET/POST/PUT/DELETE); 3、解决服务调用参数传递的动态设计数据格式(XML/JSON); 4、同时支持AJAX和SOAP进行调用...
Web Service作为SOA(Service Oriented Architecture)的最好实现...介绍了Web服务框架以及支撑Web服务的WSDL、SOAP、Axis2和JUDDI等相关理论知识,通过设计与实现一个例子来阐述Web服务创建、发布、查找和调用的整个过程.
根据用户输入的参数,axis2使用底层API,根据访问入口点构造soap消息,实现了特定服务的同步调用和异步调用,同时还实现了带附件的服务调用。 本系统通过以上过程,实现服务调用框架,拓展了面向服务的应用。同时,...
这是一个基于XML的协议,同时它由四部分组成: 一个作为描述在消息中的内容以及如何处理消息的信息框架的信封(envelope),一组用于表示应用定义的数据类型的编码规则(encoding rules),一个用于表示远程过程调用和...
jquery的一个插件来使用js调用基于soap协议的webservice发送报文