需求
上篇文章主要讲了一个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信息:
题外
以下纯属个人理解,如果有误,感谢大家指正
-
如果要返回xml格式的话,一定要将Content-Type设置为xml格式;
httpPost.setHeader(“Content-Type”, “text/xml;charset=UTF-8”); 如果要返回json格式,需变为json
-
自定义soap模板时,此处不适用含有@WebMethod修饰的方法 因为他需要指定的参数名字,而这里使用的都是arg0
for (int i = 0; i < paramsNum; i++) { sb.append("<arg0>"+params[i]+"</arg0>"); }
另外,对于处理这些soap报文请求时,推荐大家一款
接口测试神器
:
soapUi
版权声明:本文为zz18435842675原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。