调用WebService

  • 使用wsimport生成代码(不推荐)
  • 使用Axis-1.4 动态调用
  • 使用HTTP+SOAP方式远程调用
  • 通过Spring注解方式调用

使用wsimport生成代码(不推荐)

配置java环境变量后在命令窗口中输入
-keep:是否生成java源文件

-d:指定.class文件的输出目录

-s:指定.java文件的输出目录

-p:定义生成类的包名,不定义的话有默认包名

-verbose:在控制台显示输出信息

-b:指定jaxws/jaxb绑定文件或额外的schemas

-extension:使用扩展来支持SOAP1.2

wsimport -encoding utf-8 -s D:\存放目录\ -p com.ws.cli -XadditionalHeaders -verbose  http://localhost/xxxx/xxxx?wsdl

即可生成Java代码,然后将代码拷贝到项目中,直接调用即可。
但这样生成的代码不够灵活,如果对方接口参数修改了,需要重新生成代码,不建议使用

使用Axis-1.4 动态调用

代码中使用的axis版本为1.4,需要注意的是不同版本的Axis相差很大,下面是调用代码

/*** Axis动态调用wsdl** @param wsdlUrl             服务地址* @param targetNamespace     服务命名空间* @param operationMethodName 接口方法名* @param bodyParams          body参数 <参数名,参数值>* @param headerParams        header参数 <参数名,参数值> (可为空)* @param loadPart            loadPart(设置header时才需要)* @return T*/public static <T> T invokeWebservice_axis(String wsdlUrl, String targetNamespace,String operationMethodName,Map<String, Object> bodyParams,Map<String, String> headerParams,String loadPart) {try {//引用远程的wsdl文件Service service = new Service();Call call = (Call) service.createCall();call.setTargetEndpointAddress(wsdlUrl);//接口名call.setOperationName(new QName(targetNamespace, operationMethodName));//由于需要认证,故需要设置头部调用的密钥if (headerParams != null && headerParams.size() > 0) {SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(targetNamespace, loadPart);soapHeaderElement.setNamespaceURI(targetNamespace);Set<Map.Entry<String, String>> headParamSet = headerParams.entrySet();for (Map.Entry<String, String> map : headParamSet) {try {soapHeaderElement.addChildElement(map.getKey()).setValue(map.getValue());} catch (SOAPException e) {e.printStackTrace();}}call.addHeader(soapHeaderElement);}Object[] params = new Object[bodyParams.size()];//参数Set<Map.Entry<String, Object>> entries = bodyParams.entrySet();int i = 0;for (Map.Entry<String, Object> map : entries) {call.addParameter(new QName(targetNamespace, map.getKey()), XMLType.XSD_STRING, ParameterMode.IN);params[i] = map.getValue();i++;}// 设置返回类型call.setReturnType(XMLType.XSD_STRING);//传递参数,并且调用方法String result = (String) call.invoke(params);return (T) result;} catch (Exception e) {e.printStackTrace();}return null;}

使用HTTP+SOAP方式远程调用

需要使用工具SoapUI, 创建测试项目,得到具体方法名和参数名

/*** 通过SOAP调用WebService** @param uri             address* @param soapRequestData soap表头* @param nodeName        返回信息的节点名* @return 指定节点的值*/private static SAXReader reader = new SAXReader();public static String invokeWebservice_soap(String uri, String soapRequestData, String nodeName) {try {String method = uri;PostMethod postMethod = new PostMethod(method);byte[] b = soapRequestData.getBytes(StandardCharsets.UTF_8);InputStream is = new ByteArrayInputStream(b, 0, b.length);RequestEntity re = new InputStreamRequestEntity(is, b.length, "text/xml;charset=utf-8");postMethod.setRequestHeader("SOAPAction", "");postMethod.setRequestEntity(re);HttpClient httpClient = new HttpClient();Integer statusCode = httpClient.executeMethod(postMethod);byte[] responseBody = postMethod.getResponseBody();Document document = reader.read(new ByteArrayInputStream(responseBody));Map<String, String> nodeMap = new HashMap<>();getChildNodes(document.getRootElement(), nodeMap);return nodeMap.get(nodeName);} catch (Exception e) {e.printStackTrace();return null;}}

soapRequestData :通过SoapUI获取报文,拼接需要传递的参数
调用示例如下:

String soapRequestData = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" \n" +"xmlns:wsi=\"http://xxx.webservice.xxx.com/\">\n" +"   <soapenv:Header/>\n" +"   <soapenv:Body>\n" +"      <wsi:GlobalFunc>\n" +"         <!--Optional:-->\n" +"         <param1>" + "参数1" + "</param1>\n" +"         <param2>" + "参数2"+ "</param2>\n" +"         <param3>" + "参数3"+ "</param3>\n" +"      </wsi:GlobalFunc>\n" +"   </soapenv:Body>\n" +"</soapenv:Envelope>";WsdlClient.invokeWebservice_soap("http://xx/Service?wsdl", soapRequestData);

避免使用过程中出现类、参数等错误,代码中使用的类路径如下,直接Ctrl + C

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.soap.SOAPException;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

通过Spring注解方式调用

代码比较简单,就不写了
链接: 注解方式调用.

Java调用WebService接口的四种方式相关推荐

  1. 【转】java调用http接口的几种方式总结

    java调用http接口的几种方式总结 本文参考: https://blog.csdn.net/fightingXia/article/details/71775516 https://www.cnb ...

  2. vue 调用webservice_动态调用WebService接口的几种方式

    一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...

  3. java调用webService接口的几种方法

    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...

  4. java调用restful接口_Java调用RESTful接口的几种方式

    前端一般通过Ajax来调用,后端调用的方式还是挺多的,比如HttpURLConnection,HttpClient,Spring的RestTemplate 服务端代码如下: 服务端接口请求的URL:h ...

  5. SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口

    ` SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口 项目上调用一个第三方公司提的的webservice短信接口,使用了以下几种接口调用技术 ...

  6. Java反射之创建对象的四种方式

    Java反射之创建对象的四种方式 1.使用new关键字 2.使用Java反射机制,反射构造器 3.使用克隆方式创建对象Cloneable 4.使用序列化Serializable 1.使用Java反射机 ...

  7. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello {public stati ...

  8. java中Map遍历的四种方式

    java中Map遍历的四种方式 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方 ...

  9. Java中实现接口的三种方式您造吗?

    本文介绍了Java中实现接口的三种方式:常规实现方式.匿名内部类和 Lambda表达式实现方式.希望已经了解的同学可以重新温习一下,不了解的同学则从中受益! Java中接口最常规的实现方式 同学们都会 ...

  10. java调用接口速度慢,Java 调用 webservice 接口,为什么这么慢

    Java 调用 webservice 接口,为什么这么慢,有没有好的优化方案,本人目前改成 http 方式发 soap 消息调用,速度依旧很慢,维持在平均 100ms 下不来. 之前用 cxf 的 J ...

最新文章

  1. OpentTsdb官方文档中文版----查询性能
  2. T-SQL操作XML 数据类型方法 modify 的参数 1 必须是字符串文字。
  3. STM32 基础系列教程 32 – Ethnet+Lwip
  4. Qt Creator使用帮助模式
  5. 作者:洪学海(1967-),男,博士,中国科学院计算技术研究所研究员,信息技术战略研究中心常务副主任。...
  6. 开发指南专题十六:JEECG微云快速开发平台Excel导出
  7. 财富自由之路,其实取决于你的工作效率
  8. python网址编码转换_python字符串与url编码的转换实例
  9. SVN提交时显示:Path is not a working copy directory
  10. 可综合的异步fifo设计(二)
  11. 10-TensorFlow 基于LeNet的轴承故障诊断
  12. 数学分析教程(科大)——4.2笔记+习题
  13. 笔记本重启一直进bios
  14. 华为防火墙配置(双机热备)
  15. 电脑发到,电脑电影怎么传到手机_把电脑上的电影传到手机上的详细教程
  16. 网易云信赵加雨:极致匠心的技术团队撑起60万开发者
  17. 华为机试4.27:公式修正
  18. java里speak的用法,speak的用法总结大全
  19. 《锦绣中华》中老年公益文旅游-走进佛山敬老院
  20. java编程定义狗_用Java创建一条自己diy的狗狗类(6)

热门文章

  1. 车辆运动学和动力学模型
  2. 无人驾驶中UTM坐标系GPS坐标系相关知识总结
  3. angular报错:Maximum call stack size exceeded
  4. mysql和sqlyog安装_MySQL与sqlyog安装教程图文详解
  5. 阿里笔试7/29 9-10点场
  6. MSP430单片机与SIM800A调试
  7. 单LED单端输出充电仓配合TWS耳机芯片QCC3020使用
  8. 老王python培训视频教程完整版
  9. SCI论文写作常用表达整理
  10. Java集合类源码分析汇总