Java读取企业内网JSON接口返回HTML表格的问题及解决
内网API请求返回HTML而非JSON的问题解决
问题场景
我尝试从公司内网读取JSON数据,已经配置了代理:
- 要么使用系统代理:
System.setProperty("java.net.useSystemProxies", "true"); - 要么手动指定代理地址:
System.setProperty("https.proxyHost", "XX.XX.XX.XX"); System.setProperty("https.proxyPort", "XXXX");
在公网环境调用公开API时一切正常,但请求公司内部API时,返回的不是预期的JSON,而是一段HTML表格:
status message_code devices message 1 SUCCESS Array Success
之前试过两种读取方式都没解决问题:
- 使用
IOUtils.toString(url, Charset.forName("UTF-8")); - 基于
URLConnection的读取逻辑:URLConnection yc = oracle.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
问题根源
公司内部的API大概率是根据请求头的Accept字段来返回不同格式的响应——当请求没有明确指定接受JSON时,API默认返回了更适合浏览器展示的HTML表格格式。
解决方案
核心就是在请求中添加Accept: application/json请求头,明确告诉服务器我们需要JSON格式的响应。最终解决的代码如下:
URL url = new URL(sURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // 关键:指定客户端期望接受JSON格式 conn.setRequestProperty("Accept", "application/json"); BufferedReader br = new BufferedReader(new InputStreamReader( (conn.getInputStream()))); // 后续可读取br流中的内容并解析为JSON对象
补充说明
HttpURLConnection会自动沿用你之前配置的系统代理属性,不需要额外重新配置代理;- 这个方法的本质是通过请求头和服务器做“协商”,确保返回的内容格式符合预期,很多企业内网API都会做这种多格式响应支持。
内容的提问来源于stack exchange,提问作者Henry Lancy Muschett Oliva
相关产品推荐
相关产品推荐

