From 788747ee49b97fb202d8f1abf5ea931008ed9430 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Thu, 3 Jun 2021 19:17:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Webservice=20Soap=20Test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- box-test/pom.xml | 13 ++ .../test/conrtroller/SoapTestController.java | 171 ++++++++++++++++++ .../src/main/resources/templates/login.html | 6 +- 3 files changed, 187 insertions(+), 3 deletions(-) create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/SoapTestController.java diff --git a/box-test/pom.xml b/box-test/pom.xml index d606da50d..d7a5addf2 100644 --- a/box-test/pom.xml +++ b/box-test/pom.xml @@ -23,6 +23,19 @@ ruoyi-common + + + org.apache.cxf + cxf-spring-boot-starter-jaxws + 3.2.6 + + + org.json + json + 20160810 + compile + + \ No newline at end of file diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/SoapTestController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/SoapTestController.java new file mode 100644 index 000000000..9f5872a3e --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/SoapTestController.java @@ -0,0 +1,171 @@ +package com.ruoyi.test.conrtroller; + +import org.apache.cxf.endpoint.Client; +import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; +import org.json.XML; +import org.springframework.web.bind.annotation.*; +import org.w3c.dom.Document; + +import javax.xml.namespace.QName; +import javax.xml.soap.MessageFactory; +import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPBodyElement; +import javax.xml.soap.SOAPMessage; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.ws.BindingProvider; +import javax.xml.ws.Dispatch; +import javax.xml.ws.Service; +import javax.xml.ws.WebServiceException; +import javax.xml.ws.soap.SOAPBinding; +import java.io.ByteArrayOutputStream; +import java.util.HashMap; +import java.util.Map; + + +@RestController +@RequestMapping("/anon/soap") +public class SoapTestController { + + + /** + * https://www.jianshu.com/p/cdbcdd724813 + * 方法一:用cxf框架 + * @param url + * @param method + * @param args + * @return + */ + @CrossOrigin + @RequestMapping("/hello") + @ResponseBody + public Map hello(String url, String method, String[] args) { + if (args.length < 1) { + args = new String[]{""}; + } + + // 创建动态客户端 + JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); + Client client = dcf.createClient(url); + // 需要密码的情况需要加上用户名和密码 + // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD)); + // 命名空间,方法名 + QName name = new QName("http://WebXml.com.cn/", method); + HashMap map = new HashMap<>(); + try { + // invoke("方法名",参数1,参数2,参数3....); + Object[] objects = client.invoke(name, args); + map.put("result", objects); + return map; + } catch (java.lang.Exception e) { + e.printStackTrace(); + map.put("result", "接口调用异常"); + return map; + } + } + + /** + * 方法二:自己用jax-ws的方式实现 + * @param url 请求地址 + * @param targetNamespace 名称空间 + * @param pName 端口名 + * @param method 方法名 + * @param argsName 参数名 + * @param args 参数 + * @return + * @throws Exception + */ + @RequestMapping("/getSoap") + @ResponseBody + public Map getSoap(String url, String targetNamespace, String pName, String method, String[] argsName, String[] args) throws Exception { + QName serviceName = new QName(targetNamespace, method); + + //WSDL中定义的端口的QName + QName portName = new QName(targetNamespace, pName); + + //创建动态Service实例 + Service service = Service.create(serviceName); + service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, url); + + //创建一个dispatch实例 + Dispatch dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); + + // Use Dispatch as BindingProvider + BindingProvider bp = (BindingProvider) dispatch; + + // 配置RequestContext以发送SOAPAction HTTP标头 + Map rc = dispatch.getRequestContext(); + rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE); + rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, targetNamespace + method); + + // 获取预配置的SAAJ MessageFactory + MessageFactory factory = ((SOAPBinding) bp.getBinding()).getMessageFactory(); + + // 创建SOAPMessage请求 + SOAPMessage request = null; + request = factory.createMessage(); + // 请求体 + SOAPBody body = request.getSOAPBody(); + + // Compose the soap:Body payload + QName payloadName = new QName(targetNamespace, method); + + SOAPBodyElement payload = body.addBodyElement(payloadName); + if (args.length > 0) { + for (int i = 0; i < argsName.length; i++) { + payload.addChildElement(argsName[i]).setValue(args[i]); + } + } +// payload.addChildElement("startCity").setValue("北京"); +// payload.addChildElement("lastCity").setValue("上海"); +// payload.addChildElement("theDate").setValue("2019-06-07"); +// payload.addChildElement("userID").setValue(""); + +// SOAPElement message = payload.addChildElement(INPUT_NMAE); +// message.addTextNode("88888"); + + SOAPMessage reply = null; + + try { + //调用端点操作并读取响应 + //request.writeTo(System.out); + reply = dispatch.invoke(request); + //reply.writeTo(System.out); + } catch (WebServiceException wse) { + wse.printStackTrace(); + } + + // 处理响应结果 + Document doc = reply.getSOAPPart().getEnvelope().getBody().extractContentAsDocument(); + HashMap map = new HashMap<>(); + map.put("result", XML.toJSONObject(format(doc)).toString()); + //System.out.println(XML.toJSONObject(format(doc)).toString()); + return map; + + } + + // Document对象转字符串 + public static String format(Document doc) throws Exception { + // XML转字符串 + String xmlStr = ""; + try { + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer t = tf.newTransformer(); + t.setOutputProperty("encoding", "UTF-8"); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + t.transform(new DOMSource(doc), new StreamResult(bos)); + xmlStr = bos.toString(); + } catch (TransformerConfigurationException e) { + e.printStackTrace(); + } catch (TransformerException e) { + e.printStackTrace(); + } + return xmlStr; + } + + +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/login.html b/ruoyi-admin/src/main/resources/templates/login.html index d6f72c8de..38981a9e2 100644 --- a/ruoyi-admin/src/main/resources/templates/login.html +++ b/ruoyi-admin/src/main/resources/templates/login.html @@ -26,10 +26,10 @@