1. 程式人生 > >基於Java的webservice建立與soap方式呼叫

基於Java的webservice建立與soap方式呼叫

一、建立(服務端)

建立普通類,程式碼:

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService
public class TestwebService {
		@WebMethod(operationName="sayHello")
		public String sayHello(String ss){
			return "Hello world!    hello  "+ss;
		}
		
		@WebMethod(operationName="getSum")
		public int getSum(int a,int b){
			return a+b;
		}
		
		
	public static void main(String [] args){
		Endpoint.publish("http://localhost:8083/HelloWorld", new TestwebService());
		System.out.println("釋出成功!");
	}
	

}


瀏覽器鍵入http://localhost:8083/HelloWorld


二、呼叫(客戶端)

1、利用SoapUI獲取請求報文

建立SOAP Project


填寫wsdl地址後點擊OK


檢視soap報文


2、建立webservice請求類:

import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class WeatherUtil {
	/**
	 * 對伺服器端返回的XML檔案流進行解析
	 * 
	 * @param city
	 *            使用者輸入的城市名稱
	 * @return 字串 用#分割
	 */
	public String getWeather(String city) {
		try {
			// 使用Dom解析
			Document doc;
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			dbf.setNamespaceAware(true);
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 獲取呼叫介面後返回的流
			InputStream is = getSoapInputStream(city);
			doc = db.parse(is);
			// xml的元素標籤是"<string>值1</string><string>值2</string>……"
			NodeList nl = doc.getElementsByTagName("return");
			StringBuffer sb = new StringBuffer();
			for (int count = 0; count < nl.getLength(); count++) {
				Node n = nl.item(count);
				if (n.getFirstChild().getNodeValue().equals("查詢結果為空!")) {
					sb = new StringBuffer("#");
					break;
				}
				// 解析並以"#"為分隔符,拼接返回結果
				sb.append(n.getFirstChild().getNodeValue() + "#");
			}
			is.close();
			return sb.toString();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/*
	 * 使用者把SOAP請求傳送給伺服器端,並返回伺服器點返回的輸入流
	 * 
	 * @param city 使用者輸入的城市名稱
	 * 
	 * @return 伺服器端返回的輸入流,供客戶端讀取
	 * 
	 * @throws Exception
	 * 
	 * @備註:有四種請求頭格式1、SOAP 1.1; 2、SOAP 1.2 ; 3、HTTP GET; 4、HTTP POST
	 * 參考---》http://
	 * www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName
	 */
	private InputStream getSoapInputStream(String city) throws Exception {
		try {
			// 獲取請求規範
			String soap = getSoapRequest(city);
			if (soap == null) {
				return null;
			}
			// 呼叫的webserviceURL
			URL url = new URL(
					"http://localhost:8083/HelloWorld.asmx");
			URLConnection conn = url.openConnection();
			conn.setUseCaches(false);
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Length",
					Integer.toString(soap.length()));
			conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
			// 呼叫的介面方法是
			conn.setRequestProperty("SOAPAction",
					"");
			OutputStream os = conn.getOutputStream();
			OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
			osw.write(soap);
			osw.flush();
			osw.close();
			// 獲取webserivce返回的流
			InputStream is = conn.getInputStream();
			
			return is;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/*
	 * 獲取SOAP的請求頭,並替換其中的標誌符號為使用者輸入的城市
	 * 
	 * @param city: 使用者輸入的城市名稱
	 * 
	 * @return 客戶將要傳送給伺服器的SOAP請求規範
	 * 
	 * @備註:有四種請求頭格式1、SOAP 1.1; 2、SOAP 1.2 ; 3、HTTP GET; 4、HTTP POST
	 * 參考---》http://
	 * 
	 * 本文采用:SOAP 1.1格式
	 */
	private String getSoapRequest(String city) {
		StringBuffer sb = new StringBuffer();
		sb.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:sys=\"http://sys.controller.jeefw.com/\">");
		sb.append("   <soapenv:Header/>");
		sb.append("   <soapenv:Body>");
		sb.append("      <sys:sayHello>");
		sb.append("         <!--Optional:-->");
		sb.append("         <arg0>"+city+"</arg0>");
		sb.append("      </sys:sayHello>");
		sb.append("   </soapenv:Body>");
		sb.append("</soapenv:Envelope>");


		return sb.toString();
	}
}


3、建立測試類:

public class TestWeather {
	/**
	 * 測試
	 */
	public static void main(String[] args) throws Exception {
		WeatherUtil weath = new WeatherUtil();
		// 引數城市:濟南
		String weather = weath.getWeather("濟南");
		String len[] = weather.split("#");
		for (int i = 0; i < len.length; i++) {
			System.out.println(len[i]);
		}
	}
}


4、測試結果:


呼叫成功!