Response类 —— 主要是对响应报文的概念的实现。
响应报文的结构图
可以看到响应报文的结构和请求报文的结构差不多。只是具体细节有些不同。
我们根据响应报文的结构来了解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类,对于一些属性一眼就能知道是什么意思,所以还是要好好看看响应报文的结构图的。