`

soap消息的创建和传递

 
阅读更多

创建服务器端

1.创建一个接口

IMyService.java

package com.test.service;

import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService(targetNamespace = "http://www.webservice.com")
public interface IMyService {
	@WebResult(name = "addResult")
	public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b);
}

 

2.创建实现接口的类

MyServiceImpl.java

package com.test.service;

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebService;

@WebService(endpointInterface = "com.test.service.IMyService", targetNamespace = "http://www.webservice.com")
public class MyServiceImpl implements IMyService {
	@Override
	public int add(int a, int b) {
		return a + b;
	}
}

 

3.开启服务

MyServer.java

package com.test.service;

import javax.xml.ws.Endpoint;

public class MyServer {
	public static void main(String[] args) {
		String address = "http://localhost:9999/server";
		// 发布服务的实现类
		Endpoint.publish(address, new MyServiceImpl());
	}
}

 

4.测试类TestSoap.java

(1)SOAP消息的创建

// 通过QName创建SOAP的body消息
@Test
public void test01() {
	try {
		// 创建消息工厂
		MessageFactory factory = MessageFactory.newInstance();
		// 根据消息工厂创建SOAPMessage
		SOAPMessage message = factory.createMessage();
		// 创建SOAPPart
		SOAPPart part = message.getSOAPPart();
		// 获取SOAPEnvelope
		SOAPEnvelope envelope = part.getEnvelope();
		// 通过 SOAPEnvelope获取相应的body和header信息
		SOAPBody body = envelope.getBody();
		// 根据QName创建相应的节点
		QName qname = new QName("http://www.webservice.com", "add", "ns");
		SOAPBodyElement element = body.addBodyElement(qname);
		element.addChildElement("a").setValue("12");
		element.addChildElement("b").setValue("13");
		// 打印消息信息
		message.writeTo(System.out);
	} catch (SOAPException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

 

运行结果:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns:add xmlns:ns="http://www.webservice.com"><a>12</a><b>13</b></ns:add></SOAP-ENV:Body></SOAP-ENV:Envelope>

(2)SOAP消息的创建(基于MESSAGE的方式)

// 基于MESSAGE的方式传递消息
@Test
public void test02() {
	try {
		// 创建服务
		URL url = new URL("http://localhost:9999/server");
		QName qname = new QName("http://www.webservice.com", "MyServiceImplService");
		Service service = Service.create(url, qname);

		// 创建Dispatch
		Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName("http://www.webservice.com", "MyServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);

		// 创建SOAP的body消息
		SOAPMessage message = MessageFactory.newInstance().createMessage();
		SOAPBody body = message.getSOAPPart().getEnvelope().getBody();

		// 根据QName创建相应的节点
		QName ename = new QName("http://www.webservice.com", "add", "ns");
		SOAPBodyElement element = body.addBodyElement(ename);
		element.addChildElement("a").setValue("12");
		element.addChildElement("b").setValue("13");
		message.writeTo(System.out);
		System.out.println("\n invoking...");

		// 通过dispatch传递消息,返回响应消息
		SOAPMessage response = dispatch.invoke(message);
		response.writeTo(System.out);
		System.out.println();

		// 将响应的消息转换为dom对象
		Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
		System.out.println(doc.getElementsByTagName("addResult").item(0).getTextContent());
	} catch (SOAPException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

 

运行结果:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns:add xmlns:ns="http://www.webservice.com"><a>12</a><b>13</b></ns:add></SOAP-ENV:Body></SOAP-ENV:Envelope>

 invoking...

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header/><S:Body><ns2:addResponse xmlns:ns2="http://www.webservice.com"><addResult>25</addResult></ns2:addResponse></S:Body></S:Envelope>

25

(3)SOAP消息的创建(基于PAYLOAD的方式)

修改服务器端

第一步,添加实体类:User.java

package com.test.service;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class User {
	
	private int id;
	private String username;
	private String nickname;
	private String password;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public User(int id, String username, String nickname, String password) {
		super();
		this.id = id;
		this.username = username;
		this.nickname = nickname;
		this.password = password;
	}

	public User() {
		super();
	}

}

 

第二步,接口中添加addUser方法

IMyService.java

@WebResult(name = "user")
public User addUser(@WebParam(name = "user") User user);

 

MyServiceImpl.java

private static List<User> users = new ArrayList<User>();

public MyServiceImpl() {
	users.add(new User(1, "admin", "管理员", "111111"));
}

@Override
public User addUser(User user) {
	users.add(user);
	return user;
}

 

测试类

// 基于PAYLOAD的方式传递消息
@Test
public void test03() {
	try {
		// 创建服务
		URL url = new URL("http://localhost:9999/server");
		QName qname = new QName("http://www.webservice.com", "MyServiceImplService");
		Service service = Service.create(url, qname);

		// 创建Dispatch(通过源数据的方式传递)
		Dispatch<Source> dispatch = service.createDispatch(new QName("http://www.webservice.com", "MyServiceImplPort"), Source.class, Service.Mode.PAYLOAD);

		// 根据用户对象创建响应的xml
		User user = new User(1, "张三", "zs", "123");
		JAXBContext ctx = JAXBContext.newInstance(User.class);
		Marshaller marshaller = ctx.createMarshaller();
		// 设置去掉xml的头信息
		marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
		StringWriter writer = new StringWriter();
		marshaller.marshal(user, writer);

		// 封装相应的part(addUser)
		String payload = "<ns:addUser xmlns:ns='http://www.webservice.com'>" + writer.toString() + "</ns:addUser>";
		StreamSource ss = new StreamSource(new StringReader(payload));

		// 通过dispatch传递payload
		Source response = dispatch.invoke(ss);

		// 使用Transformer对象,将Source转化为DOM进行操作
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		DOMResult result = new DOMResult();
		transformer.transform(response, result);

		// 通过xpath模型处理响应信息
		XPath xpath = XPathFactory.newInstance().newXPath();
		NodeList list = (NodeList) xpath.evaluate("//user", result.getNode(), XPathConstants.NODESET);
		User user2 = (User) ctx.createUnmarshaller().unmarshal(list.item(0));
		System.out.println(user2.getUsername());
	} catch (IOException e) {
		e.printStackTrace();
	} catch (JAXBException e) {
		e.printStackTrace();
	} catch (TransformerConfigurationException e) {
		e.printStackTrace();
	} catch (TransformerFactoryConfigurationError e) {
		e.printStackTrace();
	} catch (TransformerException e) {
		e.printStackTrace();
	} catch (XPathExpressionException e) {
		e.printStackTrace();
	}
}

 

运行结果:

张三

分享到:
评论

相关推荐

    自定义SOAP消息详细解释

    自定义SOAP消息主要涉及到在使用ASP.NET创建的XML Web服务中,如何控制SOAP消息的格式。SOAP(简单对象访问协议)是一种轻量级的、基于XML的协议,用于在Web服务中交换结构化和类型化的信息。SOAP消息通常包含一个...

    基于Servlet发送、接收SOAP消息的java源程序

    使用SOAP UI等工具测试服务的可用性和功能,确保消息的正确传递。 通过以上步骤,你可以成功地使用Servlet实现SOAP消息的发送与接收。理解并熟练运用这些知识,将使你在Web服务开发中更加得心应手。

    实现隐式和显式 SOAP 消息头

    在SOAP消息中,消息头(Header)和消息体(Body)是两个主要部分。本文将深入探讨如何实现隐式和显式SOAP消息头,并通过源码和工具进行实践。 ### 一、SOAP消息结构 1. **SOAP Envelope**: SOAP消息的核心元素,...

    soap消息解析.rar

    SOAP消息解析是理解、处理和构建SOAP请求和响应的关键步骤。在这个"soap消息解析.rar"压缩包中,包含的是易语言编写的SOAP消息解析源码,这是一种面向过程的编程语言,常用于开发Windows应用程序。 SOAP消息由四个...

    易语言源码易语言soap消息解析源码.rar

    SOAP是一种基于XML的协议,用于在Web服务中传递结构化和类型化的信息。下面将详细解释易语言源码中的关键知识点,以及SOAP消息解析的重要性。 1. 易语言基础:易语言的核心理念是“易学易用”,它的语法简洁明了,...

    SOAP基本和创建详解

    **SOAP (Simple Object Access Protocol)** 是一种轻量级的、基于XML的协议,主要用于在Web服务中传递结构化的和类型化的信息。SOAP允许应用程序通过HTTP或其他传输协议交换数据,使得不同系统之间的通信变得简单和...

    基于WCF创建SOAP和REST服务源码

    这些绑定定义了服务如何与客户端进行交互,例如安全性、事务支持和消息编码等。 REST,另一方面,是一种轻量级的架构风格,强调通过HTTP协议来暴露资源。在WCF中,可以通过WebHttpBinding创建RESTful服务,通常用于...

    WS-Security构筑安全的SOAP消息调用

    WS-Security规范为Web服务的安全性提供了一个强大的框架,它不仅解决了传统安全机制的局限性,还通过消息完整性和加密等功能确保了SOAP消息的安全传递。此外,通过采用诸如时间戳、序列号和挑战-响应机制等策略,WS-...

    mule使用SOAP工件发布和消费web Service的简单例子

    SOAP是一种基于XML的消息传递协议,用于在分布式环境中交换结构化和类型化的信息。它定义了一个消息结构,使得服务提供者和消费者能够通过HTTP、SMTP等传输协议进行通信。 在Mule中,我们使用SOAP工件来处理这些...

    SOAP消息处理器的设计与实现

    SOAP消息处理过程涉及到消息的创建、传递和接收,以及在消息发送和接收端对消息进行序列化(编码)和反序列化(解码)的操作。具体过程包括: 1. 客户端SOAP代理模块将RPC调用编码成SOAP请求消息,此过程中,客户端...

    Web Service SOAP Client set SOAP Header

    SOAP Header是SOAP Envelope的一部分,它允许扩展和自定义消息处理。 在给定的示例中,SOAP Header包含了`wsse:Security`元素,这是WS-Security(Web Services Security)标准的一部分,用于实现Web服务的安全性。`...

    SOAP结构简析与编写方式

    开发者可以使用如Microsoft的SOAP Toolkit或Apache Project的SOAP Package这样的工具来创建和处理SOAP消息。 在实际应用中,SOAP消息的创建和解析涉及XML解析、命名空间处理、错误处理等多个方面。为了确保兼容性和...

    QtSoap源码 仅供学习参考

    QtSoap是Qt框架下的一个模块,它允许开发者在Qt应用程序中方便地创建和解析SOAP消息。在QtSoap中,你可以创建SOAP对象,这些对象可以映射到特定的C++类,使得处理XML数据变得直观且高效。QtSoap的核心组件包括`...

    SOAP消息机制简介[参照].pdf

    在.NET开发环境中,我们可以通过在方法上添加`WebMethod`特性来创建并发送SOAP消息,实现远程调用。了解SOAP消息的结构和相关机制对于调试和优化Web服务至关重要。 1. XSD(XML Schema Definition,XML大纲定义)是...

    soap所必须的jar包(全)

    JavaMail API是一个用于构建邮件和消息处理应用的开源库。在SOAP通信中,如果涉及到通过电子邮件传递SOAP消息,或者需要使用SMTP等邮件协议进行消息传输,那么这个库就非常重要。它提供了创建、发送和接收邮件的...

    VS2015 C++和C++的通过SOAP的WebService,C++和C#的WebService发布和应用

    在VS2015中,可以使用Microsoft的ATL(活动模板库)和WSDL(Web服务描述语言)工具来创建SOAP客户端和服务器。ATL提供了一种轻量级的COM(组件对象模型)编程模型,它使得创建SOAP Web服务变得更加容易。使用WSDL...

    SoapToolkit30 安装包

    9. **性能优化**:SOAP Toolkit 3.0在处理大量请求时,提供了性能优化选项,如缓存机制和消息压缩,以提高Web服务的响应速度。 10. **服务发布**:开发完成后,SOAP Toolkit 3.0可以方便地将Web服务发布到IIS...

    java_soap学习资料

    - `MessageFactory`和`SOAPMessage`类用于创建和操作SOAP消息。 - `SOAPPart`包含整个SOAP消息,`SOAPEnvelope`代表消息的信封,`SOAPBody`则包含业务逻辑数据。 6. **SOAP异常处理**: - SOAP错误通常通过SOAP ...

    soap入门(E版)soap入门(E版)

    - **创建消息**:创建一个SOAP消息涉及定义消息的基本结构,包括SOAP Envelope、Header和Body。这些元素构成了SOAP消息的核心。 - **消息部分**:SOAP消息由三个主要部分组成:Envelope定义消息的边界,Header包含...

    soap编程全解,web服务开发原理

    2. **SOAP协议与HTTP的结合**:SOAP通常利用HTTP协议来传递消息,因为它具有广泛的支持和良好的错误处理机制。HTTP作为传输层,提供了一种可靠的方式来发送和接收SOAP请求。 3. **WSDL(Web Services Description ...

Global site tag (gtag.js) - Google Analytics