工作对接需要,对webservice了解不深,知道wsdl地址,就下载了Soap UI工具。大家自行下载,网上比较多。
Soap UI工具使用起来也简单,直接把wsdl地址粘贴进去,就知道有什么方法了,就可以测试了。
这里简单说下使用方法:
直接点file,然后new soap project,然后在弹出填入wsdl地址,点击ok,然后左侧,就会有目录树生成,选里面的方法,点击request,按enter,就出现右侧request框,有参数填参数,没参数,直接点运行,最右侧就生成response了。大致可以看下图:
熟悉了Soap UI工具,对wsdl有了一点点了解,输入,输出都是xml格式,但是在项目中,大部分使用json格式的,所以,我自己写了一个通用一点的方法,在结果返回那里,可能获取的层级不对,我是按我的来写,如果大家使用的话,断点调试一下就可以了。
getWsdl方法:实现原理就是前端传soap中缺少的参数进来(虽然是json输入,但是实际参数里面是xml),到后端拼接请求,这种写法在实际应用中可能不太实用,对前端造成困扰,但是,特殊定制,这种就比较通用,不会担心,因为某一个参数不同,导致请求失败
getWebService方法:这种就是标准json格式,使用起来,有些服务总数请求失败,因为我的特殊定制,所有没有用这个
总体来说,要熟悉wsdl,就先下个soap UI工具,请求一下,看了请求和返回,你就了解他的格式了
package com.zhuzhu.common.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.llom.util.AXIOMUtil;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.client.Stub;
import org.apache.axis.constants.Style;
import org.apache.axis.constants.Use;
import org.apache.axis.description.OperationDesc;
import org.apache.axis.description.ParameterDesc;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.*;
/**
* @ClassName: WebServiceUtils
* @Description: webService工具类
* @author: zhuzhu
* @date: 2020/06/08
*/
public class WebServiceUtils extends Stub {
public static void main(String[] args) throws RemoteException {
JSONObject json = new JSONObject();
json.put("url", "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
json.put("method", "getMobileCodeInfo");
json.put("targetNamespace", "http://WebXml.com.cn/");
json.put("mobileCode", "13419672002");
String result = getWebService(json);
System.out.println(result);
}
// public static void main(String[] args) throws RemoteException {
// JSONObject json = new JSONObject();
// json.put("url", "http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl");
// json.put("targetNamespace", "xmlns:web=\"http://WebXml.com.cn/\"");
// List list = new ArrayList<>();
// list.add("");
// list.add("369543107 ");
// list.add(" ");
// json.put("body", list);
// String result = getWsdl(json);
// System.out.println(result);
// }
/**
* @param json
* @return
* @Description: 请求wsdl服务
* @Title: getWsdl
*/
public static String getWsdl(JSONObject json) {
try {
String wsdlURL = json.getString("url");
String targetNamespace = json.getString("targetNamespace");
JSONArray body = json.getJSONArray("body");
// 设置编码。(因为是直接传的xml,所以我们设置为text/xml;charset=utf8)
final String contentType = "text/xml;charset=utf8";
/// 拼接要传递的xml数据(注意:此xml数据的模板我们根据wsdlURL从SoapUI中获得,只需要修改对应的变量值即可)
StringBuffer xMLcontent = new StringBuffer("");
xMLcontent.append("\n");
xMLcontent.append(" \n");
xMLcontent.append(" \n");
for (int i = 0; i < body.size(); i++) {
xMLcontent.append(" " + body.getString(i) + "\n");
}
xMLcontent.append(" \n");
xMLcontent.append(" ");
// 调用工具类方法发送http请求
String responseXML = doHttpPostByHttpClient(wsdlURL, contentType, xMLcontent.toString());
// 将xml数据转换为OMElement
OMElement omElement = AXIOMUtil.stringToOM(responseXML);
// 根据responseXML的数据样式,定位到对应element,然后获得其childElements,遍历
Iterator it = omElement.getFirstElement().getFirstElement().getChildElements();
while (it.hasNext()) {
OMElement element = it.next();
if (StringTool.equalsIgnoreCase(element.getLocalName(), "return")) {
return element.getText();
}
}
return "";
} catch (Exception e) {
System.out.println("error ------" + e.toString());
return "";
}
}
/**
* 使用apache的HttpClient发送http
*
* @param wsdlURL 请求URL
* @param contentType 如:application/json;charset=utf8
* @param content 数据内容
* @DATE 2018年9月22日 下午10:29:17
*/
private static String doHttpPostByHttpClient(final String wsdlURL, final String contentType, final String content) throws ClientProtocolException, IOException {
// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// 创建Post请求
HttpPost httpPost = new HttpPost(wsdlURL);
StringEntity entity = new StringEntity(content.toString(), "UTF-8");
// 将数据放入entity中
httpPost.setEntity(entity);
httpPost.setHeader("Content-Type", contentType);
// 响应模型
CloseableHttpResponse response = null;
String result = null;
try {
// 由客户端执行(发送)Post请求
response = httpClient.execute(httpPost);
// 从响应模型中获取响应实体
// 注意:和doHttpPostByRestTemplate方法用的不是同一个HttpEntity
org.apache.http.HttpEntity responseEntity = response.getEntity();
System.out.println("响应ContentType为:" + responseEntity.getContentType());
System.out.println("响应状态为:" + response.getStatusLine());
if (responseEntity != null) {
result = EntityUtils.toString(responseEntity);
System.out.println("响应内容为:" + result);
}
} finally {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
}
return result;
}
/**
* @param json
* @return
* @Description: 发送webservice服务
* @Title: getWebService
*/
public static String getWebService(JSONObject json) {
try {
Service service = new Service();
Call call = (Call) service.createCall();
//WSDL地址的targetNamespace和接口名称
call.setSOAPActionURI(json.getString("targetNamespace") + json.getString("method"));
//WSDL地址带?wsdl
call.setTargetEndpointAddress(json.getString("url"));
//WSDL里面描述的接口名称
call.setOperationName(json.getString("method"));
json.remove("url");
json.remove("targetNamespace");
//参数构建
call.setOperation(initOperationDesc1(json));
//处理输入参数
Iterator iter = json.entrySet().iterator();
List list = new ArrayList<>();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
list.add(entry.getValue().toString());
}
String[] arrString = list.toArray(new String[list.size()]);
Object[] obj = arrString;
String result = (String) call.invoke(obj);
System.out.println("result is ------" + result);
return result;
} catch (Exception e) {
System.out.println("error ------" + e.toString());
return "";
}
}
/**
* @param json
* @return
* @Description:组合参数
* @Title: initOperationDesc1
*/
private static OperationDesc initOperationDesc1(JSONObject json) {
OperationDesc oper = new OperationDesc();
Set it = json.keySet();
oper.setName(json.getString("method"));
json.remove("method");
for (String key : it) {
ParameterDesc param = new ParameterDesc(new QName("", key), ParameterDesc.IN, new QName("http://www.w3.org/2001/XMLSchema", "string"), String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
}
oper.setReturnType(new QName("http://www.w3.org/2001/XMLSchema", "string"));
oper.setReturnClass(String.class);
oper.setReturnQName(new QName("", "return"));
oper.setStyle(Style.WRAPPED);
oper.setUse(Use.LITERAL);
return oper;
}
}