天天看點

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

繼續閱讀