Retrofit 源码剖析

148 阅读2分钟
  • 1 概述
  • 2 使用介绍
  • 3 流程剖析
  • 4 源码架构
    https://square.github.io/retrofit/
    https://github.com/square/retrofit

1 概述

Retrofit是一个适用于 Android 和 Java 的 HTTP 请求库

底层为 OkHttp 进行网络请求, Gson 进行响应解析

2 使用介绍


public interface GitHubService {
    @GET("users/{user}/repos")
    Call<List<Repo>> listRepos(@Path("user") String user);
}


        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.github.com/")
//                .client(getOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        GitHubService gitHubService = retrofit.create(GitHubService.class);
        Call<List<Repo>> repos = gitHubService.listRepos("square");
        repos.enqueue(new Callback<List<Repo>>() {
            @Override
            public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {

            }

            @Override
            public void onFailure(Call<List<Repo>> call, Throwable t) {

            }
        });

需要使用 OkHttp 更多的能力,比如怎加 拦截器 则可以构造 OkHttpClient 传递给 Retrofit

举个例子:

    private static OkHttpClient getOkHttpClient() {
        OkHttpClient httpClient = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public okhttp3.Response intercept(Chain chain) throws IOException {
                        Request request = chain.request()
                                .newBuilder()
                                .removeHeader("User-Agent")//移除旧的
                                .addHeader("User-Agent", WebSettings.getDefaultUserAgent(app))//添加真正的头部
                                .build();
                        return chain.proceed(request);
                    }
                }).build();
        return httpClient;
    }

3 流程剖析

应用层 传输层
应用层 传输层

core concept 都在图中

大致可以窥见一个 移动端的网络架构

应用层

传输层

接触较多,其他层开发中接触较少

4 源码结构

Retrofit

  • serviceMethodCache
  • callFactory(OkHttpClient)
  • baseUrl
  • converterFactories
  • callAdapterFactories
  • callbackExecutor

HttpServiceMethod

  • RequestFactory
  • callFactory
  • responseConverter

DefaultCallAdapterFactory

  • get() ---> ExecutorCallbackCall
    • callbackExecutor
    • delegate (Call)

GsonConverterFactory

  • gson

OkHttpCall

  • requestFactory
  • args
  • callFactory
  • responseConverter
  • canceled
  • rawCall
  • executed

5 总结

Retrofit 封装了 Http 请求为 Java 接口,通过注解来描述请求

很多设计亮点:

1 更新UI 方法

    static final class MainThreadExecutor implements Executor {
      private final Handler handler = new Handler(Looper.getMainLooper());

      @Override
      public void execute(Runnable r) {
        handler.post(r);
      }
    }

2 动态代理

接口 --> 拦截方法调用

Proxy.newProxyInstance(
            service.getClassLoader(),
            new Class<?>[] {service},
            new InvocationHandler() {
              private final Platform platform = Platform.get();
              private final Object[] emptyArgs = new Object[0];

              @Override
              public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args)
                  throws Throwable {
                // If the method is a method from Object then defer to normal invocation.
                if (method.getDeclaringClass() == Object.class) {
                  return method.invoke(this, args);
                }
                args = args != null ? args : emptyArgs;
                return platform.isDefaultMethod(method)
                    ? platform.invokeDefaultMethod(method, service, proxy, args)
                    : loadServiceMethod(method).invoke(args);
              }
            });

3 设计模式

  • 建造器模式 : 连缀表达式,构造函数参数过多考虑

  • 工厂模式

  • 适配器模式 :接受多个 特性 构造一个通用对象

  • 门面模式 : 封装具体实现

  • 观察者模式

本文使用 mdnice 排版