概述 本文基于Retrofit 2.8.1版本的源码。
Retrofit是Square公司开发的默认基于OkHttp封装的一套RESTful网络请求框架,它是用于Android和Java的一个类型安全(type-safe)的REST客户端。
添加依赖:
1 implementation 'com.squareup.retrofit2:retrofit:2.8.1'
使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public interface IService { @GET("/{get}") Call<ResponseBody> get (@Path("get") String get, @Query("name") String name) ; @POST("/post") Call<ResponseBody> post (@Query("name") String name) ; } private Retrofit mRetrofit = new Retrofit.Builder().baseUrl("http://192.168.56.31:8080" ).build();private IService mService = mRetrofit.create(IService.class);public void get (@NotNull OnHttpCallback callback) { Call<ResponseBody> call = mService.get("get" , "retrofit" ); request(call, callback); } public void post (@NotNull OnHttpCallback callback) { Call<ResponseBody> call = mService.post("retrofit" ); request(call, callback); } private void request (@NotNull Call<ResponseBody> call, @NotNull OnHttpCallback callback) { call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse (@NotNull Call<ResponseBody> call, @NotNull Response<ResponseBody> response) { try { callback.onResult(response.body().string()); } catch (IOException e) { callback.onResult(ERROR_MESSAGE); e.printStackTrace(); } } @Override public void onFailure (@NotNull Call<ResponseBody> call, @NotNull Throwable t) { callback.onResult(ERROR_MESSAGE); } }); }
Retrofit初始化 Retrofit成员变量 先看一下Retrofit类的主要成员变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 private final Map<Method, ServiceMethod<?>> serviceMethodCache = new ConcurrentHashMap<>();final okhttp3.Call.Factory callFactory;final HttpUrl baseUrl;final List<Converter.Factory> converterFactories;final List<CallAdapter.Factory> callAdapterFactories;final @Nullable Executor callbackExecutor;final boolean validateEagerly;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 class Platform { private static final Platform PLATFORM = findPlatform(); static Platform get () { return PLATFORM; } private static Platform findPlatform () { try { Class.forName("android.os.Build" ); if (Build.VERSION.SDK_INT != 0 ) { return new Android(); } } catch (ClassNotFoundException ignored) { } return new Platform(true ); } private final boolean hasJava8Types; private final @Nullable Constructor<Lookup> lookupConstructor; Platform(boolean hasJava8Types) { this .hasJava8Types = hasJava8Types; Constructor<Lookup> lookupConstructor = null ; if (hasJava8Types) { try { lookupConstructor = Lookup.class.getDeclaredConstructor(Class.class, int .class); lookupConstructor.setAccessible(true ); } catch (NoClassDefFoundError ignored) { } catch (NoSuchMethodException ignored) { } } this .lookupConstructor = lookupConstructor; } @Nullable Executor defaultCallbackExecutor () { return null ; } List<? extends CallAdapter.Factory> defaultCallAdapterFactories(@Nullable Executor callbackExecutor) { DefaultCallAdapterFactory executorFactory = new DefaultCallAdapterFactory(callbackExecutor); return hasJava8Types ? asList(CompletableFutureCallAdapterFactory.INSTANCE, executorFactory) : singletonList(executorFactory); } int defaultCallAdapterFactoriesSize () { return hasJava8Types ? 2 : 1 ; } List<? extends Converter.Factory> defaultConverterFactories() { return hasJava8Types ? singletonList(OptionalConverterFactory.INSTANCE) : emptyList(); } int defaultConverterFactoriesSize () { return hasJava8Types ? 1 : 0 ; } @IgnoreJRERequirement boolean isDefaultMethod (Method method) { return hasJava8Types && method.isDefault(); } @IgnoreJRERequirement @Nullable Object invokeDefaultMethod (Method method, Class<?> declaringClass, Object object, Object... args) throws Throwable { Lookup lookup = lookupConstructor != null ? lookupConstructor.newInstance(declaringClass, -1 ) : MethodHandles.lookup(); return lookup.unreflectSpecial(method, declaringClass).bindTo(object).invokeWithArguments(args); } static final class Android extends Platform { Android() { super (Build.VERSION.SDK_INT >= 24 ); } @Override public Executor defaultCallbackExecutor () { return new MainThreadExecutor(); } @Nullable @Override Object invokeDefaultMethod ( Method method, Class<?> declaringClass, Object object, Object... args) throws Throwable { if (Build.VERSION.SDK_INT < 26 ) { throw new UnsupportedOperationException("Calling default methods on API 24 and 25 is not supported" ); } return super .invokeDefaultMethod(method, declaringClass, object, args); } static final class MainThreadExecutor implements Executor { private final Handler handler = new Handler(Looper.getMainLooper()); @Override public void execute (Runnable r) { handler.post(r); } } } }
Builder 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 public static final class Builder { Builder(Platform platform) { this .platform = platform; } public Builder () { this (Platform.get()); } public Retrofit build () { if (baseUrl == null ) { throw new IllegalStateException("Base URL required." ); } okhttp3.Call.Factory callFactory = this .callFactory; if (callFactory == null ) { callFactory = new OkHttpClient(); } Executor callbackExecutor = this .callbackExecutor; if (callbackExecutor == null ) { callbackExecutor = platform.defaultCallbackExecutor(); } List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this .callAdapterFactories); callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor)); List<Converter.Factory> converterFactories = new ArrayList<>(1 + this .converterFactories.size() + platform.defaultConverterFactoriesSize()); converterFactories.add(new BuiltInConverters()); converterFactories.addAll(this .converterFactories); converterFactories.addAll(platform.defaultConverterFactories()); return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories), unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly); } }
在解析下面的逻辑之前,先来看看两个重要的概念:CallAdapter和Converter。
CallAdapter CallAdapter CallAdapter是一个适配器接口,它对请求进行包装,将请求包装成不同的形式,以便适应不同的框架,CallAdapter.Factory则是生产CallAdapter的工厂。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 public interface CallAdapter <R , T > { Type responseType () ; T adapt (Call<R> call) ; abstract class Factory { public abstract @Nullable CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit); protected static Type getParameterUpperBound (int index, ParameterizedType type) { return Utils.getParameterUpperBound(index, type); } protected static Class<?> getRawType(Type type) { return Utils.getRawType(type); } } }
从Retrofit的初始化过程中可以看到它默认添加了CompletableFutureCallAdapterFactory和DefaultCallAdapterFactory两个CalAdapter.Factory。
DefaultCallAdapterFactory 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 final class DefaultCallAdapterFactory extends CallAdapter .Factory { private final @Nullable Executor callbackExecutor; DefaultCallAdapterFactory(@Nullable Executor callbackExecutor) { this .callbackExecutor = callbackExecutor; } @Override public @Nullable CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { if (getRawType(returnType) != Call.class) { return null ; } if (!(returnType instanceof ParameterizedType)) { throw new IllegalArgumentException( "Call return type must be parameterized as Call<Foo> or Call<? extends Foo>" ); } final Type responseType = Utils.getParameterUpperBound(0 , (ParameterizedType) returnType); final Executor executor = Utils.isAnnotationPresent(annotations, SkipCallbackExecutor.class) ? null : callbackExecutor; return new CallAdapter<Object, Call<?>>() { @Override public Type responseType () { return responseType; } @Override public Call<Object> adapt (Call<Object> call) { return executor == null ? call : new ExecutorCallbackCall<>(executor, call); } }; } static final class ExecutorCallbackCall <T > implements Call <T > { final Executor callbackExecutor; final Call<T> delegate; ExecutorCallbackCall(Executor callbackExecutor, Call<T> delegate) { this .callbackExecutor = callbackExecutor; this .delegate = delegate; } @Override public void enqueue (final Callback<T> callback) { Objects.requireNonNull(callback, "callback == null" ); delegate.enqueue(new Callback<T>() { @Override public void onResponse (Call<T> call, final Response<T> response) { callbackExecutor.execute( () -> { if (delegate.isCanceled()) { callback.onFailure(ExecutorCallbackCall.this , new IOException("Canceled" )); } else { callback.onResponse(ExecutorCallbackCall.this , response); } }); } @Override public void onFailure (Call<T> call, final Throwable t) { callbackExecutor.execute(() -> callback.onFailure(ExecutorCallbackCall.this , t)); } }); } @Override public boolean isExecuted () { return delegate.isExecuted(); } @Override public Response<T> execute () throws IOException { return delegate.execute(); } @Override public void cancel () { delegate.cancel(); } @Override public boolean isCanceled () { return delegate.isCanceled(); } @SuppressWarnings("CloneDoesntCallSuperClone") @Override public Call<T> clone () { return new ExecutorCallbackCall<>(callbackExecutor, delegate.clone()); } @Override public Request request () { return delegate.request(); } @Override public Timeout timeout () { return delegate.timeout(); } } }
CompletableFutureCallAdapterFactory 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 @IgnoreJRERequirement final class CompletableFutureCallAdapterFactory extends CallAdapter .Factory { static final CallAdapter.Factory INSTANCE = new CompletableFutureCallAdapterFactory(); @Override public @Nullable CallAdapter<?, ?> get( Type returnType, Annotation[] annotations, Retrofit retrofit) { if (getRawType(returnType) != CompletableFuture.class) { return null ; } if (!(returnType instanceof ParameterizedType)) { throw new IllegalStateException( "CompletableFuture return type must be parameterized" + " as CompletableFuture<Foo> or CompletableFuture<? extends Foo>" ); } Type innerType = getParameterUpperBound(0 , (ParameterizedType) returnType); if (getRawType(innerType) != Response.class) { return new BodyCallAdapter<>(innerType); } if (!(innerType instanceof ParameterizedType)) { throw new IllegalStateException( "Response must be parameterized" + " as Response<Foo> or Response<? extends Foo>" ); } Type responseType = getParameterUpperBound(0 , (ParameterizedType) innerType); return new ResponseCallAdapter<>(responseType); } @IgnoreJRERequirement private static final class BodyCallAdapter <R > implements CallAdapter <R , CompletableFuture <R >> { private final Type responseType; BodyCallAdapter(Type responseType) { this .responseType = responseType; } @Override public Type responseType () { return responseType; } @Override public CompletableFuture<R> adapt (final Call<R> call) { CompletableFuture<R> future = new CallCancelCompletableFuture<>(call); call.enqueue(new BodyCallback(future)); return future; } @IgnoreJRERequirement private class BodyCallback implements Callback <R > { private final CompletableFuture<R> future; public BodyCallback (CompletableFuture<R> future) { this .future = future; } @Override public void onResponse (Call<R> call, Response<R> response) { if (response.isSuccessful()) { future.complete(response.body()); } else { future.completeExceptionally(new HttpException(response)); } } @Override public void onFailure (Call<R> call, Throwable t) { future.completeExceptionally(t); } } } @IgnoreJRERequirement private static final class ResponseCallAdapter <R > implements CallAdapter <R , CompletableFuture <Response <R >>> { private final Type responseType; ResponseCallAdapter(Type responseType) { this .responseType = responseType; } @Override public Type responseType () { return responseType; } @Override public CompletableFuture<Response<R>> adapt(final Call<R> call) { CompletableFuture<Response<R>> future = new CallCancelCompletableFuture<>(call); call.enqueue(new ResponseCallback(future)); return future; } @IgnoreJRERequirement private class ResponseCallback implements Callback <R > { private final CompletableFuture<Response<R>> future; public ResponseCallback (CompletableFuture<Response<R>> future) { this .future = future; } @Override public void onResponse (Call<R> call, Response<R> response) { future.complete(response); } @Override public void onFailure (Call<R> call, Throwable t) { future.completeExceptionally(t); } } } @IgnoreJRERequirement private static final class CallCancelCompletableFuture <T > extends CompletableFuture <T > { private final Call<?> call; CallCancelCompletableFuture(Call<?> call) { this .call = call; } @Override public boolean cancel (boolean mayInterruptIfRunning) { if (mayInterruptIfRunning) { call.cancel(); } return super .cancel(mayInterruptIfRunning); } } }
RxJava2CallAdapterFactory 依赖:
1 implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 public final class RxJava2CallAdapterFactory extends CallAdapter .Factory { public static RxJava2CallAdapterFactory create () { return new RxJava2CallAdapterFactory(null , false ); } public static RxJava2CallAdapterFactory createAsync () { return new RxJava2CallAdapterFactory(null , true ); } public static RxJava2CallAdapterFactory createWithScheduler (Scheduler scheduler) { if (scheduler == null ) throw new NullPointerException("scheduler == null" ); return new RxJava2CallAdapterFactory(scheduler, false ); } private final Scheduler scheduler; private final boolean isAsync; private RxJava2CallAdapterFactory (Scheduler scheduler, boolean isAsync) { this .scheduler = scheduler; this .isAsync = isAsync; } @Override public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { Class<?> rawType = getRawType(returnType); if (rawType == Completable.class) { return new RxJava2CallAdapter(Void.class, scheduler, isAsync, false , true , false , false , false , true ); } boolean isFlowable = rawType == Flowable.class; boolean isSingle = rawType == Single.class; boolean isMaybe = rawType == Maybe.class; if (rawType != Observable.class && !isFlowable && !isSingle && !isMaybe) { return null ; } boolean isResult = false ; boolean isBody = false ; Type responseType; if (!(returnType instanceof ParameterizedType)) { String name = isFlowable ? "Flowable" : isSingle ? "Single" : isMaybe ? "Maybe" : "Observable" ; throw new IllegalStateException(name + " return type must be parameterized" + " as " + name + "<Foo> or " + name + "<? extends Foo>" ); } Type observableType = getParameterUpperBound(0 , (ParameterizedType) returnType); Class<?> rawObservableType = getRawType(observableType); if (rawObservableType == Response.class) { if (!(observableType instanceof ParameterizedType)) { throw new IllegalStateException("Response must be parameterized" + " as Response<Foo> or Response<? extends Foo>" ); } responseType = getParameterUpperBound(0 , (ParameterizedType) observableType); } else if (rawObservableType == Result.class) { if (!(observableType instanceof ParameterizedType)) { throw new IllegalStateException("Result must be parameterized" + " as Result<Foo> or Result<? extends Foo>" ); } responseType = getParameterUpperBound(0 , (ParameterizedType) observableType); isResult = true ; } else { responseType = observableType; isBody = true ; } return new RxJava2CallAdapter(responseType, scheduler, isAsync, isResult, isBody, isFlowable, isSingle, isMaybe, false ); } } final class RxJava2CallAdapter <R > implements CallAdapter <R , Object > { private final Type responseType; private final Scheduler scheduler; private final boolean isAsync; private final boolean isResult; private final boolean isBody; private final boolean isFlowable; private final boolean isSingle; private final boolean isMaybe; private final boolean isCompletable; RxJava2CallAdapter(Type responseType, Scheduler scheduler, boolean isAsync, boolean isResult, boolean isBody, boolean isFlowable, boolean isSingle, boolean isMaybe, boolean isCompletable) { this .responseType = responseType; this .scheduler = scheduler; this .isAsync = isAsync; this .isResult = isResult; this .isBody = isBody; this .isFlowable = isFlowable; this .isSingle = isSingle; this .isMaybe = isMaybe; this .isCompletable = isCompletable; } @Override public Type responseType () { return responseType; } @Override public Object adapt (Call<R> call) { Observable<Response<R>> responseObservable = isAsync ? new CallEnqueueObservable<>(call) : new CallExecuteObservable<>(call); Observable<?> observable; if (isResult) { observable = new ResultObservable<>(responseObservable); } else if (isBody) { observable = new BodyObservable<>(responseObservable); } else { observable = responseObservable; } if (scheduler != null ) { observable = observable.subscribeOn(scheduler); } if (isFlowable) { return observable.toFlowable(BackpressureStrategy.LATEST); } if (isSingle) { return observable.singleOrError(); } if (isMaybe) { return observable.singleElement(); } if (isCompletable) { return observable.ignoreElements(); } return observable; } }
Converter Converter是一个转换器,它用于将请求回来的数据进行转换。而Converter.Factory是Converter的工厂。
Converter 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 public interface Converter <F , T > { @Nullable T convert (F value) throws IOException ; abstract class Factory { public @Nullable Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { return null ; } public @Nullable Converter<?, RequestBody> requestBodyConverter( Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { return null ; } public @Nullable Converter<?, String> stringConverter( Type type, Annotation[] annotations, Retrofit retrofit) { return null ; } protected static Type getParameterUpperBound (int index, ParameterizedType type) { return Utils.getParameterUpperBound(index, type); } protected static Class<?> getRawType(Type type) { return Utils.getRawType(type); } } }
从Retrofit的初始化过程中可以看到它默认添加了OptionalConverterFactory这一个Converter.Factory。
OptionalConverterFactory 这个类对Optional类型的返回类型做处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 final class OptionalConverterFactory extends Converter .Factory { static final Converter.Factory INSTANCE = new OptionalConverterFactory(); @Override public @Nullable Converter<ResponseBody, ?> responseBodyConverter( Type type, Annotation[] annotations, Retrofit retrofit) { if (getRawType(type) != Optional.class) { return null ; } Type innerType = getParameterUpperBound(0 , (ParameterizedType) type); Converter<ResponseBody, Object> delegate = retrofit.responseBodyConverter(innerType, annotations); return new OptionalConverter<>(delegate); } @IgnoreJRERequirement static final class OptionalConverter <T > implements Converter <ResponseBody , Optional <T >> { final Converter<ResponseBody, T> delegate; OptionalConverter(Converter<ResponseBody, T> delegate) { this .delegate = delegate; } @Override public Optional<T> convert (ResponseBody value) throws IOException { return Optional.ofNullable(delegate.convert(value)); } } }
GsonConverterFactory 依赖:
1 implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 public final class GsonConverterFactory extends Converter .Factory { public static GsonConverterFactory create () { return create(new Gson()); } @SuppressWarnings("ConstantConditions") public static GsonConverterFactory create (Gson gson) { if (gson == null ) throw new NullPointerException("gson == null" ); return new GsonConverterFactory(gson); } private final Gson gson; private GsonConverterFactory (Gson gson) { this .gson = gson; } @Override public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return new GsonResponseBodyConverter<>(gson, adapter); } @Override public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return new GsonRequestBodyConverter<>(gson, adapter); } } final class GsonResponseBodyConverter <T > implements Converter <ResponseBody , T > { private final Gson gson; private final TypeAdapter<T> adapter; GsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) { this .gson = gson; this .adapter = adapter; } @Override public T convert (ResponseBody value) throws IOException { JsonReader jsonReader = gson.newJsonReader(value.charStream()); try { T result = adapter.read(jsonReader); if (jsonReader.peek() != JsonToken.END_DOCUMENT) { throw new JsonIOException("JSON document was not fully consumed." ); } return result; } finally { value.close(); } } }
接口对象创建 接口创建调用的是Retrofit.create方法,它返回一个接口的代理类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public <T> T create (final Class<T> service) { validateServiceInterface(service); return (T) 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 (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); } }); }
接口方法调用 loadServiceMethod 当调用接口中的方法时,从上面可以看出调用的是代理类中的逻辑,核心代码在loadServiceMethod方法中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ServiceMethod<?> loadServiceMethod(Method method) { ServiceMethod<?> result = serviceMethodCache.get(method); if (result != null ) return result; synchronized (serviceMethodCache) { result = serviceMethodCache.get(method); if (result == null ) { result = ServiceMethod.parseAnnotations(this , method); serviceMethodCache.put(method, result); } } return result; }
ServiceMethod.parseAnnotations 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 abstract class ServiceMethod <T > { static <T> ServiceMethod<T> parseAnnotations (Retrofit retrofit, Method method) { RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method); Type returnType = method.getGenericReturnType(); if (Utils.hasUnresolvableType(returnType)) { throw methodError(method, "Method return type must not include a type variable or wildcard: %s" , returnType); } if (returnType == void .class) { throw methodError(method, "Service methods cannot return void." ); } return HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory); } abstract @Nullable T invoke (Object[] args) ; }
RequestFactory.parseAnnotations 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 final class RequestFactory { static RequestFactory parseAnnotations (Retrofit retrofit, Method method) { return new Builder(retrofit, method).build(); } static final class Builder { private static final String PARAM = "[a-zA-Z][a-zA-Z0-9_-]*" ; private static final Pattern PARAM_URL_REGEX = Pattern.compile("\\{(" + PARAM + ")\\}" ); private static final Pattern PARAM_NAME_REGEX = Pattern.compile(PARAM); Builder(Retrofit retrofit, Method method) { this .retrofit = retrofit; this .method = method; this .methodAnnotations = method.getAnnotations(); this .parameterTypes = method.getGenericParameterTypes(); this .parameterAnnotationsArray = method.getParameterAnnotations(); } RequestFactory build () { for (Annotation annotation : methodAnnotations) { parseMethodAnnotation(annotation); } int parameterCount = parameterAnnotationsArray.length; parameterHandlers = new ParameterHandler<?>[parameterCount]; for (int p = 0 , lastParameter = parameterCount - 1 ; p < parameterCount; p++) { parameterHandlers[p] = parseParameter(p, parameterTypes[p], parameterAnnotationsArray[p], p == lastParameter); } return new RequestFactory(this ); } private void parseMethodAnnotation (Annotation annotation) { if (annotation instanceof DELETE) { parseHttpMethodAndPath("DELETE" , ((DELETE) annotation).value(), false ); } else if (annotation instanceof GET) { parseHttpMethodAndPath("GET" , ((GET) annotation).value(), false ); } else if (annotation instanceof HEAD) { parseHttpMethodAndPath("HEAD" , ((HEAD) annotation).value(), false ); } else if (annotation instanceof PATCH) { parseHttpMethodAndPath("PATCH" , ((PATCH) annotation).value(), true ); } else if (annotation instanceof POST) { parseHttpMethodAndPath("POST" , ((POST) annotation).value(), true ); } else if (annotation instanceof PUT) { parseHttpMethodAndPath("PUT" , ((PUT) annotation).value(), true ); } else if (annotation instanceof OPTIONS) { parseHttpMethodAndPath("OPTIONS" , ((OPTIONS) annotation).value(), false ); } else if (annotation instanceof HTTP) { HTTP http = (HTTP) annotation; parseHttpMethodAndPath(http.method(), http.path(), http.hasBody()); } else if (annotation instanceof retrofit2.http.Headers) { String[] headersToParse = ((retrofit2.http.Headers) annotation).value(); if (headersToParse.length == 0 ) { throw methodError(method, "@Headers annotation is empty." ); } headers = parseHeaders(headersToParse); } else if (annotation instanceof Multipart) { if (isFormEncoded) { throw methodError(method, "Only one encoding annotation is allowed." ); } isMultipart = true ; } else if (annotation instanceof FormUrlEncoded) { if (isMultipart) { throw methodError(method, "Only one encoding annotation is allowed." ); } isFormEncoded = true ; } } private void parseHttpMethodAndPath (String httpMethod, String value, boolean hasBody) { if (this .httpMethod != null ) { throw methodError(method, "Only one HTTP method is allowed. Found: %s and %s." , this .httpMethod, httpMethod); } this .httpMethod = httpMethod; this .hasBody = hasBody; if (value.isEmpty()) { return ; } int question = value.indexOf('?' ); if (question != -1 && question < value.length() - 1 ) { String queryParams = value.substring(question + 1 ); Matcher queryParamMatcher = PARAM_URL_REGEX.matcher(queryParams); if (queryParamMatcher.find()) { throw methodError(method, "URL query string \"%s\" must not have replace block. " + "For dynamic query parameters use @Query." , queryParams); } } this .relativeUrl = value; this .relativeUrlParamNames = parsePathParameters(value); } static Set<String> parsePathParameters (String path) { Matcher m = PARAM_URL_REGEX.matcher(path); Set<String> patterns = new LinkedHashSet<>(); while (m.find()) { patterns.add(m.group(1 )); } return patterns; } } }
接着通过HttpServiceMethod.parseAnnotations方法返回了一个ServiceMethod对象。
HttpServiceMethod.parseAnnotations 这里的<ResponseT, ReturnT>
对应<XXResponseBody, Call<XXResponseBody>>
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations ( Retrofit retrofit, Method method, RequestFactory requestFactory) { boolean isKotlinSuspendFunction = requestFactory.isKotlinSuspendFunction; boolean continuationWantsResponse = false ; boolean continuationBodyNullable = false ; Annotation[] annotations = method.getAnnotations(); Type adapterType; if (isKotlinSuspendFunction) { } else { adapterType = method.getGenericReturnType(); } CallAdapter<ResponseT, ReturnT> callAdapter = createCallAdapter(retrofit, method, adapterType, annotations); Type responseType = callAdapter.responseType(); if (responseType == okhttp3.Response.class) { throw methodError(method, "'" + getRawType(responseType).getName() + "' is not a valid response body type. Did you mean ResponseBody?" ); } if (responseType == Response.class) { throw methodError(method, "Response must include generic type (e.g., Response<String>)" ); } if (requestFactory.httpMethod.equals("HEAD" ) && !Void.class.equals(responseType)) { throw methodError(method, "HEAD method must use Void as response type." ); } Converter<ResponseBody, ResponseT> responseConverter = createResponseConverter(retrofit, method, responseType); okhttp3.Call.Factory callFactory = retrofit.callFactory; if (!isKotlinSuspendFunction) { return new CallAdapted<>(requestFactory, callFactory, responseConverter, callAdapter); } else if (continuationWantsResponse) { return (HttpServiceMethod<ResponseT, ReturnT>) new SuspendForResponse<>(requestFactory, callFactory, responseConverter, (CallAdapter<ResponseT, Call<ResponseT>>) callAdapter); } else { return (HttpServiceMethod<ResponseT, ReturnT>) new SuspendForBody<>(requestFactory, callFactory, responseConverter, (CallAdapter<ResponseT, Call<ResponseT>>) callAdapter, continuationBodyNullable); } } private static <ResponseT, ReturnT> CallAdapter<ResponseT, ReturnT> createCallAdapter ( Retrofit retrofit, Method method, Type returnType, Annotation[] annotations) { try { return (CallAdapter<ResponseT, ReturnT>) retrofit.callAdapter(returnType, annotations); } catch (RuntimeException e) { throw methodError(method, e, "Unable to create call adapter for %s" , returnType); } } private static <ResponseT> Converter<ResponseBody, ResponseT> createResponseConverter ( Retrofit retrofit, Method method, Type responseType) { Annotation[] annotations = method.getAnnotations(); try { return retrofit.responseBodyConverter(responseType, annotations); } catch (RuntimeException e) { throw methodError(method, e, "Unable to create converter for %s" , responseType); } }
回到Retrofit类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public CallAdapter<?, ?> callAdapter(Type returnType, Annotation[] annotations) { return nextCallAdapter(null , returnType, annotations); } public CallAdapter<?, ?> nextCallAdapter( @Nullable CallAdapter.Factory skipPast, Type returnType, Annotation[] annotations) { Objects.requireNonNull(returnType, "returnType == null" ); Objects.requireNonNull(annotations, "annotations == null" ); int start = callAdapterFactories.indexOf(skipPast) + 1 ; for (int i = start, count = callAdapterFactories.size(); i < count; i++) { CallAdapter<?, ?> adapter = callAdapterFactories.get(i).get(returnType, annotations, this ); if (adapter != null ) { return adapter; } } } public <T> Converter<ResponseBody, T> responseBodyConverter (Type type, Annotation[] annotations) { return nextResponseBodyConverter(null , type, annotations); } public <T> Converter<ResponseBody, T> nextResponseBodyConverter ( @Nullable Converter.Factory skipPast, Type type, Annotation[] annotations) { Objects.requireNonNull(type, "type == null" ); Objects.requireNonNull(annotations, "annotations == null" ); int start = converterFactories.indexOf(skipPast) + 1 ; for (int i = start, count = converterFactories.size(); i < count; i++) { Converter<ResponseBody, ?> converter = converterFactories.get(i).responseBodyConverter(type, annotations, this ); if (converter != null ) { return (Converter<ResponseBody, T>) converter; } } }
HttpServiceMethod.invoke 调用接口中的RESTful方法,根据上面返回的代理对象,可以看到其实是调用了HttpServiceMethod.invoke()方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 abstract class HttpServiceMethod <ResponseT , ReturnT > extends ServiceMethod <ReturnT > { private final RequestFactory requestFactory; private final okhttp3.Call.Factory callFactory; private final Converter<ResponseBody, ResponseT> responseConverter; @Override final @Nullable ReturnT invoke (Object[] args) { Call<ResponseT> call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter); return adapt(call, args); } protected abstract @Nullable ReturnT adapt (Call<ResponseT> call, Object[] args) ; }
可以看出这里创建了一个OkHttpCall对象,然后调用了抽象方法:adapt,分析HttpServiceMethod的子类CallAdapted中的adapt方法,CallAdapted类表示一个适配过的Call。
1 2 3 4 5 6 7 8 9 10 static final class CallAdapted <ResponseT , ReturnT > extends HttpServiceMethod <ResponseT , ReturnT > { private final CallAdapter<ResponseT, ReturnT> callAdapter; @Override protected ReturnT adapt (Call<ResponseT> call, Object[] args) { return callAdapter.adapt(call); } }
这里调用了CallAdapter.adapt方法对Call进行适配,然后返回处理过的返回类型。这里的CallAdapte默认是DefaultCallAdapterFactory。
网络请求 由上可知客户端调用的enqueue方法即是DefaultCallAdapterFactory.ExecutorCallbackCall中的enqueue方法,这里面传入的delegate是上面调用adapt方法时传入的OkHttpCall对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 final class OkHttpCall <T > implements Call <T > { private final okhttp3.Call.Factory callFactory; @Override public void enqueue (final Callback<T> callback) { Objects.requireNonNull(callback, "callback == null" ); okhttp3.Call call; Throwable failure; synchronized (this ) { if (executed) throw new IllegalStateException("Already executed." ); executed = true ; call = rawCall; failure = creationFailure; if (call == null && failure == null ) { try { call = rawCall = createRawCall(); } catch (Throwable t) { throwIfFatal(t); failure = creationFailure = t; } } } if (failure != null ) { callback.onFailure(this , failure); return ; } if (canceled) { call.cancel(); } call.enqueue(new okhttp3.Callback() { @Override public void onResponse (okhttp3.Call call, okhttp3.Response rawResponse) { Response<T> response; try { response = parseResponse(rawResponse); } catch (Throwable e) { throwIfFatal(e); callFailure(e); return ; } try { callback.onResponse(OkHttpCall.this , response); } catch (Throwable t) { throwIfFatal(t); t.printStackTrace(); } } @Override public void onFailure (okhttp3.Call call, IOException e) { callFailure(e); } private void callFailure (Throwable e) { try { callback.onFailure(OkHttpCall.this , e); } catch (Throwable t) { throwIfFatal(t); t.printStackTrace(); } } }); } private okhttp3.Call createRawCall () throws IOException { okhttp3.Call call = callFactory.newCall(requestFactory.create(args)); if (call == null ) { throw new NullPointerException("Call.Factory returned null." ); } return call; } Response<T> parseResponse (okhttp3.Response rawResponse) throws IOException { ResponseBody rawBody = rawResponse.body(); rawResponse = rawResponse.newBuilder().body(new NoContentResponseBody(rawBody.contentType(), rawBody.contentLength())).build(); int code = rawResponse.code(); if (code < 200 || code >= 300 ) { try { ResponseBody bufferedBody = Utils.buffer(rawBody); return Response.error(bufferedBody, rawResponse); } finally { rawBody.close(); } } if (code == 204 || code == 205 ) { rawBody.close(); return Response.success(null , rawResponse); } ExceptionCatchingResponseBody catchingBody = new ExceptionCatchingResponseBody(rawBody); try { T body = responseConverter.convert(catchingBody); return Response.success(body, rawResponse); } catch (RuntimeException e) { catchingBody.throwIfCaught(); throw e; } } }
在请求结束后,调用Converter.convert处理返回的Response,得到客户端期望的响应,默认情况下不会处理,直接返回(如果使用了Optional类作为响应,那么会被OptionalConverter处理)。
如果使用的CallAdapter是RxJava2CallAdapterFactory生成的Rxjava2CallAdapter,那么请求网络会使用Rxjava的逻辑去请求,不会走默认的流程。
总结 Retrofit的源码中涉及到了许多设计模式,如适配器模式,静态代理模式,动态代理模式等。
Retrofit请求的流程:
首先初始化Retrofit对象,根据平台创建了Platform对象,同时创建了一个callbackExecutor,多个CallAdapter.Factory以及Converter.Factory;
然后根据客户端定义的Http接口类,生成一个代理类;
当调用Http接口类中的方法时,实际上会由代理类处理这个逻辑,对于@POST等类型的注解方法,Retrofit会为其创建一个HttpServiceMethod类型的对象,这个对象中包含CallAdapter和Converter对象用来对请求和响应的参数做处理;
调用Http接口类中的方法其实就是调用了HttpServiceMethod的invoke方法,这里创建了一个OkHttpCall的Call对象,然后通过CallAdapter适配器来对请求参数做处理;
接着通过Http接口类返回的Call对象请求网络,其实际上是调用的OkHttpCall中的方法,也就是默认调用的OkHttpClient中的逻辑;
最后如果有必要的话就会通过Converter来对处理结果进行处理,得到客户端想要的响应类型。
Retrofit可以自定义CallAdapter和Converter对象,比较常用的有RxJava2CallAdapterFactory和GsonConverterFactory,不过需要加入相应的依赖。
Retrofit支持自定义callFactory,可以使用实现了okhttp3.Call.Factory接口的类来替代OkHttpClient。