天天看点

基于SOAP的Webservice学习(一)

基于SOAP的Webservice学习(一)

学习基于SOAP的Webservice之前应该具有XML的知识.

1.新建一个服务接口以及实现类(实现加法)

package com.jamie.soap;

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

@WebService
public interface IMyService {
	@WebResult(name="addResult")
	public int add(@WebParam(name="a")int a, @WebParam(name="b")int b);
	@WebResult(name="minusResult")
	public int minus(@WebParam(name="a")int a, @WebParam(name="b")int b);
}
           
package com.jamie.soap;

import javax.jws.WebService;

@WebService(endpointInter)
public class MyServiceImpl implements IMyService {
	@Override
	public int add(int a, int b) {
		System.out.println("a+b=" + (a+b));
		return a+b;
	}

	@Override
	public int minus(int a, int b) {
		System.out.println("a-b=" + (a-b));
		return a-b;
	}
}
           

2. 发布服务

package com.jamie.soap;

import javax.xml.ws.Endpoint;

public class MyServer {
	public static void main(String[] args) {
		Endpoint.publish("http://localhost:8989/ms", new MyServiceImpl());
	}
}
           

运行MyServer.class;

然后打开Eclipse中的Launch the web service explorer --> Open WSDL : http://localhost:8989/ms?wsdl -->add 33, 44 -->Go-->Click Source查看SOAP消息;

3. SOAP 请求消息

<soapenv:Envelope 
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
	xmlns:q0="http://soap.jamie.com/" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<soapenv:Body>
		<q0:add>
			<a>33</a>
			<b>44</b>
		</q0:add>
	</soapenv:Body>
</soapenv:Envelope>
           

若在IMyService.java中不写@WebParam(name="a"), 那么这里的内容是<arg0>33</arg0>和<arg1>44</arg1>

4. SOAP响应消息

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
	<S:Body>
		<ns2:addResponse xmlns:ns2="http://soap.jamie.com/">
			<addResult>77</addResult>
		</ns2:addResponse>
	</S:Body>
</S:Envelope>
           

若在IMyService.java中不写(name="addResult"), 那么这里的返回标签是<return>77</return>

所以我们发布的服务应该具有指定的参数名和返回名,便于调用者使用。

以上的操作就是一个完整的SOAP消息的请求和响应。

5. 以上的请求和响应是通过Eclipse的webservice工具发起和接收SOAP消息的。

把上面的请求和响应分开来看,下面实现一个java的SOAP消息请求。

public void test01() {
		try {
			MessageFactory factory = MessageFactory.newInstance();
			SOAPMessage message = factory.createMessage();
			SOAPPart part = message.getSOAPPart();
			SOAPEnvelope envelope = part.getEnvelope();
			SOAPBody body = envelope.getBody();
			QName qname = new QName("http://localhost:8989/ms", "add", "jamienamespace");
			SOAPBodyElement element = body.addBodyElement(qname);
			element.addChildElement("a").setValue("33");
			element.addChildElement("b").setValue("44");
			message.writeTo(System.out);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
           

运行结果:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<jamienamespace:add xmlns:jamienamespace="http://localhost:8989/ms">
			<a>33</a>
			<b>44</b>
		</jamienamespace:add>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
           

故意把命名空间写得很浮夸,为理解第三个参数的作用。

这里咱们自己创建了一个本文第三点的SOAP消息,但是并没有发出请求。所以没有响应。

继续阅读