Java调用ImageIO读取WeatherStack API天气图标返回null问题咨询
加载失败原因
WeatherStack的静态资源CDN配置了反爬虫校验,会校验HTTP请求的User-Agent请求头:
- Java
ImageIO.read(URL)方法默认发送的HTTP请求没有携带浏览器标准的User-Agent标识,被CDN判定为非法爬虫请求,直接返回非图片格式的错误响应(通常是403状态码的错误页) - ImageIO无法识别错误响应的内容为有效图片,因此返回
null,后续初始化ImageIcon时触发空指针异常
修复方案
手动构造HTTP请求,添加浏览器标准User-Agent头,拿到合法图片输入流后再交给ImageIO读取即可。
可正常运行的代码
import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; public class NewClass { public static void main(String[] args) throws IOException { String imgUrl = "https://assets.weatherstack.com/images/wsymbols01_png_64/wsymbol_0025_light_rain_showers_night.png"; // 手动打开连接并配置请求头 URL url = new URL(imgUrl); URLConnection connection = url.openConnection(); // 设置标准浏览器User-Agent绕过反爬校验 connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); // 读取图片 Image image = null; try (InputStream inputStream = connection.getInputStream()) { image = ImageIO.read(inputStream); } System.out.println(image); // 窗口展示逻辑 JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel lblimage = new JLabel(new ImageIcon(image)); JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.add(lblimage); frame.getContentPane().add(mainPanel, BorderLayout.CENTER); frame.setSize(300, 400); frame.setVisible(true); } }
内容的提问来源于stack exchange,提问作者regragui karim
相关产品推荐
相关产品推荐

