OkHttp原始碼初探

2021-08-02 16:39:20 字數 3782 閱讀 7041

在之前的文章我中我們介紹了okhttp的基本使用方法並簡單說明了原始碼下各個module的功能作用,從這篇開始我們將要開始分析okhttp的原始碼。

首先,我們先來回憶一下okhttp的使用過程:

1.建立乙個okhttpclient物件

2.建立乙個request物件

3.呼叫okhttpclient的newcall方法建立request的call例項

4.呼叫call的execute 或 enqeue方法分別啟動同步非同步請求獲取response

上述我們涉及到幾個概念okhttpclient, request, call, response 我們將分別來分析一下這些內容。

乙個request是一次請求的抽象,我們先簡單看下裡面的引數:

可以看到乙個request 基本包含乙個請求的url 請求的方法, headers 和 請求的body,還有乙個tag。

關於request的具體內容,我們會在後面的系列文章中來進行分析。

我們可以看到okhttpclient基本上是和okhttp打交道的門戶,我們先來看一下okhttpclient的定義:

可以看到okhttpclient實現了介面call.factory 和 websocket,factory顧名思義,okhttpclient將負責建立call 和 websocket的例項,在這裡我們先對websocket不做考慮,我們講桌布分析http的請求。

okhttpclient使用了建立者模式,使用乙個builder物件來控制構建乙個okhttpclient所需的各項配置,我們來看一下builder中的引數:

final dispatcher dispatcher;

final

@nullable proxy proxy;

final listprotocols;

final listconnectionspecs;

final listinterceptors;

final listnetworkinterceptors;

final eventlistener.factory eventlistene***ctory;

final proxyselector proxyselector;

final cookiejar cookiejar;

final

@nullable cache cache;

final

@nullable internalcache internalcache;

final socketfactory socketfactory;

final

@nullable sslsocketfactory sslsocketfactory;

final

@nullable certificatechaincleaner certificatechaincleaner;

final hostnameverifier hostnameverifier;

final certificatepinner certificatepinner;

final authenticator proxyauthenticator;

final authenticator authenticator;

final connectionpool connectionpool;

final dns dns;

final

boolean followsslredirects;

final

boolean followredirects;

final

boolean retryonconnectionfailure;

final

int connecttimeout;

final

int readtimeout;

final

int writetimeout;

final

int pinginterval;

除了一些http的配置外,我們可以看到3個特殊的概念配置,分別是eventlistener.factory dispatcher 和 interceptor

我們先來看一下eventlistener 至於dispatcher 和 interceptor我們會在系列文章的後續部分看到詳細的分析,其中dispatcher是來管理分發請求任務的,interceptor是***。

abstract class eventlistener ;

static eventlistener.factory factory(final eventlistener listener)

};} public

void

fetchstart(call call)

public

void

dnsstart(call call, string domainname)

public

void

dnsend(call call, string domainname, listinetaddresslist,

throwable throwable)

public

void

connectstart(call call, inetaddress address, int port)

public

void

secureconnectstart(call call)

public

void

secureconnectend(call call, handshake handshake,

throwable throwable)

public

void

connectend(call call, inetaddress address, int port, string protocol,

throwable throwable)

public

void

requestheadersstart(call call)

public

void

requestheadersend(call call, throwable throwable)

...public

inte***ce

factory {

eventlistener create(call call);

我們可以看到eventlistener是對請求過程中各個步驟的事件監聽.

一次具體的請求, okhttpclient通過newcall建立了call物件,通過call物件的execute 或 enqeue來發起請求

網路返回的結果,我們將在後續文章中進行詳細的解析。

OkHttp 原始碼分析

先來看 new okhttpclient 然後 clien.newcall request 建立了 realcall 物件,這也是 okhttp 中乙個重要的類,先來分析非同步執行的原始碼吧,因為同步執行跟非同步的後半段沒什麼區別了。override public void enqueue call...

OkHttp原始碼解析

okhttp對外的入口,可以理解為okhttp的平台,其定義了網路協議 dns 請求時間等 網路請求的執行者,enqueue為非同步請求需要傳入okhttpcallback,exexute 為同步請求,直接返回response 網路請求資訊的封裝類,內建url head 請求方式method 請求引...

okhttp原始碼解析

okhttp是乙個非常優秀的網路請求框架,已被谷歌加入到android的原始碼中。目前比較流行的retrofit也是預設使用okhttp的。所以okhttp的原始碼是乙個不容錯過的學習資源,學習原始碼之前,務必熟練使用這個框架,否則就是跟自己過不去。至於為什麼有這麼多優點,各位看官老爺在下面的原始碼...