无WSDL且需用户名密码验证的Web Service如何在Java中调用
问题解决方案
1 补充Maven依赖
首先在pom.xml中添加Jackson JSON处理依赖,你提到的APOD不需要额外引入依赖,是需要自行定义的、和接口返回字段匹配的实体类:
<dependencies> <!-- Jackson JSON序列化/反序列化依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 可替换为和你项目JDK版本适配的最新稳定版 --> </dependency> </dependencies>
2 补全身份验证逻辑
你现有代码没有添加用户名密码的认证逻辑,这类无WSDL的HTTP接口通常使用Basic Auth认证,需要将用户名:密码格式的字符串做Base64编码后放入请求头。
3 完整可运行代码示例
import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Base64; import com.fasterxml.jackson.databind.ObjectMapper; public class ServiceCallTest { public static void main(String[] args) throws Exception { // 替换为实际的服务地址、用户名、密码 String targetUrl = "你的Postman中调用的实际URL"; String username = "你获取到的用户名"; String password = "你获取到的密码"; URL url = new URL(targetUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 配置Basic Auth认证头 String authStr = username + ":" + password; String encodedAuth = Base64.getEncoder() .encodeToString(authStr.getBytes(StandardCharsets.UTF_8)); connection.setRequestProperty("Authorization", "Basic " + encodedAuth); // 按需修改请求方法,默认GET,POST请求需额外配置请求体 connection.setRequestMethod("GET"); // 发起请求获取返回流 try (InputStream responseStream = connection.getInputStream()) { ObjectMapper objectMapper = new ObjectMapper(); APOD apod = objectMapper.readValue(responseStream, APOD.class); System.out.println(apod.title); } finally { connection.disconnect(); } } } // 自定义APOD实体类,字段名、类型需和接口返回的JSON字段完全匹配 class APOD { public String title; // 此处补充接口返回的其他所有对应字段,也可以给字段添加get/set方法 }
4 异常排查
- 若返回401状态码:检查用户名密码是否正确,是否有特殊字符需要转义
- 若返回405状态码:检查请求方法是否和接口要求一致,GET/POST不要填错
- 若JSON解析报错:检查APOD实体类的字段和接口返回是否匹配,不匹配的字段可以加
@JsonProperty("实际字段名")注解做映射 - 若为POST请求:需要额外添加
connection.setDoOutput(true),并将请求参数写入连接的输出流中
内容的提问来源于stack exchange,提问作者jaConfu
相关产品推荐
相关产品推荐

