基于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消息,但是并没有发出请求。所以没有响应。