在Java开发中,调用WebService是一项常见的需求,尤其是在跨系统数据交互、集成第三方服务等场景下,WebService基于标准化的协议(如SOAP、REST)提供服务,Java作为企业级开发的主流语言,提供了多种方式与之对接,本文将系统介绍Java调用WebService的核心方法、技术选型及实践要点,帮助开发者高效完成集成任务。

WebService基础与协议类型
在探讨调用方式前,需明确WebService的核心协议,主流的WebService协议包括SOAP(Simple Object Access Protocol)和REST(Representational State Transfer),SOAP基于XML,具有严格的协议规范和安全性,适用于企业级应用;REST则基于HTTP,使用JSON等轻量级数据格式,更灵活且易于调试,广泛应用于互联网服务,Java调用WebService需根据目标服务的协议类型选择合适的技术栈。
基于SOAP的WebService调用
使用JAX-WS(Java API for XML Web Services)
JAX-WS是Java官方推荐的SOAP WebService开发标准,JDK内置了部分支持(如JDK 6及以上版本),可通过wsimport工具生成客户端代码。
步骤如下:
-
生成客户端代码:通过
wsimport命令解析WSDL(Web Services Description Language)文件,生成Java客户端类。wsimport -keep -p com.example.client http://example.com/service?wsdl
-keep保留生成的源文件,-p指定包名。 -
调用服务:生成的代码包含服务接口(如
Service)和代理类(如ServicePortType),通过接口调用方法,示例代码:import com.example.client.Service; import com.example.client.ServicePortType; public class SoapClient { public static void main(String[] args) { // 创建服务实例 Service service = new Service(); // 获取服务端口 ServicePortType port = service.getServicePort(); // 调用WebService方法 String result = port.sayHello("Java Client"); System.out.println("Response: " + result); } }
使用Apache CXF框架
若需更灵活的功能(如自定义拦截器、支持SOAP 1.2等),可选用Apache CXF框架,CXF是开源的WebService框架,支持JAX-WS标准,并提供了丰富的扩展功能。
集成步骤:

-
添加依赖(Maven示例):
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.4.0</version> </dependency> -
通过
JaxWsProxyFactoryBean动态创建客户端:import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.example.client.ServicePortType; public class CxfClient { public static void main(String[] args) { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(ServicePortType.class); factory.setAddress("http://example.com/service"); ServicePortType port = (ServicePortType) factory.create(); String result = port.sayHello("CXF Client"); System.out.println("Response: " + result); } }
基于REST的WebService调用
RESTful WebService通常通过HTTP方法(GET、POST、PUT、DELETE)操作资源,数据格式以JSON为主,Java中可通过多种方式调用REST服务,如HttpURLConnection、Apache HttpClient、OkHttp及Spring的RestTemplate等。
使用Spring RestTemplate
RestTemplate是Spring框架提供的HTTP客户端工具,支持JSON、XML等多种数据格式,是Java调用REST服务的常用选择。
集成步骤:
-
添加依赖(Maven示例):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> -
发送GET请求示例:
import org.springframework.web.client.RestTemplate; import com.example.dto.User; public class RestTemplateClient { public static void main(String[] args) { RestTemplate restTemplate = new RestTemplate(); String url = "https://api.example.com/users/1"; // 发送GET请求并解析JSON响应为User对象 User user = restTemplate.getForObject(url, User.class); System.out.println("User Name: " + user.getName()); } } -
发送POST请求示例:

import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; public class PostRequestExample { public static void main(String[] args) { RestTemplate restTemplate = new RestTemplate(); String url = "https://api.example.com/users"; // 设置请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // 设置请求体 String requestBody = "{\"name\":\"John\", \"age\":30}"; HttpEntity<String> request = new HttpEntity<>(requestBody, headers); // 发送POST请求 ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class); System.out.println("Response Status: " + response.getStatusCode()); System.out.println("Response Body: " + response.getBody()); } }
使用OkHttp
OkHttp是高效的HTTP客户端,支持异步请求和连接池,适合高并发场景。
集成步骤:
-
添加依赖(Maven示例):
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.3</version> </dependency> -
发送GET请求示例:
import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class OkHttpExample { public static void main(String[] args) throws Exception { OkHttpClient client = new OkHttpClient(); String url = "https://api.example.com/users/1"; Request request = new Request.Builder() .url(url) .build(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { String responseBody = response.body().string(); System.out.println("Response: " + responseBody); } } } }
调用WebService的注意事项
- 处理异常与超时:网络调用可能存在超时、连接失败等问题,需设置合理的超时时间(如RestTemplate的
setConnectTimeout),并捕获HttpClientErrorException、HttpServerErrorException等异常。 - 数据格式转换:SOAP服务需处理XML解析与生成(如JAXB注解),REST服务需处理JSON与Java对象的映射(如Jackson、Gson)。
- 安全性:若WebService需认证(如HTTPS、OAuth、Basic Auth),需配置相应的安全参数,例如RestTemplate添加
BasicAuthenticationInterceptor。 - 日志调试:启用框架日志(如CXF、OkHttp的日志级别),便于排查请求/响应数据问题。
Java调用WebService需根据服务类型(SOAP/REST)选择技术方案:SOAP服务优先使用JAX-WS或Apache CXF,通过WSDL生成客户端或动态代理;REST服务则推荐Spring RestTemplate或OkHttp,灵活处理HTTP请求与JSON数据,实际开发中,需结合项目需求(如性能、安全性、维护成本)权衡选型,并注重异常处理、数据转换及安全配置,确保服务调用的稳定与高效。














