Java 呼叫與釋出Web Service
阿新 • • 發佈:2018-12-31
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;
}