java如何使用webService方式调用对接第三方平台

实际使用记录,做个记录:

1、需要对方提供wsdl文件,该文件中有接口的Ip地址,方法名、参数等详细信息,

wsdl文档中targetNamespace为命名空间

<xsd:element name="searchBGDMIInfo">标签中name是方法名:文档以searchBGDMIInfo为例

详细可参考wsdl官方文档

wsdl文档例子:

2、测试与第三方平台网络是否可以正常连接,根据对方提供的wsdl文档,拼写curl命令,例:

-- 10.20.21.XXX第三方平台的IP地址,USERNAME标签账户,PASSWORD标签内容为密码,需要根据wsdl文档来,自定义命令
curl --request POST \
  --url 'http://10.20.21.XXX/newdiss/services/DMDataService?wsdl=' \
  --header 'Content-Type: text/xml' \
  --header 'content-type: application/xml' \
  --data '<?xml version="1.0" encoding="utf-8"?>
<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/">
  <soap:Body>
    <searchBGDMIInfo> 
      <in0> 
        &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
        &lt;NACAOREQUEST&gt;
                &lt;USERNAME&gt;test&lt;/USERNAME&gt;
                &lt;PASSWORD&gt;123456&lt;/PASSWORD&gt;
        &lt;/NACAOREQUEST&gt;
      </in0>                 
    </searchBGDMIInfo>
  </soap:Body>
</soap:Envelope>'

需要引入jar包

  <dependency>
            <groupId>commons-discovery</groupId>
            <artifactId>commons-discovery</artifactId>
            <version>0.5</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.rpc</groupId>
            <artifactId>javax.xml.rpc-api</artifactId>
            <version>1.1.1</version>
        </dependency>

以下是java代码案例:

//  searchBGDMIInfoUrl为平台Ip地址:http://10.20.xx.xxx:9000/newdiss/services/DMtestService
//zdMethod为方法名称:searchBGDMIInfo
//    xmlStr_search为请求报文,xml格式,需要平台提供

public  String searchBGDMIInfo(){//获取文件列表
        String fileName="";
        String paramName="searchBGDMIInfo";
        SearchBGDMIInfoXmlRsp infoXmlRsp=new SearchBGDMIInfoXmlRsp();
        try {
            String xmlStr_search="<NACAOREQUEST>"+
                    "<USERNAME>"+userName+"</USERNAME>"+
                    "<PASSWORD>"+passWord+"</PASSWORD>"+
                    "</NACAOREQUEST>";
            String wsdlurl = searchBGDMIInfoUrl;
            String method = zdMethod;
            String targetNamespace = zdTargetNamespace;
            Object[] keys = new Object[]{paramName};
            Object[] values = new Object[]{xmlStr_search};
            log.debug("searchBGDMIInfo 访问url => {} method => {} targetNamespace=> {} paramName参数名:{} ",wsdlurl,method,
                    targetNamespace,paramName);
            String rspsXml = WebServiceUtils.sendSoap12(wsdlurl,  method, targetNamespace,
                    keys, values);
            log.debug("searchBGDMIInfo 返回响应rspsXml -=> {}", rspsXml);
            infoXmlRsp=xmlToBean(SearchBGDMIInfoXmlRsp.class,rspsXml);
            if(infoXmlRsp!=null&&infoXmlRsp.getEnvelope()!=null){
                fileName=infoXmlRsp.getEnvelope().getFileName();
            }
            log.debug("解析xml后 searchBGDMIInfo infoXmlRsp -=> {}", JSON.toJSONString(infoXmlRsp));
        } catch (Exception e) {
            log.error("searchBGDMIInfo exception", e);
        }
        return  fileName;



-------------------------------------

   /**
     * 调用WebService接口,AXIS方式直接引用远程的.wsdl文件
     * 调用接口时,传入方法名,字段与字段值顺序需要严格按照接口定义
     * 使用SOAP1.2发送消息
     *
     * @param wsdlurl         接口地址
     * @param method          方法名
     * @param keys            字段(方法参数)
     * @param values          字段值(参数对应值)
     * @param targetNamespace 命名空间
     * @return 接口返回值
     */
    public static String sendSoap12(String wsdlurl, String method, String targetNamespace, Object[] keys, Object[] values) throws Exception {

        Service service = new Service();
        Call call = (Call) service.createCall();
        call.setEncodingStyle("UTF-8");
        call.setTargetEndpointAddress(wsdlurl);
        call.setOperationName(new QName(targetNamespace, method)); // 方法名称
        call.setReturnType(XMLType.XSD_STRING);// 设置返回类型
       // call.setReturnClass(String[].class);
        params(targetNamespace, call, keys, values);
        call.setUseSOAPAction(true);
        // 设置超时时间
        call.setTimeout(SOCKET_TIMEOUT);  // 设置超时时间为5
        //call.setSOAPActionURI(targetNamespace + "/" + method);
        call.setSOAPActionURI("");
        return (String) call.invoke(values);

    }


 /**
     * 调用WebService接口之前,方法参数及参数赋值
     * 当前接口中参数类型仅限于字符串、整数、布尔,参数为空的情况为字符串类型
     *
     * @param targetNamespace 命名空间
     * @param call            接口访问请求
     * @param keys            字段(方法参数)
     * @param values          字段值(参数对应值)
     */
    private static void params(String targetNamespace, Call call, Object[] keys, Object[] values) {

        if (keys == null || values == null) {
            return;
        }
        if (keys.length == 0 || values.length == 0) {
            return;
        }
        if (keys.length != values.length) {
            throw new IllegalArgumentException("接口方法参数与参数值不匹配!");
        }
        for (int i = 0; i < values.length; i++) {
            String key = (String) keys[i]; //方法参数
            Object value = values[i]; //参数值
            if (value == null) {
                call.addParameter(new QName(targetNamespace, key), XMLType.XSD_STRING, ParameterMode.IN);
            } else if (value instanceof String) {
                call.addParameter(new QName(targetNamespace, key), XMLType.XSD_STRING, ParameterMode.IN);
            } else if (value instanceof Integer) {
                call.addParameter(new QName(targetNamespace, key), XMLType.XSD_INTEGER, ParameterMode.IN);
            } else if (value instanceof Boolean) {
                call.addParameter(new QName(targetNamespace, key), XMLType.XSD_BOOLEAN, ParameterMode.IN);
            }
        }
    }

这样就可以测试了,也可以使用main方法来进行测试。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值