OkHttp3源码(六) ------ Response

Response类 —— 主要是对响应报文的概念的实现。
响应报文的结构图
123
可以看到响应报文的结构和请求报文的结构差不多。只是具体细节有些不同。

我们根据响应报文的结构来了解Response源码。

1、Respons的属性

//得到该响应报文的请求报文
final Request request;
//返回响应报文用的协议,这个是个枚举类。------对应上图协议版本
final Protocol protocol;
//响应码 ------ 对应上图状态码
final int code;
//响应信息 ------ 对应上图状态描述
final String message;
//响应头 ------ 对应上图响应头部
final Headers headers;
//响应体 ------ 对应上图响应正文
final ResponseBody body;
//源服务器返回的响应报文
final Response networkResponse;
//发送请求的时间,毫秒
final long sentRequestAtMillis;
//得到响应报文的时间,毫秒
final long receivedResponseAtMillis;
//缓存的响应报文
final Response cacheResponse;
//重连接得到的响应报文
final Response priorResponse;
//将响应头中的缓存信息封装到CacheControl类中
private volatile CacheControl cacheControl; 

对于上面的属性是不是只有protocol和 responseBody没有见过。
其实Protocol就是将网络通信的协议列举了出来,其中协议有 Http/1.0、Http/1.1、h2、spdy/3.1。
对于ResponseBody下篇博客会讲。

2、构造方法

//构造函数,通过Builder给属性赋值
MyResponse(Builder builder) {
//。。。。。。
//。。。。。。
//。。。。。。
}

只有一个构造方法,并且也是通过Builder模式实现赋值的。

3、Response类中的主要方法。

//根据字节数得到响应体中的部分响应体。
public ResponseBody peekBody(long byteCount) throws IOException {
BufferedSource source = body.source();
source.request(byteCount);
Buffer copy = source.buffer().clone();
Buffer result;
if (copy.size() > byteCount) {
result = new Buffer();
result.write(copy, byteCount);
copy.clear();
} else {
result = copy;
}

return ResponseBody.create(body.contentType(), result.size(), result);
}

//根据状态码判断是否重定向
public boolean isRedirect() {
switch (code) {
case HTTP_PERM_REDIRECT:
case HTTP_TEMP_REDIRECT:
case HTTP_MULT_CHOICE:
case HTTP_MOVED_PERM:
case HTTP_MOVED_TEMP:
case HTTP_SEE_OTHER:
return true;
default:
return false;
}
}

//关闭响应报文中的响应正文对应的流
@Override public void close() {
body.close();
}

上面的主要方法,对于用户来说常用的就是close()—–资源释放。
对于Response的其它方法,就是获取每个属性。

4、Builder类

//下面是Builder类作用是给Response类的各个属性赋值
public static class Builder {
//。。。。。。
//。。。。。。
//。。。。。。
}

对照着响应报文的结构图来理解Response类,对于一些属性一眼就能知道是什么意思,所以还是要好好看看响应报文的结构图的。

猜你喜欢

转载自blog.csdn.net/look_Future/article/details/79731146