Java 调用 WebService 接口
前言
由于要对接其他系统的 WebService 接口,尝试了几种方案有一个可以调通,在这里记录一下尝试的几种方案。至于为什么有的方案调不通,我也不是很清楚。。。
JAX-WS调用
JAX-WS 是 Java API for XML Web Services 的缩写,是一种比较常见的调用 Webservice 接口的方式。
生成代码
使用 wsimport 工具生成客户端代码,其中,<生成代码的目录>
是想要生成代码的目标目录,<WSDL文件的URL>
是 Web 服务的 WSDL 文件的 URL。
wsimport -s <生成代码的目录> <WSDL文件的URL>
调用方法
调用生成的代码中的方法,注意 YourWebServiceService
、YourWebServicePortType
、yourWebServiceMethod
、parameter
需要替换为生成的代码中的类和实际调用的方法及参数。
public class WebServiceClient {
public static void main(String[] args) {
// 创建客户端
YourWebServiceService service = new YourWebServiceService();
YourWebServicePortType port = service.getYourWebServicePort();
// 调用 Web 服务方法
String result = port.yourWebServiceMethod("parameter");
// 处理结果
System.out.println("Result: " + result);
}
}
Jar包
如果有jar包问题,可引入相关依赖。
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>javax.xml.ws-api</artifactId>
<version>2.3.1</version>
</dependency>
手动创建WebService实例
如果不想使用使用 wsimport 工具生成代码,可以手动创建 WebService 实例,注意替换参数为实际值。
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
public class YourWebServiceServiceClient {
public static void main(String[] args) {
try {
// 1. 创建服务的 URL
URL url = new URL("http://example.com/YourWebService?wsdl");
// 2. 创建服务的 QName
QName qname = new QName("http://example.com/", "YourWebServiceService");
// 3. 创建服务
Service service = Service.create(url, qname);
// 4. 获取服务端口
YourWebServicePortType port = service.getPort(YourWebServicePortType.class);
// 5. 调用 Web 服务方法
String result = port.yourWebServiceMethod("parameter");
// 6. 处理结果
System.out.println("Result: " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
其中 YourWebServicePortType
示例如下:
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(targetNamespace = "http://www.example.com/webservice", name = "YourWebService")
public interface YourWebServicePortType {
@WebMethod(operationName = "yourWebServiceMethod")
String yourWebServiceMethod(@WebParam(name = "parameter") String parameter);
}
Apache HttpClient调用
Apache HttpClient 是一个开源的 Java HTTP 客户端库,可以支持 HTTP 协议的客户端编程,其他的 HTTP 客户端也一样。
调用方法
import org.apache.http.HttpEntity;
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.HttpClients;
import org.apache.http.util.EntityUtils;
public class HelloWorldClient {
public static void main(String[] args) {
StringEntity stringEntity = null;
try {
stringEntity = new StringEntity("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:imp=\"http://namespace.example.com/\">\n" +
" <soapenv:Header/>\n" +
" <soapenv:Body>\n" +
" <imp:methodName>\n" +
" <arg0>arg0</arg0>\n" +
" </imp:methodName>\n" +
" </soapenv:Body>\n" +
"</soapenv:Envelope>");
} catch (Exception e) {
e.printStackTrace();
}
HttpPost httpPost = new HttpPost("http://example.com/YourWebService?wsdl");
httpPost.setHeader("Content-type", "text/xml;charset=UTF-8");
httpPost.setEntity(stringEntity);
try (CloseableHttpClient httpclient = HttpClients.createDefault(); CloseableHttpResponse response = httpclient.execute(httpPost)) {
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
StringEntity 的内容根据实际情况进行替换,如果使用 SoapUI 工具,可以直接从工具中复制参数。注意将方法名和参数进行替换。
Jar包
如果有jar包问题,可引入相关依赖。
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
Apache CXF调用
Apache CXF 是一个开源的 Web 服务框架,支持 JAX-WS 和 JAX-RS 标准,可以用于调用和创建Web服务。
调用方法
注意替换相应参数。
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class WebServiceClient {
public static void main(String[] args) {
// Web 服务的 WSDL 地址
String wsdlURL = "http://example.com/YourWebService?wsdl";
// 创建代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(YourWebService.class);
factory.setAddress(wsdlURL);
// 创建 Web 服务代理
YourWebService client = (YourWebService) factory.create();
// 调用 Web 服务方法
String result = client.yourWebServiceMethod("parameter");
// 处理响应
System.out.println("Result: " + result);
}
}
其中 YourWebService
示例如下:
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(targetNamespace = "http://www.example.com/webservice", name = "YourWebService")
public interface YourWebService {
@WebMethod(operationName = "yourWebServiceMethod")
String yourWebServiceMethod(@WebParam(name = "parameter") String parameter);
}
也可以使用 wsdl2java 工具生成:
wsdl2java -d /path/to/output/directory -p com.example.client http://example.com/YourWebService?wsdl
会在指定的目录 /path/to/output/directory 中生成 Java 类,其中包括 com.example.client 包路径下的类文件。
配置日志(可选)
在 src/main/resources
目录下创建一个 logging.properties
文件,添加以下内容:
org.apache.cxf.Logger=org.apache.cxf.common.logging.Slf4jLogger
在应用程序的启动代码中添加以下代码:
import org.apache.cxf.common.logging.LogUtils;
import java.util.logging.ConsoleHandler;
public class WebServiceClient {
static {
// 配置 CXF 的日志
LogUtils.setLoggerClass(org.apache.cxf.common.logging.Slf4jLogger.class);
LogUtils.setUseParentHandlers(false);
java.util.logging.Logger.getLogger("org.apache.cxf").setUseParentHandlers(false);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(java.util.logging.Level.ALL);
java.util.logging.Logger.getLogger("org.apache.cxf").addHandler(consoleHandler);
}
public static void main(String[] args) {
// ...
}
}
Jar包
如果有jar包问题,可引入相关依赖。
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.4.6</version>
</dependency>
Axis调用
参考Axis 调用 WebService 接口 - 今日说码 (96xl.top)。