1. 程式人生 > >Java 呼叫與釋出Web Service

Java 呼叫與釋出Web Service

Web Service 是一種實現資料共享與遠端呼叫的標準,具有跨語言、跨平臺的特性。

Ⅰ、釋出WebService  

①在類上新增@WebService註解      

package wsexample;

import javax.jws.WebService;

/**
 * HelloWebService:對外提供服務;
 * 
 * @WebService :添加註解後該類方法將對外發布(靜態方法及final方法除外)。
 */
@WebService
public class HelloWebService {

	/**
	 * @param args
	 */
	public void sayHello() {
		System.out.println("Hello WebService");
	}

}

②通過EndPoint(端點服務類)釋出一個webService。

package wsexample;

import javax.xml.ws.Endpoint;

public class ProvideService {

	public static void main(String[] args) {
		/**
		 * 使用Endpoint將物件繫結到特定埠,埠後為服務名稱。
		 * Parameters1:對外的訪問地址
		 * Parameters2:提供服務的實現類
		 */
		Endpoint.publish("http://localhost:9994/helloWebService",
				new HelloWebService());
	}

}

Ⅱ、呼叫Web Service

    1、通過wsimport生成客戶端程式碼呼叫(wsimport是jdk自帶工具)

訪問 http://localhost:9991/helloWebService?wsdl(所釋出服務地址+引數wsdl)可檢視WSDL文件(Web Service的描述說明文件,xml的子集)。

使用wsimport工具可根據wsdl文件生成Java程式碼與.class檔案。

wsimport -s . http://localhost:9991/helloWebService?wsdl(-d生成.class檔案,-s生成Java程式碼與.class檔案

把生成的程式碼複製到專案中


package wsclient;

import wsexample.HelloWebService;
import wsexample.HelloWebServiceService;

/**
 * 生成的程式碼複製進專案,可直接呼叫
 * 
 */
public class RemoteService {

	public static void main(String[] args) {
		// 獲取 HelloWebService的實現類
		HelloWebServiceService hService = new HelloWebServiceService();
		HelloWebService servicePort = hService.getHelloWebServicePort();
		// 直接呼叫ws對外提供的方法
		servicePort.sayHello();
	}

}

NOTICE:客戶端使用JDK1.8環境會報錯(The typejava.lang.CharSequence cannot be resolved. )改為JDK1.6即可。

2、通過URLConnection呼叫

/**
	 * 獲取天氣 天氣預報WEB服務介面: http://www.webxml.com.cn/zh_cn/weather_icon.aspx
	 * 
	 * @param city
	 *            城市中文名稱(國外城市可用英文)或城市程式碼(不輸入預設為上海市)
	 */
	public static String getWeather(String city) {
		String result = null;
		try {
			URL url = new URL(
					"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
			conn.setRequestMethod("POST");
			OutputStream os = conn.getOutputStream();
			// 請求體
			StringBuffer buffer = new StringBuffer(1024);
			String soap = buffer
					.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
					.append("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">")
					.append("<soap:Body><getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\"><theCityName>")
					.append(city)
					.append("</theCityName></getWeatherbyCityName></soap:Body></soap:Envelope>")
					.toString();
			os.write(soap.getBytes());
			// 傳送請求
			InputStream is = conn.getInputStream();
			int len = 0;
			byte[] b = new byte[1024];
			StringBuilder builder = new StringBuilder();
			while ((len = is.read(b)) != -1) {
				String in = new String(b, 0, len, "utf-8");
				builder.append(in);
			}
			result = builder.toString();
			os.close();
			is.close();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}