java解析通过Soap方式调用WebService接口返回的数据,并映射到对应的实体最终入库

需求:过Soap方式调用WebService接口返回的xml字符串,客户要求将返回回来的信息入库,最终在web端展示。
思路:1创建对应的实体类,目的是将返回回来的信息中将有用的信息映射到实体类中,实体类的属性应和xml中有用的信息字段保持一致;2:使用RestTemplate发送请求,设置请求头参数以及对应的WebService接口地址,请求数据;3使用dom4j解析返回回来的xml字符串;4实现入库操作。
具体实现:
1创建实体类

/**
 * @Description: saop映射实体类
 * @Title: XxVo
 * @Package com.example.entity
 * @Author: ytsj
 * @CreateTime: 2023/1/16 16:43
 */
@Data
public class XxVo{
        private String asd;
        private String dfd;
        private String gfg;
        private String hgg;
}

2:使用RestTemplate发送请求获取接口返回的数据,注意请求头的参数和接口需要的参数一致,接口需要哪些参数就传哪些,我这里接口还需要额外传递用户名和密码

   @GetMapping("/getXmlData")
    public ResultEntity getXmlData() throws Exception {
        String url = " ";// WebService接口地址
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType("text/xml;charset=utf-8"); // 设置Content-Type
        headers.add("Accept-Encoding", "gzip, deflate, br");//设置Accept-Encoding
        // 请求头需要传递用户名和密码
        headers.add("password", "");
        headers.add("username", "");
        //这里是发生请求时body中的raw类型为xml的参数,使用StringBuffer进行拼接
        StringBuffer xmlParam = new StringBuffer();
        xmlParam.append(""); 
        //请求体
        HttpEntity<String> formEntity = new HttpEntity<>(xmlParam.toString(), headers);
        //发送数据方法
        ResponseEntity<String> forEntity = restTemplate.postForEntity(url, formEntity, String.class);
        //得到返回的数据body
        String jsonData = forEntity.getBody();
        //组织返回的数据
        List<XxVo>  vos = getChildResult(jsonData);
        return ResultEntity.ok(vos);
    }

body中raw的类型为xml
在这里插入图片描述
返回的数据
在这里插入图片描述

3:解析返回的数据

 /**
     * @description 通过递归调用组织的数据
     * @methodName getChildResult
     * @param [jsonData]
     * @return java.util.List<com.example.XxVo>
     * @date: 2023/1/18 11:17
     * @author ytsj
     */
    public static List<XxVo> getChildResult(String jsonData) throws UnsupportedEncodingException, DocumentException, InstantiationException, IllegalAccessException, NoSuchMethodException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new ByteArrayInputStream(jsonData.getBytes("UTF-8")));
        XxVo vo = new XxVo();
        Element rootElement = document.getRootElement();// 根节点
        List arrayList = new ArrayList<>();
        List<XxVo> childElement = getChildElement(rootElement, XxVo.class, vo , arrayList);
        return childElement;
    }

    /**
     * @param [elem, clazz, t, list]
     * @return java.util.List<T>
     * @description 递归遍历子节点
     * @methodName getChildElement
     * @date: 2023/1/18 10:09
     * @author ytsj
     */
    private static <T> List<T> getChildElement(Element elem, Class clazz, T t, List<T> list) throws InstantiationException, IllegalAccessException, NoSuchMethodException {
        List<Element> elems = elem.elements();
        for (Element ele : elems) {
            if (ele.getName().equals("item")) {
                List<Element> content = ele.content();
                t = (T) clazz.newInstance();
                for (Element element : content) {
                    // 通过反射获取该类的所有属性
                    Field[] fields = clazz.getDeclaredFields();
                    for (int x = 0; x < fields.length; x++) {
                        Field field = fields[x]; //获取该类的属性
                        if (field.getName().equals(element.getName())) {
                            field.setAccessible(true); // 设置属性可访问的
                            field.set(t, element.getText());
                            break;
                        }
                    }
                    list.add(t);
                }
            }
            if (ele.elements().size() > 0) { // 说明还存在子节点,继续遍历
                getChildElement(ele, clazz, t, list);
            }
        }
        return list;
    }

还有一种方式,是在上面的方法基础上有一丢丢改变,可能理解起来会更好些,我个人也这么认为的。哈哈~


    /**
     * @return java.util.List<com.example.XxVo>
     * @description 递归调用
     * @methodName getChildResult
     * @date: 2023/1/17 16:07
     * @author ytsj
     */
    public List<XxVo> getChildResult(String xmlStr) {
        SAXReader sax = new SAXReader();
        List<XxVo> xxVos= new ArrayList<>();
        try {
            Document doc = sax.read(new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8)));
            Element root = doc.getRootElement();
            //递归遍历节点
            searchDoc(root, xxVos);
            return xxVos;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 递归获取xml文件信息
     *
     * @param elem
     * @param <T>
     */
    private <T> void searchDoc(Element elem, List<XxVo> vos) {
        List<Element> elems = elem.elements();
        for (Element ele : elems) {
            if (ele.getName().equals("item")) {
                try {
                    // 创建一个新类
                    XxVo  vo = new XxVo();
                    // 获取该类的所有属性
                    Field[] fields = XxVo.class.getDeclaredFields();
                    List<Element> content = ele.content();
                    for (Element element : content) {
                        for (int i = 0; i < fields.length; i++) {
                            Field field = fields[i];
                            if (field.getName().equals(element.getName())) {
                                field.setAccessible(true);
                                field.set(vo , element.getText());
                                break;
                            }
                        }
                    }
                    vos.add(vo);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            if (ele.elements().size() > 0) {
                searchDoc(ele, vos);
            }
        }
    }

解析出来的数据
在这里插入图片描述
然后就是将解析出来的数据入库就还好了。入库的操作就就是写一个新增方法,批量insert就好了。
这就是我对这个需求的具体实现,大家有更好的方法欢迎踊跃分享~。
以上描述有误的地方欢迎大家指正,有问题可加v 876942434.

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java可以通过SOAP协议调用Web Service接口。具体步骤如下: 1. 创建一个SOAP消息请求体,包括SOAP消息头和SOAP消息体。 2. 创建一个SOAP连接对象,并设置连接的URL地址。 3. 发送SOAP消息请求,等待Web Service接口返回SOAP消息响应。 4. 解析SOAP消息响应,获取需要的数据。 5. 关闭SOAP连接对象。 需要注意的是,调用Web Service接口需要提供接口的WSDL文件,以便生成客户端代码。可以使用Java自带的wsimport工具生成客户端代码,也可以使用第三方工具如Apache CXF等。 另外,调用Web Service接口时需要注意SOAP消息的格式和命名空间等问题,以确保请求和响应能够正确解析。 ### 回答2: Java是一门广泛应用于开发Web应用程序的高级编程语言。它是一门面向对象的语言,具备简单易学、可移植性强、安全性高等特点,被广泛地应用于各种软件开发领域中。Java调用WebService接口,是现在Web开发中非常重要的技术之一。 WebService(简称WS)是基于Web的远程调用协议,用于服务提供者和服务消费者之间的互操作。它是一种跨平台、跨语言的通信方式,其中SOAP(简单对象访问协议)是一种常用的WebService交互协议。Java可以通过SOAP调用WebService接口服务。 Java中使用SOAP调用WebService接口的步骤如下: 1.编写WebService客户端代码 Java提供了访问WebService接口服务的类:javax.xml.soap.SOAPConnection和javax.xml.soap.SOAPConnectionFactory。我们可以通过下面的代码获取SOAPConnection: ``` SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = factory.createConnection(); ``` 2.创建SOAP请求 在SOAP请求中,我们需要设置相关的参数,包括:SOAP消息的版本、SOAP请求消息体、SOAP请求头等。下面是创建请求消息的代码示例: ``` //初始化一个SOAP消息 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); SOAPMessage soapMessage = messageFactory.createMessage(); //创建SOAP报文头 SOAPHeader soapHeader = soapMessage.getSOAPHeader(); SOAPBody soapBody = soapMessage.getSOAPBody(); ``` 3.设置SOAP请求参数 在请求中,需要设置相关参数,包括EndPoint地址、SOAPAction、参数值等。下面是设置请求参数的代码示例: ``` //设置WebService的请求地址 URL url= new URL("http://www.example.com/WebService"); //创建一个SOAP消息并设置Header和Body SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); SOAPHeader soapHeader = soapMessage.getSOAPHeader(); SOAPBody soapBody = soapMessage.getSOAPBody(); //设置要调用WebService方法名 String methodName = "getWebServiceResult"; //设置SoapAction String soapAction = "http://www.example.com/WebService/getWebServiceResult"; soapMessage.getMimeHeaders().addHeader("SOAPAction", soapAction); //调用WebService SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = factory.createConnection(); SOAPMessage response = connection.call(soapMessage, url); ``` 4.解析SOAP响应 在获取WebService接口服务的结果后,我们需要对SOAP响应进行解析。下面是解析SOAP响应的代码示例: ``` //解析响应数据 SOAPBody soapBody = response.getSOAPBody(); NodeList nodeList = soapBody.getElementsByTagName("return"); String responseStr = nodeList.item(0).getTextContent();//获取返回值 ``` 综上所述,Java调用WebService接口SOAP的过程包括了编写WebService客户端代码、创建SOAP请求、设置SOAP请求参数及解析SOAP响应等步骤。这些步骤的实现可以帮助我们更好地调用WebService接口,并获取接口的响应结果。 ### 回答3: Java 语言作为一种广泛应用于企业级应用的编程语言,自然对接webservice等网络接口是其常见的应用场景之一。在Java中,调用webservice接口有多种方法,其中最常用的是使用soap协议来调用webservice接口soap协议即简单对象访问协议,是一种基于XML的协议,用于将网络上的消息传递给远程执行的程序。使用soap协议调用webservice接口可以实现跨平台、跨语言、跨网络的消息传递,是一种比较常用的通信方式。 在Java中,调用webservice接口需要使用Java API for XML Web Services(JAX-WS)技术。JAX-WS是一种Java EE标准,提供了一套API,支持Java应用与webservice接口之间的通信。以下是调用webservice接口的步骤: 1. 创建一个JAX-WS客户端工程(Client Project),该工程用于调用webservice接口。可以在Eclipse、IntelliJ IDEA等IDE中创建该工程。 2. 在工程中创建一个webservice客户端代理(Web Service Client Proxy),用于调用webservice接口。可以使用Eclipse这类IDE中提供的WSDL文件生成工具(例如wsimport)来生成webservice客户端代理。 3. 使用生成的webservice客户端代理来调用webservice接口。在Java中,使用webservice客户端代理对象调用webservice接口的过程类似于使用Java接口调用远程程序,可以通过SOAPMessage传输请求和响应信息,完成与webservice接口进行交互的过程。 需要注意的是,在调用webservice接口时,需要提供webservice接口的URL、命名空间(Namespace)、操作名称(Operation)等信息。另外,我们还可以为webservice接口提供请求头信息(Header)和请求参数(Parameter),以便webservice端正确地处理请求。 总之,通过Java调用webservice接口,在很多应用中都是必不可少的一步,特别是在企业级应用中更是如此。因此,我们需要深入理解soap协议和JAX-WS技术的原理和应用,才能在实际开发中进行合理的使用和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值