创建服务器端
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消息主要涉及到在使用ASP.NET创建的XML Web服务中,如何控制SOAP消息的格式。SOAP(简单对象访问协议)是一种轻量级的、基于XML的协议,用于在Web服务中交换结构化和类型化的信息。SOAP消息通常包含一个...
使用SOAP UI等工具测试服务的可用性和功能,确保消息的正确传递。 通过以上步骤,你可以成功地使用Servlet实现SOAP消息的发送与接收。理解并熟练运用这些知识,将使你在Web服务开发中更加得心应手。
在SOAP消息中,消息头(Header)和消息体(Body)是两个主要部分。本文将深入探讨如何实现隐式和显式SOAP消息头,并通过源码和工具进行实践。 ### 一、SOAP消息结构 1. **SOAP Envelope**: SOAP消息的核心元素,...
SOAP消息解析是理解、处理和构建SOAP请求和响应的关键步骤。在这个"soap消息解析.rar"压缩包中,包含的是易语言编写的SOAP消息解析源码,这是一种面向过程的编程语言,常用于开发Windows应用程序。 SOAP消息由四个...
SOAP是一种基于XML的协议,用于在Web服务中传递结构化和类型化的信息。下面将详细解释易语言源码中的关键知识点,以及SOAP消息解析的重要性。 1. 易语言基础:易语言的核心理念是“易学易用”,它的语法简洁明了,...
**SOAP (Simple Object Access Protocol)** 是一种轻量级的、基于XML的协议,主要用于在Web服务中传递结构化的和类型化的信息。SOAP允许应用程序通过HTTP或其他传输协议交换数据,使得不同系统之间的通信变得简单和...
这些绑定定义了服务如何与客户端进行交互,例如安全性、事务支持和消息编码等。 REST,另一方面,是一种轻量级的架构风格,强调通过HTTP协议来暴露资源。在WCF中,可以通过WebHttpBinding创建RESTful服务,通常用于...
WS-Security规范为Web服务的安全性提供了一个强大的框架,它不仅解决了传统安全机制的局限性,还通过消息完整性和加密等功能确保了SOAP消息的安全传递。此外,通过采用诸如时间戳、序列号和挑战-响应机制等策略,WS-...
SOAP是一种基于XML的消息传递协议,用于在分布式环境中交换结构化和类型化的信息。它定义了一个消息结构,使得服务提供者和消费者能够通过HTTP、SMTP等传输协议进行通信。 在Mule中,我们使用SOAP工件来处理这些...
SOAP消息处理过程涉及到消息的创建、传递和接收,以及在消息发送和接收端对消息进行序列化(编码)和反序列化(解码)的操作。具体过程包括: 1. 客户端SOAP代理模块将RPC调用编码成SOAP请求消息,此过程中,客户端...
SOAP Header是SOAP Envelope的一部分,它允许扩展和自定义消息处理。 在给定的示例中,SOAP Header包含了`wsse:Security`元素,这是WS-Security(Web Services Security)标准的一部分,用于实现Web服务的安全性。`...
开发者可以使用如Microsoft的SOAP Toolkit或Apache Project的SOAP Package这样的工具来创建和处理SOAP消息。 在实际应用中,SOAP消息的创建和解析涉及XML解析、命名空间处理、错误处理等多个方面。为了确保兼容性和...
QtSoap是Qt框架下的一个模块,它允许开发者在Qt应用程序中方便地创建和解析SOAP消息。在QtSoap中,你可以创建SOAP对象,这些对象可以映射到特定的C++类,使得处理XML数据变得直观且高效。QtSoap的核心组件包括`...
在.NET开发环境中,我们可以通过在方法上添加`WebMethod`特性来创建并发送SOAP消息,实现远程调用。了解SOAP消息的结构和相关机制对于调试和优化Web服务至关重要。 1. XSD(XML Schema Definition,XML大纲定义)是...
JavaMail API是一个用于构建邮件和消息处理应用的开源库。在SOAP通信中,如果涉及到通过电子邮件传递SOAP消息,或者需要使用SMTP等邮件协议进行消息传输,那么这个库就非常重要。它提供了创建、发送和接收邮件的...
在VS2015中,可以使用Microsoft的ATL(活动模板库)和WSDL(Web服务描述语言)工具来创建SOAP客户端和服务器。ATL提供了一种轻量级的COM(组件对象模型)编程模型,它使得创建SOAP Web服务变得更加容易。使用WSDL...
9. **性能优化**:SOAP Toolkit 3.0在处理大量请求时,提供了性能优化选项,如缓存机制和消息压缩,以提高Web服务的响应速度。 10. **服务发布**:开发完成后,SOAP Toolkit 3.0可以方便地将Web服务发布到IIS...
- `MessageFactory`和`SOAPMessage`类用于创建和操作SOAP消息。 - `SOAPPart`包含整个SOAP消息,`SOAPEnvelope`代表消息的信封,`SOAPBody`则包含业务逻辑数据。 6. **SOAP异常处理**: - SOAP错误通常通过SOAP ...
- **创建消息**:创建一个SOAP消息涉及定义消息的基本结构,包括SOAP Envelope、Header和Body。这些元素构成了SOAP消息的核心。 - **消息部分**:SOAP消息由三个主要部分组成:Envelope定义消息的边界,Header包含...
2. **SOAP协议与HTTP的结合**:SOAP通常利用HTTP协议来传递消息,因为它具有广泛的支持和良好的错误处理机制。HTTP作为传输层,提供了一种可靠的方式来发送和接收SOAP请求。 3. **WSDL(Web Services Description ...