基於Java的webservice建立與soap方式呼叫
阿新 • • 發佈:2019-01-22
一、建立(服務端)
建立普通類,程式碼:
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、測試結果:
呼叫成功!