Retrofit - URL 格式错误问题、支持 HTTP 与 HTTPS

URL 格式错误问题

1、演示
java 复制代码
private static Retrofit getHttpRetrofit(String url) {

    // 日志拦截器
    HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
    httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
    okHttpClientBuilder.addInterceptor(httpLoggingInterceptor);
    OkHttpClient okHttpClient = okHttpClientBuilder.build();

    // 构建 Retrofit 对象
    return new Retrofit.Builder()
            .baseUrl(url)
            .client(okHttpClient)
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create()) // 解析实体类
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 结合 RxJava
            .build();
}
java 复制代码
getHttpRetrofit("http://www.mytest.com:12345:12345");
复制代码
# 输出结果

FATAL EXCEPTION: main
Process: com.my.retrofit, PID: 3818
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.retrofit/com.my.retrofit.MyTestActivity}: java.lang.IllegalArgumentException: Invalid URL port: "12345:12345"
2、处理策略
  • 使用 try catch 包裹
java 复制代码
try {
    getHttpRetrofit("http://www.mytest.com:12345:12345");
} catch (Exception e) {
    Log.e(TAG, "Retrofit 对象创建失败:" + e.getMessage());
}
复制代码
# 输出结果

Retrofit 对象创建失败:Invalid URL port: "12345:12345"

支持 HTTP 与 HTTPS

  1. 创建支持 HTTP 的 Retrofit 对象
java 复制代码
private static Retrofit getHttpRetrofit(String url) {

    // 日志拦截器
    HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
    httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
    okHttpClientBuilder.addInterceptor(httpLoggingInterceptor);
    OkHttpClient okHttpClient = okHttpClientBuilder.build();

    // 构建 Retrofit 对象
    return new Retrofit.Builder()
            .baseUrl(url)
            .client(okHttpClient)
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create()) // 解析实体类
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 结合 RxJava
            .build();
}
  1. 创建支持 HTTPS 的 Retrofit 对象(忽略证书验证)
java 复制代码
private static Retrofit getHttpsRetrofit(String url) {

    // 日志拦截器
    HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
    httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
    okHttpClientBuilder.addInterceptor(httpLoggingInterceptor);

    TrustManager[] trustManagers = new TrustManager[]{
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) {
                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[]{};
                }
            }
    };

    SSLContext sslContext = null;
    try {
        sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustManagers, new SecureRandom());
    } catch (NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
    }
    if (sslContext != null) {
        okHttpClientBuilder.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagers[0]);
        okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true; // 不验证主机名
            }
        });
    }

    OkHttpClient okHttpClient = okHttpClientBuilder.build();

    // 构建 Retrofit 对象
    return new Retrofit.Builder()
            .baseUrl(url)
            .client(okHttpClient)
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create()) // 解析实体类
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 结合 RxJava
            .build();
}
相关推荐
考虑考虑5 小时前
JDK26中的Map.ofLazy
java·后端·java ee
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源