java模拟http请求解析报文例子

java模拟soap请求:

           // HttpClient发送SOAP请求
	        System.out.println("HttpClient 发送SOAP请求");
	        HttpClient client = new HttpClient();
	        PostMethod postMethod = new PostMethod(wsdl);
	        // 设置连接超时
	        client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout);
	        // 设置读取时间超时
	        client.getHttpConnectionManager().getParams().setSoTimeout(timeout);
	        // 然后把Soap请求数据添加到PostMethod中
	        RequestEntity requestEntity = new StringRequestEntity(sb.toString(), "text/xml", "UTF-8");
	        //设置请求头部,否则可能会报 “no SOAPAction header” 的错误
	        postMethod.setRequestHeader("SOAPAction","");
	        // 设置请求体
	        postMethod.setRequestEntity(requestEntity);
	        int status = client.executeMethod(postMethod);
	        // 打印请求状态码
	        System.out.println("status:" + status);
	        // 获取响应体输入流
	        InputStream is = postMethod.getResponseBodyAsStream();
	        // 获取请求结果字符串
	        String result = IOUtils.toString(is);
	        System.out.println("result: " + result);

解析soap报文:

/**
     * 解析返回报文
     * @param node 标记所在节点
     * @param attr 标记所在属性
     * @param soap 报文
     * @return 标记值
     * @throws 
     */
    public static String parseResponseSoap(String node, String attr, String soap){
        //然后用SOAPMessage 和 SOAPBody
        Document personDoc;
        try {
            personDoc = new SAXReader().read(new StringReader(soap));
            Element rootElt = personDoc.getRootElement(); // 获取根节点
            Iterator body = rootElt.elementIterator("Body");
            while (body.hasNext()) {
                Element recordEless = (Element) body.next();
                return nextSubElement(node,attr,recordEless);
            }
        } catch (DocumentException e) {
            throw new BusinessException(e.getMessage());
        }
        return "";
    }
    
    /**
     * 递归方法,查找本节点是否有标记信息,如果没有就查找下一层,
     * 在下一层里同样查找本层节点,只要找到值,就层层返回。
     * @param node 节点标签名
     * @param attr 节点属性值
     * @param el 当前节点对象
     * @return 目标值
     */
    public static String nextSubElement(String node, String attr, Element el) {
        if (el.getName().equals(node)) {
            //说明 找到了目标节点
            //属性值为空说明取标签内容
            if (attr.equals("")) {
                Iterator sub2 = el.elementIterator();
                //有子节点说明标签内容不是单一值,需要拿到查询结果
                if (sub2.hasNext()) {
                    while (sub2.hasNext()) {
                        Element s2 = (Element) sub2.next();
                        //如果返回的不是单一的标记值,而是查询结果,有些麻烦,
                        //查询结果应当是list<map>格式,但是map的key值不好确定,是标签名作为key还是属性值作为key
                        //todo
                    }
                } else {
                    return  el.getText();
                }

            } else {
                Attribute attrbute = el.attribute(attr);
                return attrbute.getText();
            }
        } else {
            Iterator sub2 = el.elementIterator();
            while (sub2.hasNext()) {
                Element sub = (Element) sub2.next();
                return nextSubElement(node, attr, sub);
            }
        }
        return "";
    }

使用实例:parseResponseSoap(“PolicyV2Result”, “”, result);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 HTTP POST 请求,其请求报文包体可能包含请求参数、JSON 数据、XML 数据等多种类型。在 Java解析 HTTP POST 请求报文包体的方法也因此而异,下面将分别介绍不同类型请求体的解析方法。 1. 请求参数类型 对于请求参数类型的请求体,可以通过 HttpServletRequest 对象的 getParameter() 方法获取请求参数。在使用该方法之前,需要先设置请求体的字符编码为 UTF-8,否则可能会出现中文乱码的情况。 ```java request.setCharacterEncoding("UTF-8"); String param1 = request.getParameter("param1"); String param2 = request.getParameter("param2"); // ... ``` 2. JSON 数据类型 对于 JSON 数据类型的请求体,可以使用 Gson 库将 JSON 数据转化为 Java 对象。在使用 Gson 之前需要先引入该库,可以通过 Maven 或 Gradle 等方式进行引入。 ```java Gson gson = new Gson(); MyObject myObject = gson.fromJson(request.getReader(), MyObject.class); // ... ``` 其中,MyObject 是一个 Java 类,用于表示 JSON 数据。 3. XML 数据类型 对于 XML 数据类型的请求体,可以使用 Java 自带的 SAX 或 DOM 解析器进行解析。以 SAX 解析器为例,其解析过程如下: ```java SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); MyHandler handler = new MyHandler(); parser.parse(request.getInputStream(), handler); MyObject myObject = handler.getMyObject(); // ... ``` 其中,MyHandler 是一个实现了 SAXHandler 接口的 Java 类,用于解析 XML 数据,并将解析结果封装在 MyObject 对象中。 需要注意的是,在使用 SAX 或 DOM 解析解析 XML 数据时,需要先对 XML 数据进行格式化,以便于解析器能够正确解析。 ```java TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StreamResult result = new StreamResult(new StringWriter()); DOMSource source = new DOMSource(document); transformer.transform(source, result); String xmlString = result.getWriter().toString(); ``` 在以上代码中,我们使用 DOM 解析器将 XML 数据转化为 Document 对象,并将其格式化为字符串形式。 以上就是 Java 解析 HTTP POST 请求报文包体的基本方法,需要根据不同的请求体类型进行相应的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值