基于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消息,但是并沒有送出請求。是以沒有響應。