最近工作中需要对接接口,用到了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包。