`

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的Web服务AJAX客户端.docx

    1 目标:浏览器客户端使用AJAX请求Web服务,传递参数,接受返回结果。 2 原理:使用POST传递SOAP格式的XML数据。 3 流程:发布WebService,查询WSDL,创建HTML和AJAX请求,测试。

    金蝶调用Webservice接口-SOAP

    金蝶调用第三方webservice接口以soap方式实现,包括创建服务service、DIspatch、SOAPMessage、QName、封装数据、Dispatch传递消息、消息转换为doc对象、调用结果判断等

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织。  gSOAP使编写web服务的...

    使用Java搭建Webservices应用程序结构.doc

    使用者可以通过这个WSDL文档,创建相应的SOAP请求消息,通过HTTP传递给webservice提供者;web服务在完成服务请求后,将SOAP返回消息传回请求者,服务请求者再根据WSDL文档将SOAP返回消息解析成自己能够理解的内容。 ...

    WebService的创建以及调用

    Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI...

    vs2019创建WebService服务的实现

    WebService是一种远程调用技术,也叫XML Web Service WebService,是一种可以接收从Internet或者Internet上的其他系统中传递过来的请求,轻量级的独立的通信技术。是通过SOAP在Web上提供的软件服务,使用WSDL文件...

    soapjava客户端源码-vba_client_demo:vba_client_demo

    身份认证服务平台自建接口MESSAGE方式进行SOAP消息的创建、传递和处理的示例源代码版本,是框架和构建工具无依赖的纯eclipse工程。jdk版本兼容1.7及以上。 接口文档见 CIAS_wsimport 身份认证服务平台自建接口WSDL...

    flex3的cookbook书籍完整版dpf(包含目录)

    3.17节在TabNavigator内创建、启用和禁用TAB组件(TabControls) 3.18 节使用可关闭Tabs 创建一个TabNavigator 3.19 节创建和控制Alert 3.20 节根据呼出组件设置对话框的尺寸和位置 3.21 节管理多个弹出对话框 3.22 节...

    java-spring-js-MTOM-download:使用Java 8,Spring,JAXB的SOAP MTOM XOP模板

    使用Java 8,Spring,JAXB的SOAP MTOM / XOP模板 上载和下载文件非常麻烦。 都是为了创建伪造HTML表单并通过JavaScript伪造单击它们而只是为了将特定类型的文件发送到特定类型的REST端点而进行的黑客尝试。 我在...

    java笔试题目-citrus:专注于消息传递集成的自动化集成测试框架

    项目(例如创建和执行测试用例)。 您可以使用您最喜欢的 Java IDE,例如 Eclipse 或 IntelliJ IDEA。 Maven 3.0.x 或更高版本(可选) Citrus 项目最适合 Maven ()。 但是,不需要使用 Maven。 例如,您还可以使用 ...

    PHP和MySQL WEB开发(第4版)

    5.8 参数的引用传递和值传递 5.9 使用Return关键字 5.9.1 从函数返回一个值 5.10 实现递归 5.10.1 名称空间 5.11 进一步学习 5.12 下一章 第6章 面向对象的PHP 6.1 理解面向对象的概念 6.1.1 类和对象 6.1.2 多态...

    PHP和MySQL Web开发第4版pdf以及源码

    5.8 参数的引用传递和值传递 5.9 使用Return关键字 5.9.1 从函数返回一个值 5.10 实现递归 5.10.1 名称空间 5.11 进一步学习 5.12 下一章 第6章 面向对象的PHP 6.1 理解面向对象的概念 6.1.1 类和对象 ...

    Programming C#(第4版)(中文版)part1

    SOAP、WSDL和发现 402 创建一个Web Service 403 创建代理 407 第16章 综合运用 414 总体设计 414 建立网络服务客户端 414 显示结果 424 根据分类检索 433 第3部分 C#与.NET CLR 439 第17章 程序集和版本控制 441 PE...

    Programming C#(第4版)(中文版)part3

    SOAP、WSDL和发现 402 创建一个Web Service 403 创建代理 407 第16章 综合运用 414 总体设计 414 建立网络服务客户端 414 显示结果 424 根据分类检索 433 第3部分 C#与.NET CLR 439 第17章 程序集和版本控制 441 PE...

    Programming C#(第4版)(中文版)part2

    SOAP、WSDL和发现 402 创建一个Web Service 403 创建代理 407 第16章 综合运用 414 总体设计 414 建立网络服务客户端 414 显示结果 424 根据分类检索 433 第3部分 C#与.NET CLR 439 第17章 程序集和版本控制 441 PE...

Global site tag (gtag.js) - Google Analytics