通过webservice提交xml数据

偏执的太偏执、 2023-02-14 15:45 37阅读 0赞

通过webservice提交xml数据加粗样式

更新啦!!!!

地址:https://www.jianshu.com/p/81430f69d666

  1. //这里调用
  2. public static void main(String[] args) {
  3. LinkedHashMap<String, String> objectObjectHashMap = new LinkedHashMap<>();
  4. objectObjectHashMap.put("areaCode", "1309");
  5. objectObjectHashMap.put("cityId", "0");
  6. objectObjectHashMap.put("townId", "0");
  7. String getHosInfo = WebServiceUtil.callWebService("https://aaa.aaa.aaa.cn/BabyAppVipSer.asmx", "GetHosInfos", objectObjectHashMap);
  8. System.out.println(getHosInfo);
  9. }
  10. /** * 调用webService 接口返回字符串 * @param asmxUrl 提供接口的地址 * @param waysName 设置要调用哪个方法 * @param params 请求的参数 * @return */
  11. public static String callWebService(String asmxUrl, String waysName, LinkedHashMap<String,String> params){
  12. String soapaction = "http://tempuri.org/"; // 域名,这是在server定义的--不知道的可以问接口提供方,他们一并提供这个
  13. Service service = new Service();
  14. Object[] obj = new Object[params.size()];
  15. try{
  16. Call call = (Call) service.createCall();
  17. call.setTargetEndpointAddress(asmxUrl);
  18. call.setOperationName(new QName(soapaction, waysName)); // 设置要调用哪个方法
  19. //设置变量每次循环完成+1
  20. int flag = 0;
  21. for (String param : params.keySet()) {
  22. call.addParameter(new QName(soapaction, param), // 设置要传递的参数--要和接口方提供的参数名一致
  23. org.apache.axis.encoding.XMLType.XSD_STRING,
  24. javax.xml.rpc.ParameterMode.IN);
  25. obj[flag] = params.get(param);
  26. flag++;
  27. }
  28. call.setReturnType(new QName(soapaction, waysName), String.class); // 要返回的数据类型(自定义类型,我这边接口提供方给我返回的是json字符串,所以我用string类型接收。这个地方一定要设置好,不然各种报错很崩溃)
  29. call.setUseSOAPAction(true);
  30. call.setSOAPActionURI(soapaction + waysName);
  31. return (String)call.invoke(obj);// 调用方法并传递参数-传递的参数和设置的参数要对应,顺序不能搞错了
  32. }catch (Exception ex){
  33. ex.printStackTrace();
  34. }
  35. return null;
  36. }
  37. //pom
  38. <dependency>
  39. <groupId>org.apache.axis</groupId>
  40. <artifactId>axis</artifactId>
  41. <version>1.4</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>javax.xml.rpc</groupId>
  45. <artifactId>javax.xml.rpc-api</artifactId>
  46. <version>1.1.1</version>
  47. </dependency>
  48. <dependency>
  49. <groupId>commons-discovery</groupId>
  50. <artifactId>commons-discovery</artifactId>
  51. <version>0.4</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>wsdl4j</groupId>
  55. <artifactId>wsdl4j</artifactId>
  56. <version>1.6.3</version>
  57. </dependency>

/下面是旧的,看上面就可以、、、、、、、、、、、、、、、、、、、

原创1 : https://blog.csdn.net/qq\_24505127/article/details/53057099
原创2 : https://blog.csdn.net/qq\_28779071/article/details/82714460
所需maven

  1. <!-- wsdl webService包 -->
  2. <dependency>
  3. <groupId>org.apache.axis</groupId>
  4. <artifactId>axis</artifactId>
  5. <version>1.4</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>commons-discovery</groupId>
  9. <artifactId>commons-discovery</artifactId>
  10. <version>0.2</version>
  11. <exclusions>
  12. <exclusion>
  13. <groupId>commons-logging</groupId>
  14. <artifactId>commons-logging</artifactId>
  15. </exclusion>
  16. </exclusions>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.apache.axis</groupId>
  20. <artifactId>axis-jaxrpc</artifactId>
  21. <version>1.4</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.apache.axis</groupId>
  25. <artifactId>axis-saaj</artifactId>
  26. <version>1.4</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>wsdl4j</groupId>
  30. <artifactId>wsdl4j</artifactId>
  31. <version>1.4</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>commons-httpclient</groupId>
  35. <artifactId>commons-httpclient</artifactId>
  36. <version>3.1</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.jdom</groupId>
  40. <artifactId>jdom</artifactId>
  41. <version>2.0.2</version>
  42. </dependency>

调用

  1. // 调用接口
  2. // 方法一:直接AXIS调用远程的web service
  3. try {
  4. Map<String, Object> map = new LinkedHashMap<>();
  5. // String endpoint =
  6. // "http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx";
  7. // String endpoint =
  8. // "http://10.110.113.101:8088/ZK_WebService.asmx";
  9. //String endpoint = "http://10.110.113.101:8088/ZK_WebService.asmx";
  10. String endpoint = "http://10.110.113.101:8088/ZK_WebService.asmx";
  11. map.put("ID", "");
  12. map.put("XM", "");
  13. map.put("XB", "");
  14. map.put("CSNY", "");
  15. map.put("SFZH", "");
  16. map.put("HF", "");
  17. map.put("LXDH", "");
  18. map.put("DWDM", "");
  19. map.put("PROJECTID", "");
  20. map.put("JCRQ", "2020-01-01^2020-01-02");
  21. //
  22. // StringBuffer sb = new StringBuffer();
  23. // sb.append(" <ID></ID> <XM></XM><XB></XB><CSNY></CSNY><SFZH></SFZH> <HF></HF><LXDH></LXDH><DWDM></DWDM><PROJECTID></PROJECTID>");
  24. // sb.append("<ZJRQ>");
  25. // sb.append("2020-01-01^2020-01-02");
  26. // sb.append("</ZJRQ>\n");
  27. String resultXml = this.invokeByAxis(map, endpoint, "http://tempuri.org/", "ZK_GetStudyID");
  28. System.err.println(resultXml);
  29. } catch (Exception e) {
  30. System.err.println(e.toString());
  31. e.printStackTrace();
  32. }

第一种 axis 方式

  1. /** * axis方式访问webservice * * @param dataMap * 请求的xml的报文 * @param endPoint * webservice的wsdl地址,例如:http://localhost:8080/project/services/ * mainName?wsdl * @param namespace * 调用方法的命名空间 * @param method * 调用的方法名 * @return 返回调用的报文(xml) * @throws IOException * */
  2. public static String invokeByAxis(Map dataMap, String endPoint, String namespace, String method)
  3. throws IOException {
  4. // 拼接好xml
  5. String responseXML = "";
  6. Service service = new Service();
  7. try {
  8. Call call = (Call) service.createCall();
  9. //设置请求超时时间
  10. call.setTimeout(5000);
  11. //webservice接口地址
  12. call.setTargetEndpointAddress(endPoint);
  13. //请求方法
  14. call.setOperationName(method);
  15. //请求命名空间
  16. call.setOperationName(new javax.xml.namespace.QName(namespace,
  17. method));
  18. call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//
  19. 设置返回类型
  20. //是否是soapaction
  21. // call.setUseSOAPAction(true);
  22. call.setSOAPActionURI(namespace + "ZK_GetPerson");
  23. //封装请求参数
  24. Set<String> set = dataMap.keySet();
  25. List<Object> objParams = new ArrayList<>();
  26. for(Iterator<String> it=set.iterator(); it.hasNext();){
  27. String key = it.next();
  28. Object value = dataMap.get(key);
  29. objParams.add(value);
  30. call.addParameter(key,
  31. org.apache.axis.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
  32. System.err.println("------------------key ===============" + key);
  33. }
  34. call.setReturnType(XMLType.XSD_STRING);
  35. System.err.println(objParams.toArray());
  36. System.err.println(call.getTargetEndpointAddress());
  37. System.err.println(call.getOperationName());
  38. System.err.println(call.getSOAPActionURI());
  39. responseXML = (String) call.invoke(objParams.toArray());
  40. } catch (Exception e) {
  41. System.err.println("WebService请求异常!原因: "+e.fillInStackTrace());
  42. }
  43. return responseXML;
  44. }

第二种方法

  1. /** * axis方式访问webservice * * @param dataMap * 请求的xml的报文 * @param endPoint * webservice的wsdl地址,例如:http://localhost:8080/project/services/ * mainName?wsdl * @param namespace * 调用方法的命名空间 * @param method * 调用的方法名 * @return 返回调用的报文(xml) * @throws IOException * */
  2. public static String invokeByAxis(String dataMap, String endPoint, String namespace, String method)
  3. throws IOException {
  4. // 拼接好xml
  5. String xmlStr = getXml(method, dataMap, namespace);
  6. System.out.println(xmlStr);
  7. String serviceAddress = endPoint; // 服务地址(将XXXX替换成自己项目的地址)
  8. String charSet = "utf-8";
  9. String contentType = "text/xml; charset=utf-8";
  10. String result = "";
  11. Map<String, Object> responseSoapMap = SoapUtil.responseSoap(xmlStr, serviceAddress, charSet, contentType);
  12. Integer statusCode = (Integer) responseSoapMap.get("statusCode");
  13. if (statusCode == 200) {
  14. String responseSoap = (String) responseSoapMap.get("responseSoap");
  15. String targetNodeName = "isSuccess";
  16. Document doc = XMLUtil.strXmlToDocument(responseSoap);
  17. result = XMLUtil.getValueByElementName(doc, targetNodeName);
  18. if (!StringUtils.isEmpty(result)) {
  19. System.out.println(result);
  20. } else {
  21. System.out.println("没有此节点或者没有值!");
  22. }
  23. } else {
  24. System.out.println("请求失败!");
  25. }
  26. return result;
  27. }
  28. /** * 设置xml * * @param method * 方法名称 * @param paramXml * 参数的xml * @param targetNameSpace * 命名空间 * @return */
  29. private static String getXml(String method, String paramXml,String targetNameSpace) {
  30. // 拼接好xml
  31. StringBuffer sb = new StringBuffer();
  32. sb.append(
  33. "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
  34. "<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/\">\n" +
  35. "<soap:Body>\n" +
  36. "<ZK_GetPerson xmlns=\"http://tempuri.org/\">" +
  37. "<Request>" + paramXml +"</Request>\n" +
  38. "</ZK_GetPerson>" +
  39. "</soap:Body>" +
  40. "</soap:Envelope>"
  41. );
  42. String xmlStr = sb.toString();
  43. System.out.println(xmlStr);
  44. return xmlStr;

第二种方法相关工具

  1. package com.ruoyi.quartz.util;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. import java.util.LinkedList;
  5. import java.util.List;
  6. import com.ruoyi.common.utils.StringUtils;
  7. import com.ruoyi.common.utils.spring.SpringUtils;
  8. import com.ruoyi.quartz.domain.SysJob;
  9. /** * 任务执行工具 * * @author ruoyi */
  10. public class JobInvokeUtil
  11. {
  12. /** * 执行方法 * * @param sysJob 系统任务 */
  13. public static void invokeMethod(SysJob sysJob) throws Exception
  14. {
  15. String invokeTarget = sysJob.getInvokeTarget();
  16. String beanName = getBeanName(invokeTarget);
  17. String methodName = getMethodName(invokeTarget);
  18. List<Object[]> methodParams = getMethodParams(invokeTarget);
  19. if (!isValidClassName(beanName))
  20. {
  21. Object bean = SpringUtils.getBean(beanName);
  22. invokeMethod(bean, methodName, methodParams);
  23. }
  24. else
  25. {
  26. Object bean = Class.forName(beanName).newInstance();
  27. invokeMethod(bean, methodName, methodParams);
  28. }
  29. }
  30. /** * 调用任务方法 * * @param bean 目标对象 * @param methodName 方法名称 * @param methodParams 方法参数 */
  31. private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
  32. throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
  33. InvocationTargetException
  34. {
  35. if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0)
  36. {
  37. Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams));
  38. method.invoke(bean, getMethodParamsValue(methodParams));
  39. }
  40. else
  41. {
  42. Method method = bean.getClass().getDeclaredMethod(methodName);
  43. method.invoke(bean);
  44. }
  45. }
  46. /** * 校验是否为为class包名 * * @param invokeTarget 名称 * @return true是 false否 */
  47. public static boolean isValidClassName(String invokeTarget)
  48. {
  49. return StringUtils.countMatches(invokeTarget, ".") > 1;
  50. }
  51. /** * 获取bean名称 * * @param invokeTarget 目标字符串 * @return bean名称 */
  52. public static String getBeanName(String invokeTarget)
  53. {
  54. String beanName = StringUtils.substringBefore(invokeTarget, "(");
  55. return StringUtils.substringBeforeLast(beanName, ".");
  56. }
  57. /** * 获取bean方法 * * @param invokeTarget 目标字符串 * @return method方法 */
  58. public static String getMethodName(String invokeTarget)
  59. {
  60. String methodName = StringUtils.substringBefore(invokeTarget, "(");
  61. return StringUtils.substringAfterLast(methodName, ".");
  62. }
  63. /** * 获取method方法参数相关列表 * * @param invokeTarget 目标字符串 * @return method方法相关参数列表 */
  64. public static List<Object[]> getMethodParams(String invokeTarget)
  65. {
  66. String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
  67. if (StringUtils.isEmpty(methodStr))
  68. {
  69. return null;
  70. }
  71. String[] methodParams = methodStr.split(",");
  72. List<Object[]> classs = new LinkedList<>();
  73. for (int i = 0; i < methodParams.length; i++)
  74. {
  75. String str = StringUtils.trimToEmpty(methodParams[i]);
  76. // String字符串类型,包含'
  77. if (StringUtils.contains(str, "'"))
  78. {
  79. classs.add(new Object[] { StringUtils.replace(str, "'", ""), String.class });
  80. }
  81. // boolean布尔类型,等于true或者false
  82. else if (StringUtils.equals(str, "true") || StringUtils.equalsIgnoreCase(str, "false"))
  83. {
  84. classs.add(new Object[] { Boolean.valueOf(str), Boolean.class });
  85. }
  86. // long长整形,包含L
  87. else if (StringUtils.containsIgnoreCase(str, "L"))
  88. {
  89. classs.add(new Object[] { Long.valueOf(StringUtils.replaceIgnoreCase(str, "L", "")), Long.class });
  90. }
  91. // double浮点类型,包含D
  92. else if (StringUtils.containsIgnoreCase(str, "D"))
  93. {
  94. classs.add(new Object[] { Double.valueOf(StringUtils.replaceIgnoreCase(str, "D", "")), Double.class });
  95. }
  96. // 其他类型归类为整形
  97. else
  98. {
  99. classs.add(new Object[] { Integer.valueOf(str), Integer.class });
  100. }
  101. }
  102. return classs;
  103. }
  104. 1.11111111111111111111111111
  105. /** * 获取参数类型 * * @param methodParams 参数相关列表 * @return 参数类型列表 */
  106. public static Class<?>[] getMethodParamsType(List<Object[]> methodParams)
  107. {
  108. Class<?>[] classs = new Class<?>[methodParams.size()];
  109. int index = 0;
  110. for (Object[] os : methodParams)
  111. {
  112. classs[index] = (Class<?>) os[1];
  113. index++;
  114. }
  115. return classs;
  116. }
  117. /** * 获取参数值 * * @param methodParams 参数相关列表 * @return 参数值列表 */
  118. public static Object[] getMethodParamsValue(List<Object[]> methodParams)
  119. {
  120. Object[] classs = new Object[methodParams.size()];
  121. int index = 0;
  122. for (Object[] os : methodParams)
  123. {
  124. classs[index] = (Object) os[0];
  125. index++;
  126. }
  127. return classs;
  128. }
  129. }

2.22222222222222222

  1. package com.ruoyi.common.task;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.StringReader;
  6. import java.io.UnsupportedEncodingException;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import org.apache.commons.httpclient.HttpClient;
  11. import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
  12. import org.apache.commons.httpclient.methods.PostMethod;
  13. import org.apache.commons.httpclient.methods.RequestEntity;
  14. import org.jdom2.Document;
  15. import org.jdom2.Element;
  16. import org.jdom2.JDOMException;
  17. import org.jdom2.input.SAXBuilder;
  18. import org.xml.sax.InputSource;
  19. /** * soap 工具类 * * @author ruoyi */
  20. public class XMLUtil{
  21. /** * Description: 将字符串类型的XML 转化成Docunent文档结构 * @param parseStrXml 待转换的xml 字符串 * @return */
  22. public static Document strXmlToDocument(String parseStrXml){
  23. StringReader read = new StringReader(parseStrXml);
  24. //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
  25. InputSource source = new InputSource(read);
  26. //创建一个新的SAXBuilder
  27. SAXBuilder sb = new SAXBuilder(); // 新建立构造器
  28. Document doc = null;
  29. try {
  30. doc = sb.build(source);
  31. } catch (JDOMException e) {
  32. e.printStackTrace();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. return doc;
  37. }
  38. /** * <p>Description: 根据目标节点名获取值</p> * @param doc 文档结构 * @param finalNodeName 最终节点名 * @return * * @author huoge */
  39. public static String getValueByElementName(Document doc,String finalNodeName){
  40. Element root = doc.getRootElement();
  41. HashMap<String,Object> map=new HashMap<String,Object>();
  42. //调用getChildAllText方法。获取目标子节点的值 </span>
  43. Map<String,Object> resultmap=getChildAllText(doc, root,map);
  44. String result=(String)resultmap.get(finalNodeName);
  45. return result;
  46. }
  47. /** * <p>Description: 递归获得子节点的值</p> * @param doc 文档结构 * @param e 节点元素 * @param resultmap 递归将值压入map中 * @return * * @author huoge */
  48. public static Map<String ,Object> getChildAllText(Document doc, Element e,HashMap<String,Object> resultmap)
  49. {
  50. if (e != null)
  51. {
  52. if (e.getChildren() != null) //如果存在子节点
  53. {
  54. List<Element> list = e.getChildren();
  55. for (Element el : list) //循环输出
  56. {
  57. if(el.getChildren().size() > 0) //如果子节点还存在子节点,则递归获取
  58. {
  59. getChildAllText(doc, el,resultmap);
  60. }
  61. else
  62. {
  63. resultmap.put(el.getName(), el.getTextTrim()); //将叶子节点值压入map
  64. }
  65. }
  66. }
  67. }
  68. return resultmap;
  69. }
  70. }

第二种方法的原文链接 : https://blog.csdn.net/walkcode/article/details/7871021

发表评论

表情:
评论列表 (有 0 条评论,37人围观)

还没有评论,来说两句吧...

相关阅读