改造在棒棒糖下不起作用

Posted

技术标签:

【中文标题】改造在棒棒糖下不起作用【英文标题】:Retrofit is not working below Lollipop 【发布时间】:2018-12-07 14:34:32 【问题描述】:

我正在尝试使用 Retrofit 从我的网站获取数据。它在 android 5.0 上运行良好,但较小的 android 版本显示错误消息 Connection closed by peer。这是我的代码...

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://myWebsite.com/api/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
service = retrofit.create(MyService.class);

这里是MyService

@GET
Call<CategoryResponse> getCategoryResponse(@Url String url);

我在这里缺少什么?它在 Android 5.0 上完全可以正常工作。我认为这是处理 SSL Handshake 和OkHttpClient 的问题。我不知道如何实现OkHttpClientRetrofit

这是我的日志

 06-29 10:50:49.906 10438-10438/com.dualbrotech.playwithprizes E/dalvikvm:       Could not find class 'android.support.v4.widget.DrawerLayout$1', referenced  from method android.support.v4.widget.DrawerLayout.<init>
06-29 10:50:49.914 10438-10438/com.dualbrotech.playwithprizes E/dalvikvm:  Could not find class 'android.view.WindowInsets', referenced from method  android.support.v4.widget.DrawerLayout.onDraw
06-29 10:50:49.917 10438-10438/com.dualbrotech.playwithprizes E/dalvikvm:  Could not find class 'android.view.WindowInsets', referenced from method  android.support.v4.widget.DrawerLayout.onMeasure
06-29 10:50:49.918 10438-10438/com.dualbrotech.playwithprizes E/dalvikvm: Could not find class 'android.view.WindowInsets', referenced from method android.support.v4.widget.DrawerLayout.onMeasure
06-29 10:50:51.219 10438-10611/com.dualbrotech.playwithprizes   E/NativeCrypto: Unknown error during handshake
06-29 10:50:52.194 10438-10615/com.dualbrotech.playwithprizes E/NativeCrypto: ssl=0x541654b8 cert_verify_callback x509_store_ctx=0x540adab8 arg=0x0
ssl=0x541654b8 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA
06-29 10:50:52.254 10438-10618/com.dualbrotech.playwithprizes E/NativeCrypto: Unknown error during handshake
06-29 10:50:52.296 10438-10438/com.dualbrotech.playwithprizes E/error: javax.net.ssl.SSLException: Connection closed by peer
06-29 10:51:31.769 10438-10618/com.dualbrotech.playwithprizes E/NativeCrypto: Unknown error during handshake
06-29 10:51:35.491 10438-10618/com.dualbrotech.playwithprizes E/NativeCrypto: Unknown error during handshake
06-29 10:51:35.503 10438-10438/com.dualbrotech.playwithprizes E/error: javax.net.ssl.SSLException: Connection closed by peer

【问题讨论】:

你错过了你的service.getCategoryResponse.enqueue(Call) 不,从 android 5.0 开始可以正常工作,如果我错过了它如何工作。 信息不足,请在enqueue 和您的错误日志上发布代码 @HawkPriest enqueue 没问题。我发现它需要处理 OkHttpClient。 SSL 安全性正在发生问题。对于较低的 android 版本改造必须使用 OkHttpClient 进行配置。但我不知道该怎么做。 如果是这种情况,那么您需要让您的 API 提供商更新证书,在他们的问题页面上查看此内容github.com/square/okhttp/issues/3188 【参考方案1】:

如果没有正确的 logcat,问题就不清楚了。但是,您的 API 服务器似乎存在 SSL 证书问题。您可能会考虑为您的 API 服务器管理一个有效的 SSL 证书,这将消除我认为的错误。

作为一种解决方法,您可以考虑信任所有不安全的证书,例如described here。

为方便起见,我复制了教程中的代码。

OkHttpClient okHttpClient = UnsafeOkHttpClient.getUnsafeOkHttpClient();

Retrofit.Builder builder = new Retrofit.Builder()  
        .baseUrl("http://10.0.2.2:3000/")
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();

UserService userClient = retrofit.create(UserService.class);

Call<ResponseBody> call = userClient.profilePicture("https://revoked.badssl.com/");  
call.enqueue(new Callback<ResponseBody>()   
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) 
        Toast.makeText(BadSSLActivity.this, "got response" , Toast.LENGTH_SHORT).show();
    

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) 
        Toast.makeText(BadSSLActivity.this, "SSL error?" , Toast.LENGTH_SHORT).show();
    
);

请阅读本教程以获得更好的理解。希望对您有所帮助。

【讨论】:

我添加了我的 logcat。请检查。【参考方案2】:

如果您查看Retrofit 的官方文档,它会说“Retrofit 至少需要 Java 8+ 或 Android API 21+。”,其中 API 21 是棒棒糖版本。因此,任何低于此值的内容都将不受支持。

【讨论】:

以上是关于改造在棒棒糖下不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 if 语句在这种情况下不起作用? [关闭]

为啥 selectAnnotation 在这种情况下不起作用?

为啥小写 [i] 在可视块模式下不起作用?

为啥 DISTINCT 在这种情况下不起作用? (SQL)

为啥消息处理程序在调试模式下不起作用?

为啥转换在我的情况下不起作用