Navitia API Token在Chrome可用,Java代码调用返回401错误
问题原因
你在URL里用{myToken}@的方式传递认证信息时,Chrome会自动将其解析为HTTP基本认证逻辑(把token作为用户名,密码留空),但Java的HttpURLConnection并不会自动处理这种嵌入在URL里的认证信息,导致请求未携带正确的认证头,最终返回401未授权错误。
解决方案
需要手动为请求添加HTTP基本认证的Authorization头,具体步骤如下:
- 调整URL结构:移除URL中的
{myToken}@部分,基础URL改为https://api.navitia.io/v1/journeys - 生成认证头内容:将你的token作为用户名,空字符串作为密码,拼接成
{你的token}:格式,再对该字符串进行Base64编码,最终组合成Basic 编码后的字符串格式的认证头 - 为请求设置认证头:给
HttpURLConnection对象添加Authorization请求头
修改后的代码示例
import java.net.URL; import java.net.HttpURLConnection; import java.util.Base64; public class NavitiaApiCall { public static void main(String[] args) throws Exception { String token = "你的实际token"; String longDeparture = "出发地经度"; String latDeparture = "出发地纬度"; String longArrival = "目的地经度"; String latArrival = "目的地纬度"; // 构建不含认证信息的请求URL String sURL = "https://api.navitia.io/v1/journeys?from=" + longDeparture + ";" + latDeparture + "&to=" + longArrival + ";" + latArrival; URL url = new URL(sURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // 生成并设置Authorization认证头 String authStr = token + ":"; String encodedAuth = Base64.getEncoder().encodeToString(authStr.getBytes()); conn.setRequestProperty("Authorization", "Basic " + encodedAuth); conn.connect(); int responseCode = conn.getResponseCode(); if (responseCode != 200) { throw new RuntimeException("HttpResponseCode: " + responseCode); } else { // 这里处理返回的有效数据 } } }
额外说明
- 如果你的token包含特殊字符,需要先对其进行URL编码(Navitia的token通常为无特殊字符的字符串,一般无需额外处理)
- 若使用Java 8之前的版本,可改用
javax.xml.bind.DatatypeConverter.printBase64Binary方法或Apache Commons Codec等第三方库完成Base64编码
内容的提问来源于stack exchange,提问作者Fadi
相关产品推荐
相关产品推荐

