java SoapClient调用webService 传对象参数
时间: 2024-03-30 19:33:13 浏览: 144
webService客户端调用服务端传对象参数
5星 · 资源好评率100%
在Java中使用SOAP客户端调用Web服务并传递对象参数,需要遵循以下步骤:
1. 通过wsimport工具生成客户端代码。
2. 创建包含对象属性的类,该类必须是可序列化的,即需要实现Serializable接口。
3. 创建SOAP消息,并将对象参数添加到SOAP Body中。可以使用JAXB将对象序列化为XML。
4. 发送SOAP消息到Web服务,并解析响应消息。
示例代码:
1. 通过wsimport工具生成客户端代码。
首先需要使用wsimport工具根据WSDL文件生成客户端代码。在命令行中执行以下命令:
```
wsimport -keep http://localhost:8080/WebService?wsdl
```
其中,-keep选项表示生成的Java文件保存在当前目录中。
2. 创建包含对象属性的类。
假设需要传递的对象是Person,具有姓名和年龄两个属性:
```
public class Person implements Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
```
3. 创建SOAP消息。
使用JAXB将Person对象序列化为XML,并添加到SOAP消息的Body中:
```
// 创建JAXB上下文
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Marshaller marshaller = jaxbContext.createMarshaller();
// 序列化Person对象为XML
Person person = new Person();
person.setName("张三");
person.setAge(20);
StringWriter writer = new StringWriter();
marshaller.marshal(person, writer);
String xml = writer.toString();
// 创建SOAP消息
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
body.addDocument(new ByteArrayInputStream(xml.getBytes()));
```
4. 发送SOAP消息到Web服务。
使用生成的客户端代码创建WebService对象,并调用对应的方法:
```
// 创建WebService对象
URL url = new URL("http://localhost:8080/WebService");
WebService service = new WebService(url);
// 调用WebService方法
SOAPMessage response = service.call(soapMessage);
```
其中,WebService是使用wsimport生成的客户端代码中的类。call方法用于发送SOAP消息,并返回响应消息。
5. 解析响应消息。
从响应消息的Body中获取返回的数据:
```
SOAPBody responseBody = response.getSOAPBody();
Node responseNode = responseBody.getFirstChild();
String responseXml = responseNode.getTextContent();
// 反序列化XML为对象
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(responseXml);
Person result = (Person) unmarshaller.unmarshal(reader);
```
完整的代码示例:
```
public class SoapClient {
public static void main(String[] args) throws Exception {
// 创建JAXB上下文
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Marshaller marshaller = jaxbContext.createMarshaller();
// 序列化Person对象为XML
Person person = new Person();
person.setName("张三");
person.setAge(20);
StringWriter writer = new StringWriter();
marshaller.marshal(person, writer);
String xml = writer.toString();
// 创建SOAP消息
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
body.addDocument(new ByteArrayInputStream(xml.getBytes()));
// 创建WebService对象
URL url = new URL("http://localhost:8080/WebService");
WebService service = new WebService(url);
// 调用WebService方法
SOAPMessage response = service.call(soapMessage);
// 解析响应消息
SOAPBody responseBody = response.getSOAPBody();
Node responseNode = responseBody.getFirstChild();
String responseXml = responseNode.getTextContent();
// 反序列化XML为对象
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(responseXml);
Person result = (Person) unmarshaller.unmarshal(reader);
System.out.println(result.getName());
System.out.println(result.getAge());
}
}
```
阅读全文