最近工作中需要對接接口,用到了webservice技術,這里記錄一下創建服務端和客戶端項目的步驟,
demo地址:
https://github.com/576016935/webServiceClient
https://github.com/576016935/webService
創建服務端:
1,打開idea,file-->new-->project,最后點擊finish。
2,創建完成后的結構圖如下,會自動給新建一個類,這里我就不用這個了,自己新建一個可以接收xml格式報文數據、並且解析數據、插入到數據庫的類
3,新建的類,這里有報錯,需要把解析xml格式的jar引入進來。dom4j-1.6.1.jar,服務端連接數據庫時會報錯,需要把數據庫的mysql-connector-java-8.0.19.jar包放在Tomcat的lib文件夾下。
兩個jar包:
鏈接:https://pan.baidu.com/s/1EL5yGMuM0zlRPq1EWG49OA
提取碼:lhnz
package example; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import javax.jws.WebService; import javax.xml.ws.Endpoint; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @WebService public class TestService { /* public static void main(String[] args) { *//** * 參數:1,本地的服務地址; 2,提供服務的類; 發布成功后 在瀏覽器輸入 http://192.168.51.23:8080/Service/TestService?wsdl *//* Endpoint.publish("http://192.168.51.23:8080/Service/TestService",new TestService()); System.out.println("發布成功"); //getInsert(TestAxis.getRequestData("pushProToUtrl", true, "1466587993913")); }*/ public String getInsert(String xml){ System.out.println(xml); Map<String,Object> map = new HashMap<>(); String name = ""; Document doc = null; try { doc = DocumentHelper.parseText(xml); // 將字符串轉為XML Element rootElt = doc.getRootElement(); // 獲取根節點 /* Iterator iter = rootElt.elementIterator("Body"); // 獲取根節點下的子節點Body // 遍歷Body節點 while (iter.hasNext()) { Element recordEle = (Element) iter.next(); String title = recordEle.elementTextTrim("title"); // 拿到head節點下的子節點title值 System.out.println("title:" + title); Iterator iters = recordEle.elementIterator("script"); // 獲取子節點head下的子節點script // 遍歷Header節點下的Response節點 while (iters.hasNext()) { Element itemEle = (Element) iters.next(); String username = itemEle.elementTextTrim("username"); // 拿到head下的子節點script下的字節點username的值 String password = itemEle.elementTextTrim("password"); System.out.println("username:" + username); System.out.println("password:" + password); } }*/ Iterator iterss = rootElt.elementIterator("Body"); ///獲取根節點下的子節點body // 遍歷body節點 while (iterss.hasNext()) { Element recordEless = (Element) iterss.next(); String sysPass = recordEless.elementTextTrim("sysPass"); // 拿到body節點下的子節點sysPass值 System.out.println("sysPass:" + sysPass); Iterator itersElIterator = recordEless.elementIterator("prop"); // 獲取子節點body下的子節點prop // 遍歷prop節點下的Response節點 while (itersElIterator.hasNext()) { Element itemEle = (Element) itersElIterator.next(); map.put("projectName",itemEle.elementTextTrim("projectName")); // 拿到body下的子節點prop下的字節點的值 System.out.println(map); //加載驅動程序 Class.forName("com.mysql.cj.jdbc.Driver"); //連接數據庫 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/oa?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true", "root", "root"); //編寫SQL PreparedStatement preparedStatement = connection.prepareStatement("insert into XML (projectName,opening_area,construction) VALUE (?,?,?)"); //占位符,從1開始 preparedStatement.setString(1, (String) map.get("projectName")); //返回的結果是一個整數表示該操作影響了數據表中的幾條數據 int i = preparedStatement.executeUpdate(); if(i>0){ name = "{\"msg\":\"true\",\"message\":\"新增成功\"}"; }else{ name = "{\"msg\":\"false\",\"message\":\"新增失敗\"}"; } //關閉 preparedStatement.close(); connection.close(); System.out.println(i); } } } catch (DocumentException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return name; } }
4,把這個包放入lib文件夾下,
5,然后點擊idea右上角的按鈕,或者Ctrl+Alt+shift+s,最后點擊+號找到剛剛復制進去放到lib文件里的jar包,最后點擊OK
6,新建完成后在配置文件把剛剛添加的類配置一下。默認是有一個helloworld的,復制一下,名字改成剛剛創建的類名,不添加的話后面操作無法自動生成WSDL文件。
7,生成wsdl,右鍵點擊剛剛新建的類找到webservice,如圖,最后點擊OK,會自動生成一個WSDL文件
如果這里報這個錯,就回來第六步看看有沒有配置新建的類,配置了還報錯的話重新編譯一下。
8,最后就是配置Tomcat了,這里就不作演示了。。。 配置完成后通過Tomcat啟動,這個時候訪問還是會報錯。還需要在這里配置一下,因為還要給部署的 Artifact 添加 Apache Axis 包的依賴。最后點擊OK。重新啟動
9,瀏覽器訪問localhost:8080/services 出現如下就成功了,下面有兩個類,一個是創建項目時自動附帶的,另一個就是自己手動新建的
地址欄輸入http://localhost:8080/services/TestService?wsdl ,也可以點擊上圖的TestService接口,顯示如下
至此,服務端創建OK,下面開始創建客戶端,調用服務端並傳送xml數據
客戶端:
1,點擊file-->new--project,往下拉找到webservice Client,並勾選,點擊next。最后點擊finish
2,創建成功會彈出如下彈框,也可以關掉,手動右鍵點擊項目下的src選擇webservice打開。地址欄找到剛剛創建的服務端生成的WSDL文件,包名可以選擇也可以自己手動填寫,會自動創建的。
3,最后生成了如下文件
4,新建兩個類,一個用來調用服務端,另一個用來生成xml格式報文
調用類:
package test; import com.webService.TestServiceServiceLocator; import com.webService.TestService_PortType; import javax.xml.rpc.ServiceException; import java.rmi.RemoteException; public class WebService { public static void main(String[] args) { try { //這里new的是生成的服務端代碼,在通過地址去調用服務端。 TestService_PortType portType = new TestServiceServiceLocator().getTestService(); System.out.println("生成的xml:"+TestXML.getTestXML()); String success = portType.getInsert(TestXML.getTestXML()); System.out.println("調用服務端接口:"+success); } catch (ServiceException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
拼接xml格式報文。
package test; public class TestXML { public static void main(String[] args) { System.out.println(getTestXML()); } public static String getTestXML(){ String xml=""; StringBuilder builder = new StringBuilder(); builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); builder.append("<xml-body>"); builder.append("<Head>"); builder.append("<Version>1.0</Version>"); builder.append("<MethodCode></MethodCode>"); builder.append("<BeanId>webService</BeanId>"); builder.append("<ParamType>xml</ParamType>"); builder.append("</Head>"); builder.append("<Body>"); builder.append("<sysPass>QQQQ</sysPass>"); builder.append("<prop>"); //這里是傳輸的主要數據內容,username是字段名,中間是數據,需要什么就拼接什么 builder.append("<projectName>我是傳輸到服務端的內容</projectName>"); builder.append("</prop>"); builder.append("</Body>"); builder.append("</xml-body>"); xml = builder.toString(); return xml; } }
5,啟動客戶端。服務端也需要啟動。直接右鍵啟動main方法
客戶端控制台顯示:
服務端控制台顯示:
6,檢查數據庫是否新增成功,
7,檢查一下生成的xml格式報文格式。https://www.sojson.com/xml.html
到這里就是全部的步驟了。如果有報錯多注意有沒有漏什么,是否缺少相應的jar包。