使用http来调用webservice协议

使用http来调用webservice协议

使用http请求来调用webservice协议,首先是要先拼接soap格式的请求报文

拼接soap请求报文

 public String jsonToXml(JsonObject json){
		/**
		*其中attributes是一个入参的数组,里面的元素为name和value
		*name和userid也是入参
		*/
        logger.info("开始拼接请求报文");
        //开始拼接请求报文
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\""+
                "xmlns:ask=\"http://www.eastrobot.cn/ws/AskService\">\n");
        stringBuilder.append("<soapenv:Header/>\n");
        stringBuilder.append("<soapenv:Body>\n");
        stringBuilder.append("<request>\n");
        //如果出现数组,那么就给它遍历出来
        for (int i = 0;i<attributes.size();i++){
            JsonObject key = attributes.get(i).getAsJsonObject();
            stringBuilder.append("<attributes>\n");
            stringBuilder.append("<name>"+key.get("name").getAsString()+"</name>\n");
            stringBuilder.append("<value>"+key.get("value").getAsString()+"</value>\n");
            stringBuilder.append("</attributes>\n");
        }
        stringBuilder.append("<question>"+name+"</question>\n");
        stringBuilder.append("<userId>"+userId+"</userId>\n");
        stringBuilder.append("</request>\n");
        stringBuilder.append("</soapenv:Body>\n");
        stringBuilder.append("</soapenv:Envelope>");
        return stringBuilder.toString();
    }

拼接完soap报文后,就开发送http请求了

发送http请求

 //请求路径
    public static String wsdlURL = "http://127.0.0.1:/8080/kService?wsdl";


    /**
     * 发送http请求
     * @param xml soap的请求报文
     * @return
     * @throws Exception
     */
    public String sendHttp(String xml) throws Exception {
        String s = "";
        //创建HttpClientBuilder
        logger.info("创建http连接");
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        CloseableHttpClient build = httpClientBuilder.build();
        HttpPost httpPost = new HttpPost(wsdlURL);
        try {
            httpPost.setHeader("Context-Type", "text/xml;charset=utf-8");
            StringEntity data = new StringEntity(xml, Charset.forName("UTF-8"));
            httpPost.setEntity(data);
            CloseableHttpResponse response = build.execute(httpPost);
            HttpEntity httpEntity = response.getEntity();
            if (httpEntity != null) {
                s = EntityUtils.toString(httpEntity, "UTF-8");
            }
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("读取soap请求报文异常");
        } catch (ParseException e) {
            e.printStackTrace();
        } finally {
            if (build != null) {
                build.close();
            }
        }
        return s;
    }

发送完http请求报文,成功了,会返回一个响应报文,到此就结束了,但是有的需求会要将响应报文解析出来,我这边也将解析的响应报文的工具类给出来,我用的JsonObject是Gson

解析响应报文,将响应报文转为json

我用的是迭代器进行和do4j进行解析的

/**
     * 将xml转为json
     * @param xml 响应报文
     * @return
     * @throws Exception
     */
    public JsonObject xmlToJson(String xml) throws Exception{
        //创建jsonobject
        JsonObject object = new JsonObject();
        //创建JsonArray
        JsonArray array = new JsonArray();
        //将array添加到object中
        object.add("data",array);
        //创建一个SAXReader阅读器
        SAXReader reader = new SAXReader();
      //  String xml = httpUtil.sendHttp(xiaoi);
        //根据字符串构建字节数组输入流
            InputStream is = new ByteArrayInputStream(xml.getBytes());
            //用阅读器读取文档对象
            Document document = reader.read(is);
            //获取文档对象的根节点
            logger.info("开始解析soap报文");
            Element root = document.getRootElement();
            //遍历子节点

        for (Iterator iterator = root.elementIterator(); iterator.hasNext(); ) {
            Element bodyElement = (Element) iterator.next();
                for (Iterator iterator1 = bodyElement.elementIterator(); iterator1.hasNext(); ) {
                    Element responseElement = (Element) iterator1.next();
                    for (Iterator iterator3 = responseElement.elementIterator(); iterator3.hasNext(); ) {
                        Element element = (Element) iterator3.next();
                        String name = element.getName();
                        if ("data".equals(name)) {
                            //  System.out.println(name + ":");
                            JsonObject ele = new JsonObject();
                            array.add(ele);
                            for (Iterator iterator4 = element.elementIterator(); iterator4.hasNext(); ) {
                                Element subElement = (Element) iterator4.next();
                                ele.addProperty(subElement.getName(), subElement.getStringValue());
                                //  System.out.println(subElement.getName() + ":" + subElement.getStringValue());
                            }
                        } else {
                            object.addProperty(name, element.getStringValue());
                            // System.out.println(name + ":" + element.getStringValue());
                        }
                    }
                }
            }
            return object;
         }

其中代码可能有些问题,有些地方我做了一定的修改,整体的思路就是这样的

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值