请求指定URL获取JSON时触发java.io.IOException:403错误求助
解决API调用403权限错误的方案
我一眼就注意到你代码里的授权请求头格式有问题,这大概率是导致403错误的核心原因。咱们一步步来梳理解决:
1. 先定位问题根源
403状态码明确表示服务器拒绝了你的请求,结合代码片段来看,问题出在这行授权头的写法上:
String key ="Authorization : 402c669e45534f868f5d2dd53c8e345f,a80797e0df9c4696b5494635dae02461";
这里有两个明显的问题:
- 头名称
Authorization和冒号之间多了空格,虽然HTTP规范允许冒号前后有空格,但这种写法容易被服务器解析出错 - 两个密钥直接用逗号分隔,不符合绝大多数API的授权格式——如果API要求同时传递两个密钥,通常是分成独立的请求头,或者需要指定授权类型(比如
Authorization: ApiKey <key1>,<key2>,具体得看API文档)
2. 修正后的代码示例
不要把完整的头字符串直接赋值,应该通过HttpURLConnection的setRequestProperty方法单独设置请求头。以下是调整后的完整代码:
InputStream is = null; JsonReader rdr = null; OutputStreamWriter out = null; String path = "http://test.dotconnect.io/data_api/reports/1bf4bc70b31d4d92b50a6d965c52fcec"; int timeout = 6000000; try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // 根据API要求切换GET/POST conn.setConnectTimeout(timeout); conn.setReadTimeout(timeout); // 这里提供两种常见的授权头设置方式,你需要对照API文档选对应格式 // 方式1:两个密钥作为独立请求头(多数API的常规做法) conn.setRequestProperty("X-API-Key", "402c669e45534f868f5d2dd53c8e345f"); conn.setRequestProperty("X-Secret-Key", "a80797e0df9c4696b5494635dae02461"); // 方式2:如果API要求在Authorization头里组合两个密钥(需确认格式) // conn.setRequestProperty("Authorization", "ApiKey 402c669e45534f868f5d2dd53c8e345f,a80797e0df9c4696b5494635dae02461"); // 发起请求并处理响应 int responseCode = conn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { is = conn.getInputStream(); rdr = JsonReaderFactory.createReader(is); // 在这里处理返回的JSON数据 } else { System.err.println("Server returned HTTP response code: " + responseCode + " for URL: " + path); } } catch (IOException e) { e.printStackTrace(); } finally { // 确保资源关闭(也可以用try-with-resources语法简化) try { if (rdr != null) rdr.close(); if (is != null) is.close(); if (out != null) out.close(); } catch (IOException e) { e.printStackTrace(); } }
3. 额外排查点
如果修正后还是报错,可以试试这几个方向:
- 切换HTTPS协议:有些API会拒绝HTTP请求,只接受HTTPS,把URL改成
https://test.dotconnect.io/...试试 - 验证密钥有效性:确认你的两个密钥没有过期,且权限范围包含访问该报表接口
- 补充必要请求头:部分API要求设置
User-Agent模拟浏览器请求,可添加:conn.setRequestProperty("User-Agent", "Mozilla/5.0")
内容的提问来源于stack exchange,提问作者Rada Aflah
相关产品推荐
相关产品推荐

