第一步:创建 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() 构造方法点进去看 ===>
在通过 Builder() 构造方法设置好了参数以后,就可以调用 OkHttpClient中的 build() 方法完成 整个的OkHttpClient 对象的创建。
第二步:同样以Builder的模式创建了 Request 对象
Request 就是我们发送请求的报文信息,包含了
- 请求的 Url 地址
- 请求的方法 method(get,post...等等)
- 请求头 Header
- 请求参数 RequestBody
...等等。
Request request = new Request.Builder()
.url("www.baidu.com")
.get().build();
通过上面代码可以看出 Request 也是通过 Builder 模式进行创建的。
最后再调用 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 包含了状态码,相应头,响应信息,相应体...等等:
OkHttp同步需要注意
- 发送请求后,就会进入阻塞状态,直到收到响应为止。---->当前线程如果发送了同步请求之后,它就会进入阻塞,直到数据有响应为止,它才会停止阻塞。