OkHttp拼接URL调用LeapML API异常,直接写URL却正常
问题分析与解决办法
你遇到的核心问题是手动字符串拼接URL导致请求异常,但直接写完整URL正常,且表面上URL输出一致,大概率是以下几个隐蔽原因导致的,对应解决办法如下:
1. 参数未做URL编码
如果modelId或inferenceId包含特殊字符(比如/、%、空格、中文等),手动拼接字符串时不会自动编码,而直接写完整URL时你可能已经手动转义过这些字符。API收到未编码的参数后无法正确识别,导致返回异常。
解决办法:用HttpUrl.Builder构建URL,自动处理编码
HttpUrl requestUrl = new HttpUrl.Builder() .scheme("https") .host("api.leapml.dev") .addPathSegment("v1") .addPathSegment("images") .addPathSegment(modelId) .addPathSegment(inferenceId) .build(); Request request = new Request.Builder() .url(requestUrl) .build();
2. 参数包含隐藏不可见字符
modelId或inferenceId可能带有换行符、制表符、全角空格这类肉眼不可见的控制字符,打印request.url()时不会显示,但实际请求中会携带这些字符,导致API无法匹配到正确的资源。
解决办法:清理参数中的控制字符
// 移除所有非打印ASCII控制字符 modelId = modelId.replaceAll("\\p{C}", ""); inferenceId = inferenceId.replaceAll("\\p{C}", ""); // 或者先去除首尾空白,再处理内部控制字符 modelId = modelId.trim().replaceAll("[\\n\\t\\r]", ""); inferenceId = inferenceId.trim().replaceAll("[\\n\\t\\r]", "");
3. URL解析的细微差异
手动拼接的字符串转URL对象时,和直接写的完整字符串在底层解析逻辑上可能存在差异(比如路径规范化、大小写处理),虽然request.url()输出一致,但实际发送的请求头或路径匹配逻辑可能不同。
解决办法:强制用HttpUrl.parse()解析拼接后的字符串
String rawUrl = "https://api.leapml.dev/v1/images/" + modelId + "/" + inferenceId; HttpUrl parsedUrl = HttpUrl.parse(rawUrl); if (parsedUrl == null) { // 处理无效URL的情况 throw new IllegalArgumentException("Invalid URL: " + rawUrl); } Request request = new Request.Builder() .url(parsedUrl) .build();
4. 路径段存在多余斜杠
如果modelId或inferenceId开头/结尾带有斜杠,手动拼接后会出现重复斜杠(比如/v1/images//xxx/yyy),虽然request.url()显示时会自动合并斜杠,但部分API的路由匹配逻辑对这类不规范路径不兼容。
解决办法:拼接前确保参数无首尾斜杠
modelId = modelId.replaceAll("^/+|/+$", ""); // 移除首尾所有斜杠 inferenceId = inferenceId.replaceAll("^/+|/+$", ""); String rawUrl = "https://api.leapml.dev/v1/images/" + modelId + "/" + inferenceId;
内容的提问来源于stack exchange,提问作者Mazen H.
相关产品推荐
相关产品推荐

