#说明
在上篇博文《OpenFeign学习(四):OpenFeign的方法同步请求执行》一文中,我对OpenFeign的同步请求的执行的原理进行了介绍和学习。本篇博文我将继续通过源码对请求之后结果的封装解码及失败重试进行介绍和学习。
正文
在上篇博文中提到,OpenFeign通过SynchronousMethodHandler进行同步方法请求处理,在介绍executeAndDecode方法源码时,只介绍了请求执行部分。接下来,我们继续通过源码来了解在请求结束后,OpenFeign如何对请求结果进行处理。
在阅读executeAndDecode源码时,我们再回顾下通过配置的Client进行实际请求执行的excute方法,这里我通过OkHttpClient进行请求。
Client.execute
public Response execute(feign.Request input, Options options) throws IOException {
okhttp3.OkHttpClient requestScoped;
if (this.delegate.connectTimeoutMillis() == options.connectTimeoutMillis() && this.delegate.readTimeoutMillis() == options.readTimeoutMillis() && this.delegate.followRedirects() == options.isFollowRedirects()) {
requestScoped = this.delegate;
} else {
requestScoped = this.delegate.newBuilder().connectTimeout((long)options.connectTimeoutMillis(), TimeUnit.MILLISECONDS).readTimeout((long)options.readTimeoutMillis(), TimeUnit.MILLISECONDS).followRedirects(options.isFollowRedirects()).build();
}
Request request = toOkHttpRequest(input);
okhttp3.Response response = requestScoped.newCall(request).execute();
return toFeignResponse(response, input).toBuilder().request(input).build();
}
可以看到在请求结束后,通过toFeignResponse方法将不同客户端的请求结果统一封装为OepnFeign的Response。
toFeignResponse(response, input).toBuilder().request(input).build();
这里在阅读源码时,我不理解的是通过toFeignResonse方法已经为Response设置了请求的Request,但在后续中又通过构造器重新设置Request并重新创建了Response实例。
private static Response toFeignResponse(okhttp3.Response response, feign.Request request) throws IOException {
return Response.builder().status(response.code()).reason(response.message()).request(request).headers(toMap(response.headers())).body(toBody(response.body())).build();
}
结果封装完毕后返回executeAndDecode方法,开始对请求结果进行处理。