soap-ws获取wsdl中的所有的接口方法
示例wsdl文件如下,生成的过程可以参考https://www.cnblogs.com/chenyun-/p/11502446.html:
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.chenyun.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://impl.chenyun.com/" name="WsImplService">
<types>
<xsd:schema>
<xsd:import namespace="http://impl.chenyun.com/" schemaLocation="http://localhost:8081/Webservice?xsd=1"/>
</xsd:schema>
</types>
<message name="sayname2">
<part name="parameters" element="tns:sayname2"/>
</message>
<message name="sayname2Response">
<part name="parameters" element="tns:sayname2Response"/>
</message>
<message name="sayname">
<part name="parameters" element="tns:sayname"/>
</message>
<message name="saynameResponse">
<part name="parameters" element="tns:saynameResponse"/>
</message>
<portType name="WsImpl">
<operation name="sayname2">
<input wsam:Action="http://impl.chenyun.com/WsImpl/sayname2Request" message="tns:sayname2"/>
<output wsam:Action="http://impl.chenyun.com/WsImpl/sayname2Response" message="tns:sayname2Response"/>
</operation>
<operation name="sayname">
<input wsam:Action="http://impl.chenyun.com/WsImpl/saynameRequest" message="tns:sayname"/>
<output wsam:Action="http://impl.chenyun.com/WsImpl/saynameResponse" message="tns:saynameResponse"/>
</operation>
</portType>
<binding name="WsImplPortBinding" type="tns:WsImpl">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="sayname2">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="sayname">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="WsImplService">
<port name="WsImplPort" binding="tns:WsImplPortBinding">
<soap:address location="http://localhost:8081/Webservice"/>
</port>
</service>
</definitions>
通过wsdl地址获取的所有方法,也就是operations,在wsdl文件中定义这些operation的地方是有两处,一处在portType节点,一处是在binding节点处,两处均可以获取到所有的方法,具体有什么差别暂时还没有发现,这里使用的是在binding节点处获取,在portType处获取暂时没有测试,后续可能会更新。
soap-ws的git地址:https://github.com/reficio/soap-ws
在Readme中可以找到Quick-start,根据里面的讲解,我们需要使用的部分需要添加一个依赖和一个仓库(添加仓库是因为还没有添加进maven的核心仓库,文档中有介绍)
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.chenyun</groupId>
<artifactId>webservice_test_v5</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>webservice_test_v5</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.reficio</groupId>
<artifactId>soap-builder</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies> <repositories>
<repository>
<id>reficio</id>
<url>http://repo.reficio.org/maven/</url>
</repository>
</repositories> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
至此,准备已经大概完成,下面是介绍核心代码:
getList.java
/*
* @author:陈云
* @date:2019/9/10
* @description:返回接口列表
*/
package com.chenyun; import org.reficio.ws.builder.SoapBuilder;
import org.reficio.ws.builder.SoapOperation;
import org.reficio.ws.builder.core.Wsdl; import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List; public class getList {
/**
*
* @param wsdlUrl
* @return List<String>接口列表
*/
public static List<String> getBindingOperations(String wsdlUrl) {
List<String> operationList = new ArrayList();
List<SoapOperation> soapOperationList = new ArrayList();
//解析指定的wsdl文件,生成一个wsdl对象
Wsdl parser = Wsdl.parse(wsdlUrl);
//类Wsdl中提供了获取所有binding的方法getBindings()
List<QName> bindQnames = parser.getBindings();
//接口SoapBuilder,定义了获取operation的方法,获取的是binding节点的所有operation。
for (QName qName : bindQnames) {
SoapBuilder soapBuilder = parser.binding().localPart(qName.getLocalPart()).find();
soapOperationList.addAll(soapBuilder.getOperations());
}
for (SoapOperation soapOperation : soapOperationList) {
operationList.add(soapOperation.getOperationName());
}
return operationList;
}
}
WebserviceTestV5Application.java
package com.chenyun; import org.apache.log4j.BasicConfigurator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import static com.chenyun.getList.getBindingOperations; @SpringBootApplication
public class WebserviceTestV5Application { public static void main(String[] args) {
SpringApplication.run(WebserviceTestV5Application.class, args);
//提供wsdl的值,调用getBindingOperations()
String wsdl = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
System.out.println("=====================================");
System.out.println("接口列表:");
for(int i=0;i<getBindingOperations(wsdl).size();i++){
System.out.println("接口" + i + ":"+ getBindingOperations(wsdl).get(i));
}
System.out.println("=====================================");
System.out.println("接口查询结束");
}
}
运行主函数即可获取到结果。