前言
本篇主要看下CallServerInterceptor
, 关于他在整个请求中起到的作用, okHttp已经告诉我们, 可以看出它作为责任链中的最后一个环节, 承担了对服务端进行请求的工作.
This is the last interceptor in the chain. It makes a network call to the server.
正文
okHttp
对于对服务钱的请求与相应, 底层都是通过okio
对socket
进行操作.
老样子, 我们直接上代码
1 | public Response intercept(Chain chain) throws IOException { |
请求
我们来一步步看下代码
1 | RealInterceptorChain realChain = (RealInterceptorChain) chain; |
在CallServerInterceptor
在, 核心工具类就是HttpCodec
, 他的初始化我们在上篇ConnectInterceptor解析中可以看到.这里的步骤其实就是工具的准备.
1 | httpCodec.writeRequestHeaders(request); |
我们以HTTP/1.1协议来看, 那么具体要看Http1Codec
中的实现
1 | public void writeRequestHeaders(Request request) throws IOException { |
可以看到在writeRequest
中的方法, 就是针对BufferedSink
对象的写操作, 在上篇ConnectInterceptor
中进行三次握手连接的时候, 会进行初始化的工作, 我们会发现他是针对Socket
的包装, 可以看做是Socket
的输出流, 所以这里相当于是Socket
的写入动作, 可以看出来, 这里会请求发送header
.
1 | if (HttpMethod.permitsRequestBody(request.method()) && request.body() != null) { |
当请求首部字段包含Expect:100-continue
, 一般在请求上传大容量body或者是需要验证的时候, 这样避免大文件传送失败带来的带宽浪费。所以需要判断请求体不为空的情况下, 并且请求首部包含该字段的情况下, 刷新请求, 构建responseBuilder
对象, 如果这个时候服务端响应成功, 则responseBuilder
对象为null, 并进行body的请求;而如果第一次请求头响应失败的情况下, 那么如果是HTTP/1的请求协议下, 就会禁止同host的请求新流的分配.
响应
以上就是请求的过程, 然后看响应
1 | // 如果是GET请求, 或者需要'100- continue'握手成功的情况下 |
在请求成功的情况下, 会重新构建responseBuilder
对象, 通过它来构建响应报文.
1 | int code = response.code(); |
如果客户端响应100
状态码, 这个时候, 我们就需要重新读取获取真正的内容响应.
剩下的代码就是一些异常的处理, 这里就不做分析了.