调用Web Service时出现UnknownHostException异常
嘿,这个问题我碰到过好几次了!Postman能正常调用但Java客户端报java.net.UnknownHostException: www.api.com,本质上是Java环境没法解析目标域名——毕竟Postman和Java用的可能不是同一套网络配置,下面给你几个实用的排查方向:
先排查Java的DNS解析配置
Postman默认用的是系统DNS,但Java有时候会有自己的网络偏好设置。比如如果你的系统IPv6配置有问题,Java可能优先用IPv6解析导致失败。可以试试在启动Java程序时加上这个参数:-Djava.net.preferIPv4Stack=true要是还是不行,也可以手动指定公共DNS服务器,比如谷歌的8.8.8.8:
-Dsun.net.spi.nameservice.nameservers=8.8.8.8确认代码里的域名绝对正确
别笑,有时候就是手滑输错了!对比Postman里的URL,确保Java代码里的www.api.com没有拼写错误——比如多了个w、少了个点,甚至不小心加了个空格。虽然域名不区分大小写,但最好完全和Postman里的一致。检查代理设置是否匹配
你的Postman可能配置了代理才能访问外部网络,但Java客户端没同步设置。如果你的网络需要代理,得在Java代码里加上代理配置:// HTTP代理 System.setProperty("http.proxyHost", "你的代理主机"); System.setProperty("http.proxyPort", "代理端口"); // HTTPS代理(如果API是HTTPS的话) System.setProperty("https.proxyHost", "你的代理主机"); System.setProperty("https.proxyPort", "代理端口");或者用
Proxy对象把代理直接绑定到HTTP请求里,具体看你用的是HttpClient还是其他框架。写个极简程序测试域名解析
先抛开你的业务代码,写个小测试程序单独验证Java能不能解析这个域名:import java.net.InetAddress; public class DNSCheck { public static void main(String[] args) { try { InetAddress addr = InetAddress.getByName("www.api.com"); System.out.println("解析到的IP: " + addr.getHostAddress()); } catch (Exception e) { e.printStackTrace(); } } }如果这个程序也报错,那问题肯定在Java环境的网络配置上;如果能成功解析,那大概率是你的业务代码里的HTTP客户端配置有问题——比如自定义了网络连接池、错误处理了URL之类的。
排查防火墙或安全软件的拦截
有些防火墙、杀毒软件会专门限制Java程序的网络访问,或者拦截特定域名的解析。可以暂时关闭防火墙试试,如果能正常调用,那就是安全软件的锅,记得给你的Java程序添加访问该域名的权限规则。
内容的提问来源于stack exchange,提问作者Rohitesh

