Java三种方式实现发送xml参数的WebService接口调用

Java三种方式实现发送xml参数的WebService接口调用项目开发中与第三方系统数据对接遇到的问题,仅用作记录。1.使用cxf调用(联调时没有收到响应信息)JaxWsDynamicClientFactoryclientFactory=JaxWsDynamicClientFactory.newInstance();logger.info(JSON.toJSON(todoInfo));Clientclient=clientFacto…

大家好,又见面了,我是你们的朋友全栈君。

项目开发中与第三方系统数据对接遇到的问题,仅用作记录。

1.使用cxf调用(联调时没有收到响应信息)

JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
logger.info(JSON.toJSON(todoInfo));
Client client = clientFactory.createClient("http://******************?wsdl");

String[] result = (String[]) client.invoke("ummWaitMessageAdd", todoInfo.get("sysno"), todoInfo.get("iccode"), todoInfo.get("msgno"), todoInfo.get("pkno")
        , todoInfo.get("gno"), todoInfo.get("title"), todoInfo.get("type"), todoInfo.get("url"), todoInfo.get("info"), todoInfo.get("prior")
        , todoInfo.get("flow"), todoInfo.get("create"), todoInfo.get("create"));
logger.info(result.toString());
String resultStr = result[0];
return resultStr;

相关jar包,也可点击下载

pom.xml

<cxf.version>2.7.12</cxf.version>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-core</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-simple</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-databinding-aegis</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-local</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-jms</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-management</artifactId>
    <version>${cxf.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-common-utilities</artifactId>
    <version>2.5.10</version>
</dependency>

2.使用axis方式调用(这种方式可以收到服务端返回信息,不过一直报错)

            org.apache.axis.client.Service service = new org.apache.axis.client.Service();
            Call call = (Call) service.createCall();
            String endpoint = “http://*****************************?wsdl”;
            String operationName = “ummWaitMessageAdd”;
            call.setTargetEndpointAddress(new URL(endpoint));
            call.setOperationName(new QName(targetNameSpace, operationName));
            call.addParameter(“sysno”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“iccode”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“msgno”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“pkno”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“gno”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“title”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“type”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“url”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“info”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“prior”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“flow”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“create”, Constants.XSD_STRING, ParameterMode.IN);
            call.addParameter(“update”, Constants.XSD_STRING, ParameterMode.IN);
            //设置返回的类型
            call.setReturnType(Constants.XSD_STRING);
            // 这里的obj{}是放入几个入参,完全由service提供的接口方法的入参决定,且顺序和你存放的顺序一致!一般入参为String类型的xml报文,回参也是xml报文。
            Object[] obj = new Object[] { todoInfo.get(“sysno”)+””, todoInfo.get(“iccode”), todoInfo.get(“msgno”), todoInfo.get(“pkno”)
                    , todoInfo.get(“gno”), todoInfo.get(“title”), todoInfo.get(“type”), todoInfo.get(“url”), todoInfo.get(“info”), todoInfo.get(“prior”)
                    , todoInfo.get(“flow”), todoInfo.get(“create”)+””, todoInfo.get(“create”)+”” };
            String result = (String) call.invoke(obj);
            return result;

相关jar包,也可点击下载

pom.xml

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis-jaxrpc</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>axis</groupId>
    <artifactId>axis-wsdl4j</artifactId>
    <version>1.5.1</version>
</dependency>
<dependency>
    <groupId>commons-discovery</groupId>
    <artifactId>commons-discovery</artifactId>
    <version>0.2</version>
</dependency>
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

3.通过http post方式(最后就是通过这种方式实现接口…)

先将请求参数封装在xml中,在发送http请求

/**
 * 生成请求xml数据
 * @param methodName 方法名 本例为"ummWaitMessageAdd"
 * @param todoInfo 数据 (key为wsdl文件中参数的name值注意大小写和顺序都要保持一致,value为实际值)
 * @return
 */
private String makeXml(String methodName ,Map<String, Object> todoInfo) {
    logger.info("=======生成xml======");
    StringBuffer sb = new StringBuffer();
    sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
            "<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" +
            "  <soap:Body>\n" +
            "    <" + methodName + " xmlns=\"WSCenter\">\n" );
    for (String key : todoInfo.keySet()) {
        if (DataUtil.checkMapcontainsKey(todoInfo, key)) {
            sb.append("<" + key + ">");
            sb.append(todoInfo.get(key).toString().replaceAll("&", "&amp;"));//特殊字符需要转换
            sb.append("</" + key + ">");
        } else {
            sb.append("<" + key + "/>");
        }
        sb.append("\r\n");
    }
    sb.append( "    </" + methodName + ">\n" +
            "  </soap:Body>\n" +
            "</soap:Envelope>");
    logger.info("=======生成xml结束======");
    return sb.toString();
}
发送请求代码
URL url = new URL("http://*****************************?wsdl");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestMethod("POST");
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.write(params.getBytes("utf-8"));//params就是上面生成的xml内容
dos.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line = null;
StringBuffer strBuf = new StringBuffer();
while ((line = reader.readLine()) != null) {
    strBuf.append(line);
}
dos.close();
reader.close();
String rs = strBuf.toString();

webservice服务端wsdl文件(服务端是用.net实现)

Java三种方式实现发送xml参数的WebService接口调用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157910.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 凤凰系统(Phoenix OS)PC版安装,电脑上体验功能丰富的安卓系统「建议收藏」

    凤凰系统(Phoenix OS)PC版安装,电脑上体验功能丰富的安卓系统「建议收藏」PC版(X86版)ISO镜像下载地址:http://www.phoenixos.com/download_x86下载完成后,可按照官方给出的安装教程进行安装。凤凰系统帮助中心:http://www

  • wsus补丁服务器搭建_搭建局域网自动更新服务器

    wsus补丁服务器搭建_搭建局域网自动更新服务器1、搭建wsus补丁服务器,在微软官网下载安装包WSUS30-KB972455-x64.exe,地址为:http://www.microsoft.com/en-us/download/details.aspx?id=52162、建议wsus补丁服务器部署在loggetter上,这样省得再买一个winserver2008正版授权,而且就算loggetter故障了,是对整个桌面云…

    2022年10月24日
  • 单片机C语言视频教程转让「建议收藏」

    单片机C语言视频教程转让「建议收藏」单片机的C语言视频教程转让,本套光盘购于天祥电子,花了我200大元,如今我以60元(包快递)的价格转让。有意者请与我联系。QQ:247964971 电话:13982129248讲座从最基本电路知识开始讲起,非常详细的讲解KEIL编译器的使用,课程全部用单片机的C语言讲解,从C语言的第一个主函数MAIN讲起,一步步讲解每一个语法,每条指令的意思,即使对单片机一巧不能,对C语言一无所知,通过

  • 小区智能化设计方案简述_智慧设计

    小区智能化设计方案简述_智慧设计在智慧城市大前提下的智慧小区的建设势必将借助高精尖技术的帮助,产业的发展带来大数据、人工智能技术、智能安全机器人、云计算和物联网等相关技术的突破,技术的成熟应用又为智慧小区提供强有力的技术保障,产业的繁荣将为智慧小区满足规模化应用条件,最终促进产业升级、经济发展,为城市注入新活力。实现汇聚社区内出入口、公共区域监控、单元门、单位大门等区域结构化摄像机、车辆卡口、人脸智能门禁等智能前端,真正做到“人过留影、车过留牌”,不仅对社区安全进行全方位安全保障,同时为公安部门情报研判、人口管理提供前提条件,实现事前预警

    2022年10月17日
  • @transactional的使用_@transactional注解默认的回滚方式

    @transactional的使用_@transactional注解默认的回滚方式@Transactional是声明式事务管理编程中使用的注解1.添加位置1)接口实现类或接口实现方法上,而不是接口类中。2)访问权限:public的方法才起作用。@Transactional注解应该只被应用到public方法上,这是由SpringAOP的本质决定的。系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管…

  • Shiro 框架简单介绍

    Shiro 框架简单介绍Shiro 框架简单介绍

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号