image
第一步:創建 OkHttpClient 對象(OkHttpClient代表是客服端類)
兩種創建方式
1:默認的,直接 new OkHttpClient() 對象
OkHttpClient client = new OkHttpClient();
2:考慮到實際開發中網絡情況是比較復雜的,在創建的時候就需要設置一些參數,就需要通過 OkHttpClient 內部類 Builder 的 Builder() 構造方法實例化一些參數,進行參數的設置。
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() 構造方法點進去看 ===>
QQ截圖20180727095521.png
QQ截圖20180727101514.png
在通過 Builder() 構造方法設置好了參數以后,就可以調用 OkHttpClient中的 build() 方法完成 整個的OkHttpClient 對象的創建。
image.png
第二步:同樣以Builder的模式創建了 Request 對象
Request 就是我們發送請求的報文信息,包含了
- 請求的 Url 地址
- 請求的方法 method(get,post...等等)
- 請求頭 Header
- 請求參數 RequestBody
...等等。
Request request = new Request.Builder()
.url("www.baidu.com")
.get().build();
通過上面代碼可以看出 Request 也是通過 Builder 模式進行創建的。
QQ截圖20180727105529.png
最后再調用 Request 中的 build() 方法創建出 request 對象。
第三步:創建 Call 對象(將創建的request封裝成了Call對象)
就會想到什么是 Call 對象,我們可以把 Call當作連接 Request 和 Response 連接的橋梁.
我們通過 OkHttpClient 的 newCall(Request request) 方法并把創建好的 request 作為參數傳進去,從而創建好我們的 call 對象
Call call=client.newCall(request);
第四步:通過 call 對象來進行同步或者異步的調用(調用Call的execute()發送同步請求)
這其實是同步請求和異步請求的分水嶺,同步和異步前三步其實都是一樣的。但是在第四部通過 call 來進行同步和異步的方法調用就不一樣了。
try {
Response response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
我們通過 call.execute(); 來實現OkHttp的同步請求。 完成 Response 相應報文的讀取。
Response 包含了狀態碼,相應頭,響應信息,相應體...等等:
image.png
OkHttp同步需要注意
- 發送請求后,就會進入阻塞狀態,直到收到響應為止。---->當前線程如果發送了同步請求之后,它就會進入阻塞,直到數據有響應為止,它才會停止阻塞。