java发送soap请求和解析soap的响应

这篇具有很好参考价值的文章主要介绍了java发送soap请求和解析soap的响应。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.soap请求报文

<s:Envelope
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <GetPoints xmlns="http://tempuri.org/">
            <kunkun xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            	<!-- 下面是需要传的四个参数 -->
                <d4p1:string>chang</d4p1:string>  
                <d4p1:string>tiao</d4p1:string>  
                <d4p1:string>rap</d4p1:string>  
                <d4p1:string>basketball</d4p1:string>                
            </kunkun>
        </GetPoints>
    </s:Body>
</s:Envelope>

二.soap响应报文

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <GetPointsResponse xmlns="http://tempuri.org/">
            <GetPointsResult xmlns:a="http://schemas.datacontract.org/2004/07/XDB.DataServiceInterface" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <a:Data>
                    <a:Name>张三</a:Name>
                    <a:LikeYear>2.5年</a:LikeYear>        
                </a:Data>
                <a:Data>
                    <a:Name>李四</a:Name>
                    <a:LikeYear>2.5年</a:LikeYear>        
                </a:Data>
                <a:Data>
                    <a:Name>王二</a:Name>
                    <a:LikeYear>2.5年</a:LikeYear>        
                </a:Data>
                <a:Data>
                    <a:Name>麻子</a:Name>
                    <a:LikeYear>2.5年</a:LikeYear>        
                </a:Data>
            </GetPointsResult>
        </GetPointsResponse>
    </s:Body>
</s:Envelope>

三.代码实现

1.引入对应jar

   <dependency>
	   <groupId>dom4j</groupId>
	   <artifactId>dom4j</artifactId>
    </dependency>

2.代码实现

public boolean testSoap() {
        StringBuilder result = new StringBuilder();
        OutputStream out = null;
        BufferedReader in = null;
        //需要传的参数
        String[] pointNames = {"chang","tiao","rap","basketball"};
        //拼接请求报文的方法
        String soap = buildXML(pointNames);
        try {
            URL url = new URL(你需要请求的url地址);
            URLConnection connection = url.openConnection();
            HttpURLConnection httpConn = (HttpURLConnection) connection;
            byte[] b = soap.getBytes("ISO-8859-1");
            httpConn.setRequestProperty( "Content-Length",String.valueOf( b.length ) );
            httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
            httpConn.setRequestProperty("soapaction","http://tempuri.org/WcfDataProxy/GetPoints");//重点中的重点,不加就500。注意:soapaction对应的值不固定,具体值看你的请求。
            httpConn.setRequestMethod( "POST" );
            httpConn.setDoOutput(true);
            httpConn.setDoInput(true);

            out = httpConn.getOutputStream();
            out.write( b );
            in = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));

            //把响应回来的报文拼接为字符串
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                result.append(inputLine);
            out.close();
            in.close();
            //把soap的xml报文转为list
            Document doc = DocumentHelper.parseText(result.toString());//报文转成doc对象
            Element root = doc.getRootElement();//获取根元素,准备递归解析这个XML树
            Map<String, String> map = new HashMap<String, String>();
            List<Map<String, String>> lists = new ArrayList<Map<String, String>>();//存放叶子节点数据
            //获取叶子节点的方法
            getCode(root, map,lists);
            //循环叶子节点数据
            for (Map<String, String> item : lists) {
                //取响应报文中的name
                String key = item.get("Name");
                //取响应报文中的LikeYear
                String value =  item.get("LikeYear");
                //你需要的后续操作
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }  catch (ParseException e) {
            e.printStackTrace();
        } catch (org.dom4j.DocumentException e) {
            e.printStackTrace();
        } finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return true;
    }


   /**
     * 拼接报文
     * @param pointNames
     * @return
     */
    private static String buildXML(String[] pointNames){

        String str = "<s:Envelope\n" +
                "    xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
                "    <s:Body>\n" +
                "        <GetPoints\n" +
                "            xmlns=\"http://tempuri.org/\">\n" +
                "            <kunkun\n" +
                "                xmlns:d4p1=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\"\n" +
                "                xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
        for (String s : pointNames) {
            str += "<d4p1:string>" + s + "</d4p1:string>"+"\n";
        }
        str += "</kunkun>\n" +
                "        </GetPoints>\n" +
                "    </s:Body>\n" +
                "</s:Envelope>";

        return str;
    }

	 /**
     * 找到soap的xml报文的叶子节点的数据
     * @param root
     * @param map
     * @param lists
     */
    public static void getCode(Element root, Map<String, String> map,List<Map<String, String>> lists) {
        if (root.elements() != null) {
            List<Element> list = root.elements();//如果当前跟节点有子节点,找到子节点
            for (Element e : list) {//遍历每个节点
                if (e.elements().size() > 0) {
                    getCode(e, map ,lists);//当前节点不为空的话,递归遍历子节点;
                }
                if (e.elements().size() == 0) {
                    //如果为叶子节点,那么直接把名字和值放入map
                    map.put(e.getName(), e.getTextTrim());
                    //如果数据都放进map,那就存进list
                    if (map.size() == 2){ //注意:因为这里我响应回来的叶子节点是两个,所以等于2,如果你的不是请修改。对应的就是<Name>和<LikeYear>这是两个叶子节点
                        Map<String, String> mapTo = new HashMap<String, String>();
                        //map全部赋值给maoTo
                        mapTo.putAll(map);
                        lists.add(mapTo);
                        //清空map
                        map.clear();
                    }
                }
            }
        }
    }

文章来源地址https://www.toymoban.com/news/detail-507663.html

到了这里,关于java发送soap请求和解析soap的响应的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Jmeter提取协议报文、请求头、请求体、响应体

    参看文章: https://blog.csdn.net/qq_40308101/article/details/125545245 https://www.thinbug.com/q/34918343 https://www.cnblogs.com/peak911/p/9238738.html 1、 prev (用于后置处理器、断言) prev 提供对当前取样器结果的访问能力 prev 映射 org.apache.jmeter.samplers 的 SampleResult 类 官方文档: https://jmeter.apache.org/ap

    2024年02月11日
    浏览(36)
  • Ajax学习:如何在Chrome网络控制台查看通信报文(请求报文/响应报文)

    第一步:F12开启控制台, 第二步骤:打开网络标签 然后刷新页面 在网络标签位置处,这时候会出现所有发送的请求  点击第一个:会出现内容  预览部分:是解析 观察解析结果处 标头=headers:主要观察请求头和请求体部分 GET请求部分  请求标头:  点击上方查看源代码:就会

    2024年02月15日
    浏览(56)
  • http 请求报文响应报文的格式以及Token cookie session 区别

    HTTP 请求报文和响应报文的格式如下: HTTP 请求报文格式: 方法 : 请求方法,例如 GET、POST、PUT、DELETE 等。 路径 : 请求的路径,表示需要访问的资源。 协议版本 : 使用的协议版本,通常是 HTTP/1.1 或 HTTP/2。 请求头部字段:包含了关于请求的附加信息,每个字段由字段名和对

    2024年02月16日
    浏览(54)
  • 4、SpringBoot接收和响应xml报文请求

    平时开发的接口,基本是使用 json 格式的请求报文。然而,有时候也避免不了有 xml 报文请求的场景,最近就遇到了这种情况,在此记录下。另外,工程中使用的是 controller-service……这种结构。 xml请求报文: ?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" ? req   tel15556905765/tel   activityid/ac

    2024年02月12日
    浏览(33)
  • HTTP 和 HTTPS(请求响应报文格式 + 请求方法 + 响应状态码 + HTTPS 加密流程 + Cookie 和 Session)

    HTTP 全称 “ 超文本传输协议 ”,是一种基于传输层 TCP 协议实现的应用非常广泛的 应用层协议 我们平时打开一个网站,就是通过 HTTP 协议来传输数据的 当我们在浏览器中访问一个 “ 网址 ”(URL),浏览器就会给这个 URL 的服务器发送一个 HTTP 请求,服务器返回一个 HTTP 响

    2023年04月19日
    浏览(44)
  • WebServer 解析HTTP 响应报文

    一、基础API部分,介绍stat、mmap、iovec、writev、va_list 1.1 stat​  作用 :获取文件信息 返回值:成功返回0,失败返回-1; 参数:文件路径(名),struct stat 类型的结构体  struct stat 结构体详解: stat结构体中的st_mode 则定义了下列数种情况: 1.2 mmap 用于将一个文件或其他对象

    2024年02月09日
    浏览(46)
  • Java 调用 WebService 、java调用Soap请求、Java对接soap接口

    工作第一次遇到对接soap接口,觉得有必要记录一下,毕竟踩了不少坑,网上帖子很多但大都不全,也不可能完全满足自己的需求,于是就有了下面的代码: 除了只是借鉴, 注意事项: 1.http://ip:port/xxx/xxx/soap?wsdl有些soap接口,对面是不需要穿?wsdl对接时要问出清 2. httpPost.set

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

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

    2024年02月19日
    浏览(40)
  • Nodejs基础6之HTTP模块的获取请求行和请求头、获取请求体、获取请求路径和查询字符串、http请求练习、设置HTTP响应报文、http响应练习

    含义 语法 重点掌握 请求方法 request.method * 请求版本 request.httpVersion 请求路径 request.url * URL 路径 require(‘url’).parse(request.url).pathname * URL 查询字符串 require(‘url’).parse(request.url, true).query * 请求头 request.headers * 请求体 request.on(‘data’, function(chunk){}),request.on(‘end’, functio

    2024年02月20日
    浏览(43)
  • ModbusRTU\TCP消息帧解析(C#实现报文发送与解析)

    PLC寄存器中存储(整型和无符号整型:2字节。长整型:4字节。单精度浮点数:4字节。双精度浮点数:8字节),我们只要知道数据类型,是2个字节一截取,还是4个字节 ,对接收到的报文进行字节截取然后编码成str就行 向PLC中写入Float,float占4个字节=2个寄存器,所以要使用

    2024年02月03日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包