【问题标题】:Using OkHttp on api level less than API 21在低于 API 21 的 API 级别上使用 OkHttp
【发布时间】:2020-06-15 18:50:38
【问题描述】:

我一直在为我的应用寻找最好的网络客户端,然后我登陆 OkHttp 或改造,但它们都需要 API 级别 21+,我的应用当前的 minSdkVersion 是 17,所以我应该将我的 minSdkVersion 提高到 API 21还是我应该使用 OkHttp 3.12.x 分支,如果您有任何其他解决方案,我想听听您的想法。

请注意,他们在 OkHttp 网站上说:

“OkHttp 3.12.x 分支支持 Android 2.3+(API 级别 9+)和 Java 7+。 这些平台缺乏对 TLS 1.2 的支持,因此不应该 使用。但是由于升级很困难,我们将向后移植关键 在 2021 年 12 月 31 日之前修复 3.12.x 分支。”

【问题讨论】:

    标签: android retrofit okhttp


    【解决方案1】:

    如果您决定支持 21 岁以上的客户,您应该做几件事

    1. 退回到 OkHttp 3.12.12,它将继续获得安全修复。
    2. 帮助尽可能地保护这些旧客户端,因为它们本身不安全,并且由于保留对旧密码等的支持而使您的服务器不那么安全。

    在你的构建文件中

      implementation 'org.conscrypt:conscrypt-android:2.4.0'
    

    并在您提出请求之前激活 Conscrypt

    import org.conscrypt.Conscrypt
    
    
    Security.insertProviderAt(Conscrypt.newProvider(), 1)
    val client = OkHttpClient.Builder().build()
    
    val request = Request.Builder().url("https://status.datadoghq.com/").build()
    client.newCall(request).execute().use { response ->
      println(response.code())
    }
    

    这应该允许您的旧客户端支持 TLSv1.2。

    您可能还需要降级 Retrofit,但我不确定那里有什么正确的建议。也许到 2.6.4?

    https://github.com/square/retrofit/blob/master/CHANGELOG.md

    【讨论】:

    • 但是如何考虑使用 httpurlconnection 或 volley?
    • 不知道,抱歉。
    【解决方案2】:

    我建议增加 minSdkVersion,因为改造依赖于特殊的库。

    虽然如果不想增加api,可以使用asyntask调用service

    例子

    package principal.example;
    
    import android.os.AsyncTask;
    import android.util.Log;
    
    import java.io.IOException;
    import java.net.URL;
    import java.net.HttpURLConnection;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class Post extends AsyncTask<String, Void, String> {
    
        private InputStreamReader inputStreamReader;
        private BufferedReader bufferedReader;
    
        @Override
        protected String doInBackground(String... params){
    
            try {
                URL obj = new URL(params[0]);
                HttpURLConnection con = (HttpURLConnection) obj.openConnection();
                con.setRequestMethod("GET");
                con.setRequestProperty("User-Agent", " ");
                con.connect();
                inputStreamReader=new InputStreamReader(con.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader);
                return bufferedReader.readLine();
            }catch(Exception e){
                Log.d("Url  doInBackground", e.toString());
                return null;
            } finally {
                try {
                    closeConnection();
                } catch(Exception e){
    
                }
            }
    
        }
    
        private void closeConnection() {
            try {
                if(bufferedReader!=null){
                    bufferedReader.close();
                }
    
                if(inputStreamReader!=null){
                    inputStreamReader.close();
                }
            }catch(IOException ex){
                Log.d("Url disconnect", ex.toString());
            }
        }
    
        @Override
        protected void onPostExecute(String result){
    
            super.onPostExecute(result);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 2017-07-21
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 2018-12-09
      • 2015-01-15
      相关资源
      最近更新 更多