Java使用Hutool调用WebService接口详解

Posted 神奇的饭团

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java使用Hutool调用WebService接口详解相关的知识,希望对你有一定的参考价值。

提示:本文显示baidu.com,皆为脱敏用,并非真正地址。

目录

前言

一、WebService是什么?

二、使用步骤

1.验证链接。

2.Soap调用测试

3.获取需要用到的数据

4.Hutool工具类调用

三、示例

1.单个入参

2.多个入参

3.动态地址

4.多命名空间

总结


前言

大家WebService接口还在使用生成的类去实现调用的吗?

其实Hutool的WebService工具很厉害,但是文档写的不太清楚,或者示例不够多,我主要做医疗业务,对接方基本都是WebService接口,刚开始使用hutool的时候确实花费了挺长时间研究,最终失败告终,奈何业务多,有丰富的机会去尝试,现在基本啥格式的都可以克服了。


一、WebService是什么?

​ Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。

二、使用步骤

1.验证链接。

拿到三方提供的链接后,需要进行验证下 

例如:第三方提供链接:http://localhost:8080/XXX/services/xxxxxxImpl

 需要改成:第三方提供链接:http://localhost:8080/XXX/services/xxxxxxImpl?wsdl

然后用浏览器打开能像下图展示即可:

2.Soap调用测试

使用SoapUI进行接口调用一次(没有SoapUI的自己去安装下)

如下图进行创建

 打开,选择要调用的接口,点开request后,后边会出现一个框,里面有调用入参和请求地址

3.获取需要用到的数据

  1. 接口请求地址:http://localhost:8080/xxxxx/services/xxxxServiceImpl
  2. 请求头:SOAPAction:""
  3. 请求方法/接口:ser:ReceiveDataAll
  4. 前缀命名空间:http://service.mocire.baidu.com/
  5. 入参:
<![CDATA[<request><type>1</type></request>]]>

4.Hutool工具类调用

针对上面的数据,我这边写好工具类,先上干货,然后一一为大家讲解:

package com.ceshi;

import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.XmlUtil;
import cn.hutool.http.webservice.SoapClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * @author 饭团
 * @version 1.0
 * @description: TODO
 * @date 2022/10/24 14:14
 */
public class a 
    private static Logger log = LoggerFactory.getLogger(a.class);

    public static void main(String[] args) 
        StringBuilder params = new StringBuilder("<![CDATA[<request>");
        params.append("<type>0</type></request>]]>");
        request("ReceiveDataAll",params.toString());
    

    /**
     * @description: 请求方法
     * @param: method 请求方法
     * @param: params 入参字符串
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     * @author 周培武
     * @date: 2022/10/24 14:23
     */
    private static Map<String, Object> request(String method, String params)
        String result = "";
        String requestId = UUID.randomUUID().toString();
        try
            String url = "http://localhost:8080/xxxxxx/services/xxxxServiceImpl";
            SoapClient client = SoapClient.create(url)
                    .header("SOAPAction","")
                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间
                    .setMethod("ser:"+method, "http://service.mocire.baidu.com/")
                    .setParam("message",params,false);//此处写true,会自动填写命名空间

            log.info("[请求ID:]CSDN测试方法字符串接口:,入参:",requestId,url,client.getMsgStr(true));
            // 发送请求,参数true表示返回一个格式化后的XML内容
            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应
            result = client.send(false);
            log.info("[请求ID:]CSDN测试方法字符串出参:",requestId,result);
            if(result.contains("<![CDATA["))
                result = result.substring(result.indexOf("<![CDATA[")+9,result.indexOf("]]>"));
            else
                result = result.substring(result.indexOf("Result>")+7,result.indexOf("</")+1);
            
            Map<String, Object> resultMap = XmlUtil.xmlToMap(result);
            return resultMap;
        catch (Exception ex)
            log.error("[请求ID:]CSDN测试方法字符串出现异常,入参:,出参:,",requestId,params,result,ex);
            throw ex;
        
    

  • 接口地址:好理解,就放在create()方法入参里,如果接口地址动态变动,可以请求方法加入参:接口,然后这块随之变动
  • 请求头:header(),左边填写SOAPAction,右边由于我这边是空的,我就默认留空,实际按照你们的soapui上显示的填写
  • 请求方法:setMethod(),左边填写带前缀的请求方法,右边填写对应的前缀命名空间
  • 入参:setParam(),填写字段名,入参(我这边就一个入参,里面包含的是一个xml字符串),是否自动填写前缀,我这边这个字段是不带前缀的,所以填写false,大家按照自己的来.

如果是多个入参,可以选用setParams,写入一个map,键值对,然后统一配置是否添加前缀

  • 获取生成后的入参:client.getMsgStr(true),此处参数是否是格式化后的参数,大家可以自己测试。

我这边只是拿这个接口做了一个测试,下面会给大家整理下我这边遇到的各种不通类型的请求信息和工具类

三、示例

1.单个入参

请求数据:

接口地址:http://localhost:8080/xxxxxx/services/xxxxServiceImpl
请求头:SOAPAction: ""
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.mocire.baidu.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:ReceiveDataAll>
         <!--Optional:-->
         <message><![CDATA[<request><type>1</type></request>]]></message>
      </ser:ReceiveDataAll>
   </soapenv:Body>
</soapenv:Envelope>

请求方法:

public static void main(String[] args) 
        StringBuilder params = new StringBuilder("<![CDATA[<request>");
        params.append("<type>0</type></request>]]>");
        request("ReceiveDataAll",params.toString());
    

    /**
     * @description: 请求方法
     * @param: method 请求方法
     * @param: params 入参字符串
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     * @author 周培武
     * @date: 2022/10/24 14:23
     */
    private static Map<String, Object> request(String method, String params)
        String result = "";
        String requestId = UUID.randomUUID().toString();
        try
            String url = "http://localhost:8080/xxxxxx/services/xxxxServiceImpl";
            SoapClient client = SoapClient.create(url)
                    .header("SOAPAction","")
                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间
                    .setMethod("ser:"+method, "http://service.mocire.baidu.com/")
                    .setParam("message",params,false);//此处写true,会自动填写命名空间

            log.info("[请求ID:]CSDN测试方法字符串接口:,入参:",requestId,url,client.getMsgStr(true));
            // 发送请求,参数true表示返回一个格式化后的XML内容
            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应
            result = client.send(false);
            log.info("[请求ID:]CSDN测试方法字符串出参:",requestId,result);
            if(result.contains("<![CDATA["))
                result = result.substring(result.indexOf("<![CDATA[")+9,result.indexOf("]]>"));
            else
                result = result.substring(result.indexOf("Result>")+7,result.indexOf("</")+1);
            
            Map<String, Object> resultMap = XmlUtil.xmlToMap(result);
            return resultMap;
        catch (Exception ex)
            log.error("[请求ID:]CSDN测试方法字符串出现异常,入参:,出参:,",requestId,params,result,ex);
            throw ex;
        
    

2.多个入参

请求数据:

接口地址:http://localhost:8080/xxxxxx/services/xxxxServiceImpl
请求头:SOAPAction: "http://tempuri.org/GetThirdAppData"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetThirdAppData>
         <tem:strPatientId>1000001</tem:strPatientId>
         <tem:strHospitalNo>1</tem:strHospitalNo>
         <tem:strXML><![CDATA[<HOSPITAL_NO>1</HOSPITAL_NO><PATIENT_ID>1000001</PATIENT_ID>]]></tem:strXML>
      </tem:GetThirdAppData>
   </soapenv:Body>
</soapenv:Envelope>

请求示例:

public static Map<String, Object> write(String param)
        String result = "";
        String requestId = UUID.randomUUID().toString();
        try
            String hospitalNo = "1";
            String patientId = "1000001";
            //拼接strXML
            Map<String,Object> paramMap = new HashMap<>();
            paramMap.put("HOSPITAL_NO", hospitalNo);//医院编码
            paramMap.put("PATIENT_ID",patientId);//患者ID
            String paramStr = "<![CDATA["+XmlUtil.mapToXmlStr(paramMap)+"]]>";
            //拼接外层入参
            Map<String,Object> params = new HashMap<>();
            params.put("strPatientId",patientId);
            params.put("strHospitalNo",hospitalNo);
            params.put("strXML",paramStr);
            //新建客户端
            String url = "";
            SoapClient client = SoapClient.create("http://localhost:8080/xxxxxx/services/xxxxServiceImpl")
                    .header("SOAPAction","http://tempuri.org/GetThirdAppData")
                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间
                    .setMethod("tem:GetThirdAppData", "http://tempuri.org/")
                    .setParams(params,true);

            log.info("[请求ID:]CSDN测试方法字符串接口:,入参:",requestId,url,client.getMsgStr(true));
            // 发送请求,参数true表示返回一个格式化后的XML内容
            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应
            result = client.send(false);
            log.info("[请求ID:]CSDN测试方法字符串出参:",requestId,result);
            if(result.contains("<![CDATA["))
                result = result.substring(result.indexOf("<![CDATA[")+9,result.indexOf("]]>"));
            else
                result = result.substring(result.indexOf("Result>")+7,result.indexOf("</")+1);
            
            Map<String, Object> resultMap = XmlUtil.xmlToMap(result);
            return resultMap;
        catch (Exception ex)
            log.error("[请求ID:]CSDN测试方法字符串出现异常出参:,",requestId,result,ex);
            throw ex;
        
    

3.动态地址

请求数据:

接口地址:http://localhost:8080/xxxxxx/services/xxxxServiceImpl.cls?CfgItem=A101查询患者信息接口
请求头:SOAPAction: "http://baidu.com/BS.XmlService.Send"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bjg="http://baidu.com">
   <soapenv:Header/>
   <soapenv:Body>
      <bjg:Send>
         <bjg:pInput><![CDATA[<request><idNo>0</type></idNo>]]></bjg:pInput>
      </bjg:Send>
   </soapenv:Body>
</soapenv:Envelope>

请求示例:

public static void main(String[] args) 
        StringBuilder params = new StringBuilder("<![CDATA[<request>");
        params.append("<idNo>0</idNo></request>]]>");
        request("A101查询患者信息接口",params.toString());
    

    /**
     * @description: 请求方法
     * @param: method 请求方法
     * @param: params 入参字符串
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     * @author 周培武
     * @date: 2022/10/24 14:23
     */
    private static Map<String, Object> request(String method, String params)
        String result = "";
        String requestId = UUID.randomUUID().toString();
        try
            String url = "http://localhost:8080/xxxxxx/services/xxxxServiceImpl.cls?CfgItem="+method;
            SoapClient client = SoapClient.create(url)
                    .header("SOAPAction","http://baidu.com/BS.XmlService.Send")
                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间
                    .setMethod("bjg:Send", "http://baidu.com")
                    .setParam("pInput",params,true);

            log.info("[请求ID:]CSDN请求方法字符串接口:,入参:",requestId,url,client.getMsgStr(true));
            // 发送请求,参数true表示返回一个格式化后的XML内容
            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应
            result = client.send(false);
            log.info("[请求ID:]CSDN请求方法字符串出参:",requestId,result);
            if(result.contains("<![CDATA["))
                result = result.substring(result.indexOf("<![CDATA[")+9,result.indexOf("]]>"));
            else
                result = result.substring(result.indexOf("Result>")+7,result.indexOf("</")+1);
            
            Map<String, Object> resultMap = XmlUtil.xmlToMap(result);
            return resultMap;
        catch (Exception ex)
            log.error("[请求ID:]CSDN请求方法字符串出现异常,接口:,入参:,出参:,",requestId,method,params,result,ex);
            throw ex;
        
    

4.多命名空间

请求数据:

接口地址:http://localhost:8080/xxxxxx/services/xxxxServiceImpl.cls
请求头:SOAPAction: "http://tempuri.org/ITJTCService/SubmitReservationExam"
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:ly="http://schemas.datacontract.org/2004/07/LY.WebService.Service.Models">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <tem:SubmitReservationExam xmlns:tem="http://tempuri.org/">
      <tem:info>
        <ly:CardNo>111111111111</ly:CardNo>
      </tem:info>
    </tem:SubmitReservationExam>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

请求示例:

private static Map<String, Object> request(String params) throws SOAPException 
        String result = "";
        String requestId = UUID.randomUUID().toString();
        try
            //新建客户端
            String url = "http://localhost:8080/xxxxxx/services/xxxxServiceImpl";
            SoapClient client = SoapClient.create(url)
                    .header("SOAPAction","http://tempuri.org/ITJTCService/SubmitReservationExam")
                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间
                    .setMethod("tem:SubmitReservationExam","http://tempuri.org/");
            //修改一级和二级前缀为tem
            SOAPBodyElement soapBodyElement = client.getMethodEle();
            soapBodyElement.getParentElement().getParentElement().addNamespaceDeclaration("tem","http://tempuri.org/").addNamespaceDeclaration("ly","http://schemas.datacontract.org/2004/07/LY.WebService.Service.Models");
            SOAPElement soapElement = soapBodyElement.addChildElement(new QName("http://tempuri.org/","info","tem"));
            soapElement.addChildElement("CardNo","ly").setValue("111111111111111111");

            log.info("[请求ID:]CSDN测试方法字符串接口:,入参:",requestId,url,client.getMsgStr(true));
            // 发送请求,参数true表示返回一个格式化后的XML内容
            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应
            result = client.send(false);
            log.info("[请求ID:]CSDN测试方法字符串出参:",requestId,result);
            if(result.contains("<![CDATA["))
                result = result.substring(result.indexOf("<![CDATA[")+9,result.indexOf("]]>"));
            else
                result = result.substring(result.indexOf("Result>")+7,result.indexOf("</")+1);
            
            Map<String, Object> resultMap = XmlUtil.xmlToMap(result);
            return resultMap;
        catch (Exception ex)
            log.error("[请求ID:]CSDN请求方法字符串出现异常,入参:,出参:,",requestId,params,result);
            throw ex;
        
    

此入参类型方法特别难调用,之前反馈过hutool,hutool暂不打算深入优化,我这边提供的解决方案hutool推荐使用。


总结

其实大部分入参类型都包含在这里面了,如果还有新的,无法使用的可以将wsdl页面右键查看源文件把html代码发给我,我这边研究下,有啥问题也欢迎在下面提问,我这边看见就会回答的。

SpringBoot发布webservice服务并调用(hutool yyds)

作者:故事我忘了
个人微信公众号:程序猿的月光宝盒

前言

​ 最近公司接的项目需要对接第三方服务,这个服务商是用的WebService开的接口提供调用

​ 因为是内网项目,所以内网映射外网的服务器还没提供过来,所以为了自己以后不加班(这是真实存在的吗?自我安慰叭),所以自己写了个springboot服务发布WS服务,放到服务器上练练手

​ 上一篇博客(《pringBoot打包到docker(idea+传统方式)》)其实是这篇博客之后的事儿

​ 本来昨天就得写的,奈何家里的电脑,只能打游戏,昨天想写,发现连Typora都没有.别说图床,git了,写个钩叭~

另外,蒸汽厂打折了啊,还不买吗

开干

1.涉及技术点

​ SpringBoot+Webservice+Hutool(主要做一个调用WS的SoapClient)

上一张尴图先

都说Hutool用的越早,下班越早,但是不排除我不会用导致的加班

2.整体项目结构

3.Provider 发布Ws服务端

首先,肯定要修改pom文件

依赖加上
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 小辣椒,简化代码 -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <!--发布ws需要用到的依赖-->
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-frontend-jaxws</artifactId>
      <version>3.4.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-transports-http</artifactId>
      <version>3.4.5</version>
    </dependency>
    
    <!-- hutool 的包   -->
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.7.14</version>
    </dependency>
  </dependencies>

3.0 因为用对象的形式反参,所以建个对象

UserLoginVO

package com.jinsc.provider.vo;

import lombok.Data;

import java.io.Serializable;

/**
 * 用户登录VO
 *
 * @author 金聖聰
 * @version v1.0
 * @email jinshengcong@163.com
 * @since Created in 2021/10/21 23:28
 */
@Data
public class UserLoginVO implements Serializable {
    private static final long serialVersionUID = 2673128718180426817L;
    private Integer errorCode;
    private String errMsg;
    private String name;

    public UserLoginVO() {
    }

    public UserLoginVO(Integer errorCode, String errMsg, String name) {
        this.errorCode = errorCode;
        this.errMsg = errMsg;
        this.name = name;
    }
}

3.1 首先写一个service,正常写就完事了,唯一不同的就是注解这块用WS的注解

LoginService

package com.jinsc.provider.service;

import com.jinsc.provider.vo.UserLoginVO;

import javax.jws.WebParam;
import javax.jws.WebService;

/**
 * ws的登录接口
 *
 * @author 金聖聰
 * @version v1.0
 * @email jinshengcong@163.com
 * @since Created in 2021/10/21 11:01
 */
@WebService(name = "LoginService", //暴露服务名称
        targetNamespace = "http://jinsc.com" //空间名称
)
public interface LoginService {
    UserLoginVO userLogin(@WebParam(name = "name") String name);
}

3.2 写他的实现类

LoginServiceImpl

package com.jinsc.provider.service.impl;

import com.jinsc.provider.service.LoginService;
import com.jinsc.provider.vo.UserLoginVO;
import org.springframework.stereotype.Service;

import javax.jws.WebParam;
import javax.jws.WebService;

/**
 * ws的登录接口实现类
 *
 * @author 金聖聰
 * @version v1.0
 * @email jinshengcong@163.com
 * @since Created in 2021/10/21 11:05
 */
@WebService(serviceName = "LoginService", // 与接口中的name保持一致
        targetNamespace = "http://jinsc.com", // 与接口中的name保持一致
        endpointInterface = "com.jinsc.provider.service.LoginService" // 接口包路径
)
// 用于配置类自动注入
@Service
public class LoginServiceImpl implements LoginService {
    @Override
    public UserLoginVO userLogin(@WebParam(name = "name") String name) {
        return new UserLoginVO(500, "登录失败~~", name);
    }


}

3.3 写WS的Cxf配置类

CxfConfig

package com.jinsc.provider.config;

import com.jinsc.provider.service.LoginService;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import javax.xml.ws.Endpoint;

/**
 * ws的配置类
 *
 * @author 金聖聰
 * @version v1.0
 * @email jinshengcong@163.com
 * @since Created in 2021/10/21 11:14
 */
@Configuration
public class CxfConfig {
    @Resource
    private LoginService loginService;

    /**
     * 用于注册CXFServlet的
     * 地址/webservice/*
     * * 通配符 更上接口地址
     *
     * @return org.springframework.boot.web.servlet.ServletRegistrationBean<org.apache.cxf.transport.servlet.CXFServlet>
     * @author 金聖聰
     * @email jinshengcong@163.com
     * Modification History:
     * Date         Author        Description        version
     * --------------------------------------------------------*
     * 2021/10/21 11:25    金聖聰     修改原因            1.0
     */
    @Bean
    public ServletRegistrationBean<CXFServlet> dispatcherServlet2() {
        // 这里就是发布服务的跟路径,后面 * 是通配符,表示跟什么都行
        return new ServletRegistrationBean<>(new CXFServlet(), "/webservice/*");
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    @Bean
    public Endpoint endpoint() {
        // 建立一个端点 ,第一个参数是 springBus 对象,第二个参数是刚才的接口实现类(因为在实现类中用了@service,所以这里可以自动注入)
        // PS: 要是有多个service,这个方法对象多写几个就行
        EndpointImpl endpoint = new EndpointImpl(springBus(), loginService);
        // 这里就是发布的这个接口的地址
        endpoint.publish("/loginApi");
        return endpoint;
    }
}

这样,这个WS就可以发布了

地址是

ip:端口/webservice/loginApi?wsdl

本机启动就是

http://localhost:8080/webservice/loginApi?wsdl

以上,发布成功

4.consumer 调用Ws端所以我称之为消费端

同样,给上pom依赖

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 小辣椒简化代码   -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <!-- hutool的包   -->
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.7.14</version>
    </dependency>
  </dependencies>

4.0 因为用对象形式解析参数所以创建对象

UserLoginDto

package com.jinsc.consumer.dto;

import lombok.Data;

import java.io.Serializable;

/**
 * 用户登录Dto
 *
 * @author 金聖聰
 * @version v1.0
 * @email jinshengcong@163.com
 * @since Created in 2021/10/21 23:36
 */
@Data
public class UserLoginDto implements Serializable {
    private static final long serialVersionUID = 1292974846576856351L;
    private String errMsg;
    private String name;
    private String errorCode;
}

4.1 创建个客户端去调用ws服务就ojbk了啊

不过在此之前,我们用SoapUI去解析下刚才的ws地址

由上,我们可以得到

命名空间: http://jinsc.com

方法名 : jin:userLogin

入参: name

所以我们可以创建SoapClient

TestWsConnect

package com.jinsc.consumer.client;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.XmlUtil;
import cn.hutool.http.webservice.SoapClient;
import com.jinsc.consumer.dto.UserLoginDto;
import org.w3c.dom.Document;

import javax.xml.xpath.XPathConstants;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 测试ws连接
 *
 * @author 金聖聰
 * @version v1.0
 * @email jinshengcong@163.com
 * @since Created in 2021/10/21 23:35
 */
public class TestWsConnect {
    public static void main(String[] args) {
        // 新建客户端
        SoapClient client = SoapClient.create("http://localhost:8080/webservice/loginApi?wsdl")
        // SoapClient client = SoapClient.create("http://服务器端口地址/webservice/loginApi?wsdl")
                // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间
                .setMethod("jin:userLogin", "http://jinsc.com")
            	// 设置参数,此处自动添加方法的前缀:jin
            	// false的意思就是没有前缀
                .setParam("name", "jinshengcong3080ti", false);
        

        // 发送请求,参数true表示返回一个格式化后的XML内容
        // 返回内容为XML字符串,可以配合XmlUtil解析这个响应
        String send = client.send(true);
        Console.log(send);
        // 把send返回的xml内容转换成document对象
        Document document = XmlUtil.parseXml(send);
        List<String> nameList = Arrays.asList("errMsg", "errorCode", "name");
        HashMap<String, String> resultMap = new HashMap<>();
        nameList.forEach(e -> {
            // 循环上面的nameList列表,每个元素都是return后面的标签,得标签里面的值
            String result = (String) XmlUtil.getByXPath("//return/" + e, document, XPathConstants.STRING);
            // 然后给结果map赋值,key是name,value是标签中的值
            resultMap.put(e, result);
        });
        // 得到结果map
        Console.log(resultMap);
        // map转Dto,其中属性要一致
        UserLoginDto convert = Convert.convert(UserLoginDto.class, resultMap);
        Console.log(convert);

    }
}

这样就可以了

运行一下康康~

好了,ojbk

以上是关于Java使用Hutool调用WebService接口详解的主要内容,如果未能解决你的问题,请参考以下文章

java如何在sqlserver触发器里面调用webservice接口

如何在Dynamic CRM 2013中创建WebService接口供其它系统调用

java之wsdl自动生成WebService客户端

java怎么使用axis调用webservice

如何在Dynamic CRM 2013中创建WebService接口供其它系统调用

使用axis调用WebService,Java WebService调用工具类