Java调用WebService接口的四种方式
调用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接口的四种方式相关推荐
- 【转】java调用http接口的几种方式总结
java调用http接口的几种方式总结 本文参考: https://blog.csdn.net/fightingXia/article/details/71775516 https://www.cnb ...
- vue 调用webservice_动态调用WebService接口的几种方式
一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...
- java调用webService接口的几种方法
webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...
- java调用restful接口_Java调用RESTful接口的几种方式
前端一般通过Ajax来调用,后端调用的方式还是挺多的,比如HttpURLConnection,HttpClient,Spring的RestTemplate 服务端代码如下: 服务端接口请求的URL:h ...
- SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口
` SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口 项目上调用一个第三方公司提的的webservice短信接口,使用了以下几种接口调用技术 ...
- Java反射之创建对象的四种方式
Java反射之创建对象的四种方式 1.使用new关键字 2.使用Java反射机制,反射构造器 3.使用克隆方式创建对象Cloneable 4.使用序列化Serializable 1.使用Java反射机 ...
- JAVA中集合输出的四种方式
在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello {public stati ...
- java中Map遍历的四种方式
java中Map遍历的四种方式 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方 ...
- Java中实现接口的三种方式您造吗?
本文介绍了Java中实现接口的三种方式:常规实现方式.匿名内部类和 Lambda表达式实现方式.希望已经了解的同学可以重新温习一下,不了解的同学则从中受益! Java中接口最常规的实现方式 同学们都会 ...
- java调用接口速度慢,Java 调用 webservice 接口,为什么这么慢
Java 调用 webservice 接口,为什么这么慢,有没有好的优化方案,本人目前改成 http 方式发 soap 消息调用,速度依旧很慢,维持在平均 100ms 下不来. 之前用 cxf 的 J ...
最新文章
- OpentTsdb官方文档中文版----查询性能
- T-SQL操作XML 数据类型方法 modify 的参数 1 必须是字符串文字。
- STM32 基础系列教程 32 – Ethnet+Lwip
- Qt Creator使用帮助模式
- 作者:洪学海(1967-),男,博士,中国科学院计算技术研究所研究员,信息技术战略研究中心常务副主任。...
- 开发指南专题十六:JEECG微云快速开发平台Excel导出
- 财富自由之路,其实取决于你的工作效率
- python网址编码转换_python字符串与url编码的转换实例
- SVN提交时显示:Path is not a working copy directory
- 可综合的异步fifo设计(二)
- 10-TensorFlow 基于LeNet的轴承故障诊断
- 数学分析教程(科大)——4.2笔记+习题
- 笔记本重启一直进bios
- 华为防火墙配置(双机热备)
- 电脑发到,电脑电影怎么传到手机_把电脑上的电影传到手机上的详细教程
- 网易云信赵加雨:极致匠心的技术团队撑起60万开发者
- 华为机试4.27:公式修正
- java里speak的用法,speak的用法总结大全
- 《锦绣中华》中老年公益文旅游-走进佛山敬老院
- java编程定义狗_用Java创建一条自己diy的狗狗类(6)