WebService soap报文请求返回xml格式以及自定义soap模板

需求

上篇文章主要讲了一个springboot集成webservice的例子,这次我们根据已经做好的webservice服务端,做一个soap接口请求,要求请求以soap报文方式请求,返回值为xml格式

这是上篇:springboot集成webservice以及遇到的问题

soap请求接口实现

这是请求报文以及响应的报文的信息

 

 

soap接口所需要的参数信息:

soap接口代码如下:

public static void main(String[] args) {
    String postUrl="http://localhost:8888//services/user?wsdl";//webservicve接口地址
    String soapAction="";//"http://tempuri.org/execute";
    String namespace="http://webservice.zjqf.com/";//命名空间
    int paramsNum=0;//参数个数
    String[] params={};//参数组
    String result=SoapUtil.SplicingMessage(namespace, postUrl, soapAction, "getAllData", paramsNum, params);//访问接口
    System.out.println("返回的数据为:"+result);
}

工具类soapUtil

 /**
     * 访问webservice接口
     * @param namespace 命名空间
     * @param postUrl webservice接口地址
     * @param soapAction soapAction地址
     * @param method 方法名
     * @param paramsNum 参数个数
     * @param params 参数组
     * @return  返回值
     */
    public static String SplicingMessage(String namespace,String postUrl,String soapAction,String method,int paramsNum,String[] params){
        //自定义soap报文模板 注意:xmlns:web 与<soapenv:Body>后的属性(web)要一致
        StringBuffer sb=new StringBuffer("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"");
        sb.append(namespace);
        sb.append("\"><soapenv:Header/><soapenv:Body><web:");
        sb.append(method);
        sb.append(">");
        for (int i = 0; i < paramsNum; i++) {
            sb.append("<arg0>"+params[i]+"</arg0>");
        }
        sb.append("</web:");
        sb.append(method);
        sb.append("></soapenv:Body></soapenv:Envelope>");
        String result=doPostSoap1_1(postUrl, sb.toString(), soapAction);
//        int start = result.indexOf("<return>")+8;
//        int end = result.indexOf("</return>");
//        return result.substring(start,end);
        return result;
    }
/**
 * 使用SOAP1.1发送消息
 *
 * @param postUrl
 * @param soapXml
 * @param soapAction
 * @return
 */
public static String doPostSoap1_1(String postUrl, String soapXml,
                                   String soapAction) {
    String retStr = "";
    // 创建HttpClientBuilder
    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
    // HttpClient
    CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
    HttpPost httpPost = new HttpPost(postUrl);
    // 设置请求和传输超时时间
    RequestConfig requestConfig = RequestConfig.custom()
            .setSocketTimeout(socketTimeout)
            .setConnectTimeout(connectTimeout).build();
    httpPost.setConfig(requestConfig);
    try {
        httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");
        httpPost.setHeader("SOAPAction", soapAction);
        StringEntity data = new StringEntity(soapXml,
                Charset.forName("UTF-8"));
        httpPost.setEntity(data);
        CloseableHttpResponse response = closeableHttpClient
                .execute(httpPost);
        HttpEntity httpEntity = response.getEntity();
        if (httpEntity != null) {
            // 打印响应内容
            retStr = EntityUtils.toString(httpEntity, "UTF-8");
        }
        // 释放资源
        closeableHttpClient.close();
    } catch (Exception e) {
    }
    return retStr;
}

返回xml信息:

 

题外

以下纯属个人理解,如果有误,感谢大家指正

  1. 如果要返回xml格式的话,一定要将Content-Type设置为xml格式;

    httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8"); 如果要返回json格式,需变为json

  2. 自定义soap模板时,此处不适用含有@WebMethod修饰的方法 因为他需要指定的参数名字,而这里使用的都是arg0

    for (int i = 0; i < paramsNum; i++) {
                sb.append("<arg0>"+params[i]+"</arg0>");
            }

另外,对于处理这些soap报文请求时,推荐大家一款接口测试神器soapUi 

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
webservice响应报文格式通常是XML格式XML是一种可扩展标记语言,用于描述数据的结构和内容。在webservice中,响应报文格式遵循SOAP协议,SOAP是一种基于XML的通信协议,用于在网络上交换结构化信息。SOAP协议定义了报文格式和通信规则,以确保不同平台和系统之间的互操作性。响应报文格式包含在SOAP Envelope元素中,其中包含SOAP Header和SOAP Body两个部分。SOAP Header用于传递额外的信息和参数,而SOAP Body包含实际的响应数据。在SOAP Body中,响应数据被封装在特定的命名空间下的元素中。这些元素的结构和内容由webservice的定义确定,以便客户端可以解析和处理响应数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [WebService soap报文请求返回xml格式以及自定义soap模板](https://blog.csdn.net/zz18435842675/article/details/96869484)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [WebService soap报文请求与响应报文解析(JAVA)](https://blog.csdn.net/qq_27256783/article/details/103660512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值