image
第一步:創(chuàng)建 OkHttpClient 對象(OkHttpClient代表是客服端類)
兩種創(chuàng)建方式
1:默認的纺讲,直接 new OkHttpClient() 對象
OkHttpClient client = new OkHttpClient();
2:考慮到實際開發(fā)中網(wǎng)絡情況是比較復雜的,在創(chuàng)建的時候就需要設置一些參數(shù),就需要通過 OkHttpClient 內(nèi)部類 Builder 的 Builder() 構(gòu)造方法實例化一些參數(shù),進行參數(shù)的設置。
okHttpClient=new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(IO_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(IO_TIMEOUT, TimeUnit.SECONDS)
.addNetworkInterceptor(new StethoInterceptor())//google Chrome 查看請求信息 日志
.addInterceptor(new RequestInterceptor())//請求頭
.build();
我們可以通過 Builder() 構(gòu)造方法點進去看 ===>
QQ截圖20180727095521.png
QQ截圖20180727101514.png
在通過 Builder() 構(gòu)造方法設置好了參數(shù)以后,就可以調(diào)用 OkHttpClient中的 build() 方法完成 整個的OkHttpClient 對象的創(chuàng)建。
image.png
第二步:同樣以Builder的模式創(chuàng)建了 Request 對象
Request 就是我們發(fā)送請求的報文信息,包含了
- 請求的 Url 地址
- 請求的方法 method(get萌腿,post...等等)
- 請求頭 Header
- 請求參數(shù) RequestBody
...等等。
Request request = new Request.Builder()
.url("www.baidu.com")
.get().build();
通過上面代碼可以看出 Request 也是通過 Builder 模式進行創(chuàng)建的抖苦。
QQ截圖20180727105529.png
最后再調(diào)用 Request 中的 build() 方法創(chuàng)建出 request 對象毁菱。
第三步:創(chuàng)建 Call 對象(將創(chuàng)建的request封裝成了Call對象)
就會想到什么是 Call 對象,我們可以把 Call當作連接 Request 和 Response 連接的橋梁.
我們通過 OkHttpClient 的 newCall(Request request) 方法并把創(chuàng)建好的 request 作為參數(shù)傳進去睛约,從而創(chuàng)建好我們的 call 對象
Call call=client.newCall(request);
第四步:通過 call 對象來進行同步或者異步的調(diào)用(調(diào)用Call的execute()發(fā)送同步請求)
這其實是同步請求和異步請求的分水嶺鼎俘,同步和異步前三步其實都是一樣的。但是在第四部通過 call 來進行同步和異步的方法調(diào)用就不一樣了辩涝。
try {
Response response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
我們通過 call.execute(); 來實現(xiàn)OkHttp的同步請求贸伐。 完成 Response 相應報文的讀取。
Response 包含了狀態(tài)碼怔揩,相應頭捉邢,響應信息脯丝,相應體...等等:
image.png
OkHttp同步需要注意
- 發(fā)送請求后,就會進入阻塞狀態(tài)伏伐,直到收到響應為止宠进。---->當前線程如果發(fā)送了同步請求之后,它就會進入阻塞藐翎,直到數(shù)據(jù)有響應為止材蹬,它才會停止阻塞。