android - 使用改造显示 responsejavax.net.ssl.SSLHandshakeException 错误android
问题描述
我正在使用改造来解析 json 响应。但我得到了失败的回应。
这是我正在使用的 retrofitCallBack 方法,但我得到了 onFailure 响应。
private void retrofitCallBack() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(SpinnerInterfaces.JSONURL)
.addConverterFactory(ScalarsConverterFactory.create())
.client(okHttpClient)
.build();
SpinnerInterfaces api = retrofit.create(SpinnerInterfaces.class);
Call<String> call = api.getJSONString();
final ProgressDialog progressDialog;
progressDialog = new ProgressDialog(SpinnerActivity.this);
progressDialog.setMessage(getString(R.string.loading_message));
progressDialog.setMax(100);
progressDialog.show();
call.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
Log.e("response","response"+response.body());
Log.e("response","response"+response.toString());
progressDialog.dismiss();
if (response.isSuccessful()) {
if (response.body() != null) {
String jsonresponse = response.body();
spinJSON(jsonresponse);
} else {
Toast.makeText(SpinnerActivity.this, getString(R.string.response_unsuccessful), Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.e("response","response"+t);
Log.e("response","response"+call);
progressDialog.dismiss();
Toast.makeText(SpinnerActivity.this, getString(R.string.network_failed), Toast.LENGTH_SHORT)
.show();
}
});
}
下面是我正在使用的 SpinnerInterface。
public interface SpinnerInterfaces {
String JSONURL = "https://express-it.optusnet.com.au/";
@GET("sample.json")
Call<String> getJSONString();
}
这在一个月前有效,但是当我今天检查这个项目时突然它不起作用。
我正在使用的 Gradle 是:
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.5.0'
我收到日志错误为:
responsejavax.net.ssl.SSLHandshakeException: SSL handshake aborted: ssl=0xe631cdf8: I/O error during system call, Connection reset by peer
responseretrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall@8cea2db
编辑:
我应用了这个答案,但我收到日志错误为
E/response: responsejava.net.SocketTimeoutException: SSL 握手超时
解决方案
我建议你使用 unsafe okHttp,最简单的方法来解决这个问题。
尝试这个。
OkHttpClient okHttpClient = UnsafeOkHttpClient.getUnsafeOkHttpClient();
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl("https://express-it.optusnet.com.au/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.build();
SpinnerInterfaces api = retrofit.create(SpinnerInterfaces.class);
Call<String> call = api.getJSONString();
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<ResponseBody> response) {
Log.i("response","response"+response.body());
Log.i("response","response"+response.toString());
progressDialog.dismiss();
if (response.isSuccessful()) {
if (response.body() != null) {
String jsonresponse = response.body();
spinJSON(jsonresponse);
} else {
Toast.makeText(SpinnerActivity.this, getString(R.string.response_unsuccessful), Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.e("response","response"+t);
Log.e("response","response"+call);
progressDialog.dismiss();
Toast.makeText(SpinnerActivity.this, getString(R.string.network_failed), Toast.LENGTH_SHORT).show();
}
});
UnsafeOkHttpClient
将其放在相同或不同的类文件中。没关系。
public class UnsafeOkHttpClient {
public static OkHttpClient getUnsafeOkHttpClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
源码教程futurestud.io
推荐阅读
- ios - 在 Swift 中重试 firebase 令牌
- powershell - 替换连接字符串中的数据源
- javascript - 为什么异步等待代码中的捕获不触发?
- javascript - Dygraphs:系列的一部分到单独的图例中
- java - Eclipse Spring Boot - 在 HibernateJpaAutoConfiguration 和 CacheAutoConfiguration 之间检测到自动配置周期
- string - 在抛出“std::logic_error”字符串比较的实例后调用终止
- ruby-on-rails - 如何更新rails rspec nasted let属性
- java - 如何使用 java openid 客户端库像 nodejs 一样获取 userInfo
- android - 如何将 Google Maps plus 代码转换为 Lng 和 Lat 坐标
- azure - 将图像添加到 QnA Maker