Java调用参数为xml格式的接口,分析转换返回结果

这篇具有很好参考价值的文章主要介绍了Java调用参数为xml格式的接口,分析转换返回结果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

最近第一次接触到xml格式的接口,以下是自己编写的经验,铁汁们可以参考自己的项目自行修改。
完整代码已附在文章末尾,如有缺陷,欢迎评论区或私信交流。

解决思路

首先向接口提供方申请了接口文档,包含了接口地址和参数信息,先使用postman工具调用接口,分析参数和返回值。

调通接口

敏感数据,打码请见谅
java xml格式传参,java,xml,servlet
其中,传入参数为xml文本,参数在最中间,可以通过字符串拼接,来实现对参数的修改。

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <soap12:Body>
        <GetDataRtnJsonObject xmlns="http://tempuri.org/">
            <参数一>张三</参数一>
            <参数二>某单位</参数二>
            <参数三>接口授权码</参数三>
            <参数四>是否仅查询增量数据</参数四>
            <piPageIndex>页码</piPageIndex>
            <piPageSize>页行数</piPageSize>
        </GetDataRtnJsonObject>
    </soap12:Body>
</soap12:Envelope>

返回参数也为xml文本,返回结果也在最中间,可以直接通过字符串截取,再使用JSONObject.parseObject() 将json格式文本转为需要的数据结构。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetDataRtnJsonObjectResponse xmlns="http://tempuri.org/">
            <GetDataRtnJsonObjectResult>
            { 
              "DataCount":2,
              "PageCount":64,
              "Datas":[
                        {"ROWID":1,"ORGCODE":"001"},
                        {"ROWID":2,"ORGCODE":"002"}
               ],
              "ErrMsg":""
              }
              </GetDataRtnJsonObjectResult>
        </GetDataRtnJsonObjectResponse>
    </soap:Body>
</soap:Envelope>

代码编写

吆西,分析完输入参数和返回参数后,解决思路自然就有了。
1、接口的输入参数虽然复杂,且为xml格式,但每次仅需要更改最中间的几个参数即可。
可以编写公共方法,将查询的几个变量塞入xml文本中指定位置,组装成完整xml请求代码块。
注意:在此的输入参数为ABCD等,仅仅为了示例,铁汁们编写代码时要使用英文驼峰命名的变量名,不然以后自己都要看不懂啦QAQ

	/**
     * @Description 将请求参数,组合为XML格式
     * @Date 17:01 2023/4/27
     * @Param [A, B, C, D, page, pageSize]
     * @return java.lang.String
     **/
    private static String getXmlInfo(String A,String B,String C,int D,int page,int pageSize) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        stringBuilder.append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
                "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">");
        stringBuilder.append("    <soap12:Body>");
        stringBuilder.append("        <GetDataRtnJsonObject xmlns=\"http://tempuri.org/\">");
        stringBuilder.append("            <参数一>"+A+"</参数一>");
        stringBuilder.append("            <参数二>"+B+"</参数二>");
        stringBuilder.append("            <参数三>"+C+"</参数三>");
        stringBuilder.append("            <参数四>"+D+"</参数四>");
        stringBuilder.append("            <页码>"+page+"</页码>");
        stringBuilder.append("            <页行数>"+pageSize+"</页行数>");
        stringBuilder.append("        </GetDataRtnJsonObject>");
        stringBuilder.append("    </soap12:Body>");
        stringBuilder.append("</soap12:Envelope>");
        return stringBuilder.toString();
    }

2、观察返回参数,发现对我们有用的内容,只有中间被<GetDataRtnJsonObjectResult></GetDataRtnJsonObjectResult>包起来的数据,使用substring()截取出来就好啦

// 默认此时已经接收到返回值,接口的返回值用StringBuffer类型的变量resultStringBuffer存储
int beginIndex = resultStringBuffer.indexOf("<GetDataRtnJsonObjectResult>") + 28;
int endIndex = resultStringBuffer.lastIndexOf("</GetDataRtnJsonObjectResult>");
String jsonString = resultStringBuffer.toString().substring(beginIndex,endIndex);
JSONObject result = JSONObject.parseObject(jsonString);
JSONArray jsonArray = result.getJSONArray("Datas");
// 取出来的jsonArray可以使用JSONObject.parseArray()来转换为List<Map>格式
// 其中Map.class可以更改为自己项目中的实体类
// List<Map> list = JSONObject.parseArray(jsonArray.toString(),Map.class);

3、编写Java工具类,实现调用接口,并把之前的xml组装方法和解析方法,结合起来。

	/**
     * @Description 获取XML接口数据,并解析XML为jsonObject
     * @Date 16:57 2023/4/27
     * @Param [A, B, C, D, page, pageSize]
     * @return com.alibaba.fastjson.JSONObject
     **/
    public static JSONArray creatPostAndTransData(String A, String B, String C, int D, int page, int pageSize) {
        //todo 可改为从配置文件获取,或者每次都从参数中传过来,因为我的项目中url不变,所以写死在这里
        String url = "http://xxx.xxx.xxx.xxx/base/service";
        String line = "";
        // 用来存储接收到的返回值,铁汁们可以考虑下为什么用StringBuffer而不是普通的String  ^.^
        StringBuffer resultStringBuffer = new StringBuffer();
        OutputStreamWriter out = null;
        try {
        	// 根据url连接接口
            URL realUrl = new URL(url);
            URLConnection urlConnection = realUrl.openConnection();
            // 根据需要,将传来的接口参数组装为xml文本
            String xmlInfo = getXmlInfo(psAppCode,psYwxtbh,psZdbh,piFw,piPageIndex,piPageSize);
            byte[] xmlInfoBytes = xmlInfo.getBytes();
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);
            urlConnection.setUseCaches(false);
            urlConnection.setRequestProperty("Content-Type","application/soap+xml; charset=utf-8");
            urlConnection.setRequestProperty("Content-length",String.valueOf(xmlInfoBytes.length));
            out = new OutputStreamWriter(urlConnection.getOutputStream());
            out.write(new String(xmlInfo.getBytes(StandardCharsets.ISO_8859_1)));
            out.flush();
            out.close();
            // 开始接收返回值
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            for (line = bufferedReader.readLine(); line != null;line = bufferedReader.readLine()) {
                resultStringBuffer.append(line);
            }
            // 从返回的文本中,截取出我们需要的内容
            int beginIndex = resultStringBuffer.indexOf("<GetDataRtnJsonObjectResult>") + 28;
            int endIndex = resultStringBuffer.lastIndexOf("</GetDataRtnJsonObjectResult>");
            String jsonString = resultStringBuffer.toString().substring(beginIndex,endIndex);
            JSONObject result = JSONObject.parseObject(jsonString);
            JSONArray jsonArray = result.getJSONArray("Datas");
            // List<Map> list = JSONObject.parseArray(jsonArray.toString(),Map.class);
            return jsonArray;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

完成喽,现在可以根据自己需要,对返回的数据进行处理啦。

完整代码

	// 可自己编写main方法测试
	public static void main(String[] args) {
        JSONArray jsonArray = creatPostAndTransData("张三","某单位","*******",0,1,10);
        List<Map> list = JSONObject.parseArray(jsonArray.toString(),Map.class);
        System.out.println(list);
    }

	/**
     * @Description 获取XML接口数据,并解析XML为jsonObject
     * @Date 16:57 2023/4/27
     * @Param [A, B, C, D, page, pageSize]
     * @return com.alibaba.fastjson.JSONObject
     **/
    public static JSONArray creatPostAndTransData(String A, String B, String C, int D, int page, int pageSize) {
        //todo 可改为从配置文件获取,或者每次都从参数中传过来,因为我的项目中url不变,所以写死在这里
        String url = "http://xxx.xxx.xxx.xxx/base/service";
        String line = "";
        // 用来存储接收到的返回值,铁汁们可以考虑下为什么用StringBuffer而不是普通的String  ^.^
        StringBuffer resultStringBuffer = new StringBuffer();
        OutputStreamWriter out = null;
        try {
        	// 根据url连接接口
            URL realUrl = new URL(url);
            URLConnection urlConnection = realUrl.openConnection();
            // 根据需要,将传来的接口参数组装为xml文本
            String xmlInfo = getXmlInfo(psAppCode,psYwxtbh,psZdbh,piFw,piPageIndex,piPageSize);
            byte[] xmlInfoBytes = xmlInfo.getBytes();
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);
            urlConnection.setUseCaches(false);
            urlConnection.setRequestProperty("Content-Type","application/soap+xml; charset=utf-8");
            urlConnection.setRequestProperty("Content-length",String.valueOf(xmlInfoBytes.length));
            out = new OutputStreamWriter(urlConnection.getOutputStream());
            out.write(new String(xmlInfo.getBytes(StandardCharsets.ISO_8859_1)));
            out.flush();
            out.close();
            // 开始接收返回值
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            for (line = bufferedReader.readLine(); line != null;line = bufferedReader.readLine()) {
                resultStringBuffer.append(line);
            }
            // 从返回的文本中,截取出我们需要的内容
            int beginIndex = resultStringBuffer.indexOf("<GetDataRtnJsonObjectResult>") + 28;
            int endIndex = resultStringBuffer.lastIndexOf("</GetDataRtnJsonObjectResult>");
            String jsonString = resultStringBuffer.toString().substring(beginIndex,endIndex);
            JSONObject result = JSONObject.parseObject(jsonString);
            JSONArray jsonArray = result.getJSONArray("Datas");
            // List<Map> list = JSONObject.parseArray(jsonArray.toString(),Map.class);
            return jsonArray;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
	/**
     * @Description 将请求参数,组合为XML格式
     * @Date 17:01 2023/4/27
     * @Param [A, B, C, D, page, pageSize]
     * @return java.lang.String
     **/
    private static String getXmlInfo(String A,String B,String C,int D,int page,int pageSize) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        stringBuilder.append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
                "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">");
        stringBuilder.append("    <soap12:Body>");
        stringBuilder.append("        <GetDataRtnJsonObject xmlns=\"http://tempuri.org/\">");
        stringBuilder.append("            <参数一>"+A+"</参数一>");
        stringBuilder.append("            <参数二>"+B+"</参数二>");
        stringBuilder.append("            <参数三>"+C+"</参数三>");
        stringBuilder.append("            <参数四>"+D+"</参数四>");
        stringBuilder.append("            <页码>"+page+"</页码>");
        stringBuilder.append("            <页行数>"+pageSize+"</页行数>");
        stringBuilder.append("        </GetDataRtnJsonObject>");
        stringBuilder.append("    </soap12:Body>");
        stringBuilder.append("</soap12:Envelope>");
        return stringBuilder.toString();
    }

好耶,完工下班!文章来源地址https://www.toymoban.com/news/detail-684626.html

到了这里,关于Java调用参数为xml格式的接口,分析转换返回结果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java调用接口返回乱码问题

    调用第三方接口。 当调用第三方接口时,存入数据库中的数据正常,打印的数据乱码,在header中加入charset=UTF-8即可。 此处用到了hutool的依赖: 示例代码: 第三方调用接口。 当第三方调用咱们的接口时,可能会出现返回信息中文乱码的情况,我们在自己的方法的注解上加

    2024年02月11日
    浏览(38)
  • java发送https请求以及解析调用接口返回来的数据信息

    一、返回的Json数据信息格式 二、解析 引用的是 判断如果code为200则证明数据返回成功,然后获取data中的value数据。 获取data数据 这样就可以获取data中的数据了。 如果想要将data中的数据变成集合 就可以啦 三、发送https请求

    2024年02月19日
    浏览(40)
  • java springboot 整合webSocket接入调用chatGPT3.5接口实现自由返回

    java springboot 中使用webSocket接入openAI接口调用chatGPT3.5接口实现自由返回 @Component @Anonymous @ServerEndpoint(“/websocket/{id}”) // 访问路径: ws://localhost:8080/websocket public class WebSocketServer { // try { // sendMessage(“WebSocket连接成功”); // } catch (Exception e) { // // } } /** * 发送消息 * @param message 要

    2024年02月14日
    浏览(59)
  • 【SpringBoot 后台接收XML类型参数和返回XML类型参数】

    记录一下接收xml参数的坑 简单类型xml 1.使用@XmlRootElement注解指定根元素名称,不指定默认使用类名和属性名(小写),可以使用name属性指定 根元素和子元素的标签名 2.在controller 使用@RequestBody 接收请求参数 3.返回xml报文 在@xxxMapping中添加属性produces = MediaType.APPLICATION_XML_VALUE,即可

    2024年02月16日
    浏览(40)
  • Java feign接口调用后返回子类,序列化子类反序列化只得到父类

    需要修改序列化方法 我存的时候放的子类,接收到却是只有父类的数据 feign默认使用jackson进行序列化,需要在父类上加上注解 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 在父类头上增加注解: https://blog.csdn.net/qq_39493105/article/details/126061848

    2024年02月14日
    浏览(43)
  • 微信小程序解析webservice返回的xml格式数据

    默认情况下微信小程序不是npm所管理的,所以第一步我们需要将其变成npm管理的项目 项目根目录下输入命令 npm init ,此时会出现一些基本信息的填写(当然直接回车使用默认项也可以)成功后项目根目录下会出现package.json文件,如图: 项目根目录输入命令 npm install xmldom 安

    2024年02月09日
    浏览(40)
  • 【Golang 接口自动化03】 解析接口返回XML

    目录 解析接口返回数据 定义结构体 解析函数: 测试 优化 资料获取方法 上一篇我们学习了怎么发送各种数据类型的http请求,这一篇我们来介绍怎么来解析接口返回的XML的数据。 定义结构体 假设我们现在有一个接口返回的数据 resp 如下: 要解析这个数据,首先我们要定义

    2024年02月14日
    浏览(41)
  • C# XML格式转换字典

    public static Dictionarystring, string GetXmlStr(string xmlStr)   //获取 xml 字符串 转字典         {             Dictionarystring, string kv = new Dictionarystring, string();             XmlDocument x = new XmlDocument();             x.LoadXml(xmlStr); //传入xml字符串               //x.Load()

    2024年02月10日
    浏览(31)
  • restTemplate调用外部接口,调用返回307,用postman直接调用接口正常返回数据

    restTemplate调用外部接口,调用返回307,用postman直接调用接口正常返回数据 结论:调用的接口路径后加/ postman 关掉自动重定向(filesettins把Automatically follow redirects关掉),调用也同样返回307了 在网上各种搜307,出来的结果都是什么重定向 getHeaders().getLocation().toString() 获得返回

    2024年02月03日
    浏览(50)
  • 【加强版】SAX解析XML返回对应格式的Map对象(解决元素递归嵌套)

    SAX解析XML返回对应格式的Map对象_辛丑年正月十五的博客-CSDN博客        上篇文章实现了xml元素节点的解析并返回了对应格式的Map对象,但是遗留了一个问题,就是当xml中的元素存在递归嵌套时就解析不了,因为qname属性会重复,导致后一个元素会覆盖前一个元素。     

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包