【笔记】使用HttpClient时因为空格出现的java.lang.IllegalArgumentException异常解决

在Java中,URL(统一资源定位符)的值如果包含空格,那么这些空格在URL中必须被编码,因为空格在URL中有特殊的含义(通常用作参数分隔符)。在URL中,空格可以通过%20来编码。

当你使用Java的URL类或者HttpURLConnection、HttpClient(Java 11及以上版本中的HttpClient,或者Apache HttpClient等第三方库)等HTTP客户端时,通常不需要手动编码URL中的空格,因为大多数库都提供了自动编码URL参数的机制。但是,如果你是在构造一个完整的URL字符串并直接传递给这些库,那么你可能需要手动对URL中的空格进行编码。

以下是一个示例,展示如何手动对URL中的空格进行编码,并使用HttpURLConnection发送请求:

java
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class URLExample {
public static void main(String[] args) {
try {
// 原始URL,包含空格
String originalUrl = “http://example.com/search?query=Hello World”;

        // 对查询参数进行编码  
        String encodedQuery = URLEncoder.encode("Hello World", "UTF-8");  

        // 构造完整的URL,注意URL的其它部分(如路径)一般不需要编码  
        String fullUrl = "http://example.com/search?query=" + encodedQuery;  

        // 打开URL连接  
        URL url = new URL(fullUrl);  
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();  

        // 设置请求方法  
        conn.setRequestMethod("GET");  

        // 发送请求(对于GET请求,这一步是可选的,因为连接打开时就会发送请求)  
        int responseCode = conn.getResponseCode();  
        System.out.println("Response Code: " + responseCode);  

        // 读取响应(这里仅作为示例,实际情况中可能需要处理响应内容)  
        // ...  

        // 关闭连接  
        conn.disconnect();  

    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}  

}
注意:

在这个例子中,我仅对查询参数进行了编码,因为查询参数中的空格需要被替换为%20。URL的路径部分(即http://example.com/search)中的字符通常不需要编码,除非它们有特殊含义(如?、=、&、#等)。
如果你使用的是HttpClient(Java 11及以上版本)或Apache HttpClient等库,那么这些库通常会在发送请求时自动处理URL编码问题,你不需要手动编码URL。
当处理用户输入或动态生成的URL时,总是对URL的查询参数进行编码是一个好习惯,这可以防止因特殊字符或空格而导致的潜在问题。

猜你喜欢

转载自blog.csdn.net/Aliano217/article/details/140351857