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
- 创建支持 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();
}
- 创建支持 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();
}