解决java.lang.IllegalArgumentException: Invalid uri由无效查询引起的问题

在Java编程中,当你尝试构造或使用一个不正确格式的URI(统一资源标识符)时,可能会遭遇 java.lang.IllegalArgumentException: Invalid uri异常。这个错误表明你提供的URI字符串不符合规范,可能是由于编码错误、无效字符、遗漏重要部分或查询参数组织不当等。

为了解决这个问题,首先需要理解URI的结构。一个标准的URI通常包括以下部分:协议(如http, https),主机名,端口号(可选),路径,以及查询字符串。URI有严格的格式要求,而且部分字符在URI中有特殊含义,它们需要被编码(例如空格转换为 %20)。

下面是常见问题和修复建议:

1. 仔细检查URI字符串是否完整。
确认协议(如http或https)是否已经包括在你的字符串中,而且格式正确。

2. 确保没有非法字符。
对URI部分使用 URLEncoder类进行编码,特别是查询参数值。

3. 对查询参数进行正确编码。
在Java中,使用 java.net.URLEncoder.encode(String s, String encoding)方法对所有参数进行编码。指定编码通常为"UTF-8"。

4. 使用URI/URL构建器类。
大多数现代Java HTTP客户端库(如Apache HttpClient、Spring's RestTemplate或OkHttp)提供了URI/URL构建器工具,这些工具可以自动处理特殊字符的编码问题。

5. 参数值不要为null。
在构建查询字符串时,确保没有一个键对应的值为null,这将导致非法的URI字符串。

6. 分隔符的使用必须正确。
路径和查询参数之间用问号(?)分隔,而多个查询参数之间使用和号(&)分隔。

下面是一个处理URI编码问题的示范代码,使用Java标准库进行操作:

import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class URIFixer {
    public static void main(String[] args) {
        try {
            String baseUri = "https://api.example.com/data";
            String queryParam1 = "param1 value";
            String queryParam2 = "param2&value";

            // 对查询参数进行编码
            String encodedQueryParam1 = URLEncoder.encode(queryParam1, StandardCharsets.UTF_8.name());
            String encodedQueryParam2 = URLEncoder.encode(queryParam2, StandardCharsets.UTF_8.name());

            // 构建安全的URI,避免非法字符
            URI uri = new URI(baseUri + "?param1=" + encodedQueryParam1 + "&param2=" + encodedQueryParam2);

            // 使用URI
            System.out.println(uri.toString());
        } catch (URISyntaxException e) {
            // 异常处理逻辑
            e.printStackTrace();
        } catch (Exception e) {
            // 其他异常处理
            e.printStackTrace();
        }
    }
}
​
 
 

以上示例代码演示了如何使用 URLEncoder和 URI类来构建有效的URI字符串。通过编码查询参数并按正确的格式构建URI,可以避免 java.lang.IllegalArgumentException: Invalid uri异常。

posted @ 2025-09-16 15:07  风一直那个吹  阅读(8)  评论(0)    收藏  举报