(4.2.36.2)HTTP之OkHttp(二): okhttp3与旧版本okhttp的区别分析

本文详细介绍了从OkHttp迁移到OkHttp3的主要变化,包括包名更改、OkHttpClient配置更新、Cookie管理方式调整、POST请求体构建差异等内容。

1、包名改变

包名改了由之前的 com.squareup.http.改为 okhttp3.
我们需要将导包名直接换掉,另外如果代码混淆的话记得修改progurad-rules.pro 文件中将对应包名.

2、OkHttpClient参数配置

之前参数可以直接mOkHttpClient.setCache(cache)设置,现在OkHttpClient使用创建者模式,需要在OkHttpClient.Builder上设置可配置的参数如下:

Dispatcher dispatcher; // 分发  
Proxy proxy; // 代理  
List<Protocol> protocols;  
List<ConnectionSpec> connectionSpecs;  
final List<Interceptor> interceptors = new ArrayList<>(); // 拦截器
 final List<Interceptor> networkInterceptors = new ArrayList<>(); // 网络拦截器
 ProxySelector proxySelector;  
CookieJar cookieJar;  
Cache cache; // 缓存  
InternalCache internalCache;  
SocketFactory socketFactory;  
SSLSocketFactory sslSocketFactory;  
HostnameVerifier hostnameVerifier;  
CertificatePinner certificatePinner;  
Authenticator proxyAuthenticator; // 代理证书  
Authenticator authenticator; // 证书  
ConnectionPool connectionPool;  
Dns dns; // DNS  
boolean followSslRedirects;  
boolean followRedirects;  
boolean retryOnConnectionFailure;  
int connectTimeout;  
int readTimeout;  
int writeTimeout;

例如:
okhttp3.0之前:


Paste_Image.png


okhttp3.0之后:


Paste_Image.png

3、OkHttpClient创建方式不同

okhttp直接new OkHttpClient,而okhttp3中提供了Builder,很好的使用了创建者设计模式.

4、cookie的设置方式不同:

okhttp调用OkHttpClient的setCookieHandler方法,CookieHandler是Android SDK提供的标注的cookie管理,CookieHandler的之类CookieManager实现了cookie的具体管理方法,构建CookieManager需要实现CookieStore接口,系统提供了一个默认的实现CookieStoreImpl,只负责把cookie存储在内存中。okhttp3中已经没有setCookieHandler方法了,而改成了cookieJar,新增了Builder,用Builder构建okhttp,设置cookie在Builder的cookieJar方法中设置。
如下:
okhttp3 之前用CookieHandler管理cookie,如下:

/* cookie管理 */   
 mCookieHandler = new CookieManager(null, CookiePolicy.ACCEPT_ALL);   
 mOkHttpClient.setCookieHandler(mCookieHandler);

3.0 之后新增了两个类Cookiejar、Cookie两个类,开放接口,需要用户自己去实现cookie的配管理。用户可以直接在CookieJar中简单设置Cookie的管理,如下:

okHttpClientBuilder.cookieJar(new CookieJar() {  
       private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();  
             @Override  
               public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {  
                 cookieStore.put(url, cookies);  
                }  

            @Override  
              public List<Cookie> loadForRequest(HttpUrl url) {  
                   List<Cookie> cookies = cookieStore.get(url);  
                   return cookies != null ? cookies : new ArrayList<Cookie>();  
            }  
    });

5、post消息体构建方式不同

okhttp使用MultipartBuilderFormEncodingBuilder构建post消息体,最终构建出来的都是RequestBody,而okhttp3增加了RequestBody的子类,构造器放到了RequestBody的子类中,MultipartBody.Builder既可以添加表单数据,也可以添加文件等二进制数据。
okhttp3.0之前:


Paste_Image.png


okhttp3.0之后:


Paste_Image.png

6、Call和Callback不同

okhttp的callback方法是

void onFailure(Request request, IOException e);
void onResponse(Response response) throws IOException;

okhttp3 的Callback方法有

void onFailure(Call call, IOException e);
void onResponse(Call call, Response response) throws IOException;

okhttp3对Call做了更简洁的封装,okhttp3 Call是个接口,okhttp的call是个普通class,一定要注意,无论哪个版本,call都不能执行多次,多次执行需要重新创建。

7、OkHttpClient的Cancel方法去掉

3.0之前我们去掉call 可以直接使用mOkHttpClient.cancel(tag);
3.0之后直接阉割掉此方法我们可以采用如下方法:

public void cancelCallsWithTag(Object tag) {  
        checkInit();  

        if (tag == null) {  
            return;  
        }  

        synchronized (mOkHttpClient.dispatcher().getClass()) {  
            for (Call call : mOkHttpClient.dispatcher().queuedCalls()) {  
                if (tag.equals(call.request().tag())) call.cancel();  
            }  

            for (Call call : mOkHttpClient.dispatcher().runningCalls()) {  
                if (tag.equals(call.request().tag())) call.cancel();  
            }  
        }  
    }

8、对https支持的不同

okhttp默认调用了getDefaultSSLSocketFactory方法,该方法提供了默认的SSLSocketFactory,就算不设置SSLSocketFactory也可以支持https,setSslSocketFactory没有做非空判断,如果设置为空,则使用默认的SSLSocketFactory
okhttp3设置https的方法sslSocketFactory,对SSLSocketFactory做了非空判断,为空会抛出异常。如果不主动设置SSLSocketFactory,okhttp3也提供了默认的http3支持。

if (builder.sslSocketFactory != null || !isTLS) {  
    this.sslSocketFactory = builder.sslSocketFactory;  
  } else {  
     try {  
      SSLContext sslContext = SSLContext.getInstance("TLS");  
       sslContext.init(null, null, null);  
       this.sslSocketFactory = sslContext.getSocketFactory();  
    } catch (GeneralSecurityException e) {  
       throw new AssertionError(); // The system has no TLS. Just give up.  
    }  
}
[258月2025 17:29:40.950] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher running: args [--username, Zhaoqingmi1, --version, 1.16.5-Forge_36.2.42, --gameDir, D:\Game\MINE\.minecraft\versions\1.16.5-Forge_36.2.42, --assetsDir, D:\Game\MINE\.minecraft\assets, --assetIndex, 1.16, --uuid, 000000000000300B9CCBA56441C51692, --accessToken, ????????, --userType, msa, --versionType, PCL, --width, 854, --height, 480, --launchTarget, fmlclient, --fml.forgeVersion, 36.2.42, --fml.mcVersion, 1.16.5, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20210115.111550] [258月2025 17:29:40.954] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher 8.1.3+8.1.3+main-8.1.x.c94d18ec starting: java version 24.0.1 by Oracle Corporation [258月2025 17:29:41.169] [main/INFO] [net.minecraftforge.fml.loading.FixSSL/CORE]: Added Lets Encrypt root certificates as additional trust [258月2025 17:29:41.195] [main/INFO] [STDERR/]: [org.spongepowered.asm.logging.LoggerAdapterConsole:log:82]: [17:29:41] [mixin/DEBUG] Mixin bootstrap service org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapperBootstrap is not available: LaunchWrapper is not available [258月2025 17:29:41.195] [main/INFO] [STDERR/]: [org.spongepowered.asm.logging.LoggerAdapterConsole:log:93]: [17:29:41] [mixin/ERROR] net/minecraft/launchwrapper/LaunchClassLoader [258月2025 17:29:41.195] [main/INFO] [STDERR/]: [org.spongepowered.asm.logging.LoggerAdapterAbstract:error:142]: java.lang.NoClassDefFoundError: net/minecraft/launchwrapper/LaunchClassLoader [258月2025 17:29:41.195] [main/INFO] [STDERR/]: [org.spongepowered.asm.logging.LoggerAdapterAbstract:error:142]: at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) [258月2025 17:29:41.196] [main/INFO] [STDERR/]: [org.spongepowered.asm.logging.LoggerAdapterAbstract:error:142]: at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3006) [258月2025 17:29:41.196] [main/INFO] [STDERR/]: [org.spongepowered.asm.logging.Log
08-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值