项目上使用到特在此记录下。百度一个下午找到的内容都是缺胳膊少腿,实在难搞,研究出来较为便捷的实现方式分享给大家,共同学习进步。
废话少说,直接上代码。
项目环境:Springboot框架、jdk1.8
1.首先引入依赖
<!-- WEB Service 调用相关 -->
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.5.2</version>
</dependency>
- 实现demo
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.encoding.XMLType;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import com.alibaba.fastjson.JSONObject;
public class WebServiceUtil {
public static JSONObject sendWebService(String carNO) {
JSONObject json = new JSONObject();
// json.put("CarNo", "HJSCE6E8VN0000888");
json.put("CarNo", carNO);
Service service = new Service();
String result = null;
try {
Call call = (Call) service.createCall();
// wsdl完整地址
call.setTargetEndpointAddress("http://gpszh.hyundai-cn.com:9210/gpsservice.asmx?wsdl");
/**
* 设置方法名 new QName(String namespaceURI, String localPart)
* namespaceURI即为wsdl中的targetNamespace, localPart即为接口名
*/
call.setOperationName(new QName("http://tempuri.org/", "getMachineryInfo"));
/**
* 添加参数 addParameter方法的参数包括:参数名(namespace+参数名)、参数类型、ParameterMode(入参即为IN)
*/
call.addParameter(new QName("http://tempuri.org/", "sjson"), XMLType.XSD_STRING, ParameterMode.IN);
call.setUseSOAPAction(true);
// SOAPActionURI格式为targetNamespace+方法名
call.setSOAPActionURI("http://tempuri.org/getMachineryInfo");
// 指定返回值类型,为字符串
call.setReturnType(XMLType.XSD_STRING);
call.setReturnClass(java.lang.String.class);
result = (String) call.invoke(new Object[] { json.toJSONString() });
} catch (RemoteException | ServiceException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return JSONObject.parseObject(result);
}
public static void main(String[] args) {
JSONObject jsonObject = sendWebService("HJSCE6E8VN0000888");
System.out.println(jsonObject);
}
}
- 其中比较容易踩坑的点是如下几句代码
/**
* 设置方法名 new QName(String namespaceURI, String localPart)
* namespaceURI即为wsdl中的targetNamespace, localPart即为接口名
*/
call.setOperationName(new QName("http://tempuri.org/", "getMachineryInfo"));
/**
* 添加参数 addParameter方法的参数包括:参数名(namespace+参数名)、参数类型、ParameterMode(入参即为IN)
*/
call.addParameter(new QName("http://tempuri.org/", "sjson"), XMLType.XSD_STRING, ParameterMode.IN);
call.setUseSOAPAction(true);
// SOAPActionURI格式为targetNamespace+方法名
call.setSOAPActionURI("http://tempuri.org/getMachineryInfo");
-
这边的 namespaceURI 即为 SoapUI工具调试时 xml第一行的后半段地址,这个地方写错会出现各种报错。
-
其次就是参数名称不要写错,完整的wsdl地址可以看到对应接口的说明,例如:
扩展资料:
拿到webservice地址后可以先使用 Soapui 工具进行调试,工具调的通接口,那代码调用就没有问题了。
官网下载后安装:
使用步骤:
点击ok后左侧树状菜单栏会显示出所有的接口名字,找到自己对应的点开,补充参数即可调用。