public<T>Tcreate(finalClass<T>service){//校验传入的ClassvalidateServiceInterface(service);return(T)Proxy.newProxyInstance(service.getClassLoader(),newClass<?>[]{service},newInvocationHandler(){privatefinalPlatformplatform=Platform.get();//获取平台privatefinalObject[]emptyArgs=newObject[0];@Overridepublic@NullableObjectinvoke(Objectproxy,Methodmethod,@NullableObject[]args)throwsThrowable{// If the method is a method from Object then defer to normal invocation.//如果是Object中声明的方法,就调用当前InvocationHandler对应的方法if(method.getDeclaringClass()==Object.class){returnmethod.invoke(this,args);}args=args!=null?args:emptyArgs;returnplatform.isDefaultMethod(method)?platform.invokeDefaultMethod(method,service,proxy,args):loadServiceMethod(method).invoke(args);}});}
abstractclassServiceMethod<T>{static<T>ServiceMethod<T>parseAnnotations(Retrofitretrofit,Methodmethod){//创建RequestFactoryRequestFactoryrequestFactory=RequestFactory.parseAnnotations(retrofit,method);//获取方法返回类型TypereturnType=method.getGenericReturnType();//校验返回值类型if(Utils.hasUnresolvableType(returnType)){throwmethodError(method,"Method return type must not include a type variable or wildcard: %s",returnType);}if(returnType==void.class){throwmethodError(method,"Service methods cannot return void.");}returnHttpServiceMethod.parseAnnotations(retrofit,method,requestFactory);}abstract@NullableTinvoke(Object[]args);}
RequestFactorybuild(){//遍历方法上的注解调用parseMethodAnnotation解析方法上的注解for(Annotationannotation:methodAnnotations){parseMethodAnnotation(annotation);}//调用完parseMethodAnnotation 会为httpMethod赋值//如果httpMethod为空直接抛出异常if(httpMethod==null){throwmethodError(method,"HTTP method annotation is required (e.g., @GET, @POST, etc.).");}if(!hasBody){if(isMultipart){throwmethodError(method,"Multipart can only be specified on HTTP methods with request body (e.g., @POST).");}if(isFormEncoded){throwmethodError(method,"FormUrlEncoded can only be specified on HTTP methods with "+"request body (e.g., @POST).");}}//参数个数intparameterCount=parameterAnnotationsArray.length;//创建一个ParameterHandler数组 parameterHandlers=newParameterHandler<?>[parameterCount];for(intp=0,lastParameter=parameterCount-1;p<parameterCount;p++){//调用parseParameter方法解析参数 并创建一个ParameterHandler为parameterHandlers赋值parameterHandlers[p]=parseParameter(p,parameterTypes[p],parameterAnnotationsArray[p],p==lastParameter);}if(relativeUrl==null&&!gotUrl){throwmethodError(method,"Missing either @%s URL or @Url parameter.",httpMethod);}if(!isFormEncoded&&!isMultipart&&!hasBody&&gotBody){throwmethodError(method,"Non-body HTTP method cannot contain @Body.");}if(isFormEncoded&&!gotField){throwmethodError(method,"Form-encoded method must contain at least one @Field.");}if(isMultipart&&!gotPart){throwmethodError(method,"Multipart method must contain at least one @Part.");}//创建RequestFactoryreturnnewRequestFactory(this);}
privatevoidparseMethodAnnotation(Annotationannotation){if(annotationinstanceofDELETE){parseHttpMethodAndPath("DELETE",((DELETE)annotation).value(),false);}elseif(annotationinstanceofGET){parseHttpMethodAndPath("GET",((GET)annotation).value(),false);}elseif(annotationinstanceofHEAD){parseHttpMethodAndPath("HEAD",((HEAD)annotation).value(),false);if(!Void.class.equals(responseType)){throwmethodError("HEAD method must use Void as response type.");}}elseif(annotationinstanceofPATCH){parseHttpMethodAndPath("PATCH",((PATCH)annotation).value(),true);}elseif(annotationinstanceofPOST){parseHttpMethodAndPath("POST",((POST)annotation).value(),true);}elseif(annotationinstanceofPUT){parseHttpMethodAndPath("PUT",((PUT)annotation).value(),true);}elseif(annotationinstanceofOPTIONS){parseHttpMethodAndPath("OPTIONS",((OPTIONS)annotation).value(),false);}elseif(annotationinstanceofHTTP){HTTPhttp=(HTTP)annotation;parseHttpMethodAndPath(http.method(),http.path(),http.hasBody());}elseif(annotationinstanceofretrofit2.http.Headers){String[]headersToParse=((retrofit2.http.Headers)annotation).value();if(headersToParse.length==0){throwmethodError("@Headers annotation is empty.");}//解析请求头headers=parseHeaders(headersToParse);}elseif(annotationinstanceofMultipart){if(isFormEncoded){throwmethodError("Only one encoding annotation is allowed.");}isMultipart=true;}elseif(annotationinstanceofFormUrlEncoded){if(isMultipart){throwmethodError("Only one encoding annotation is allowed.");}isFormEncoded=true;}}
privatevoidparseHttpMethodAndPath(StringhttpMethod,Stringvalue,booleanhasBody){//如果httpMethod不为null 直接抛出异常if(this.httpMethod!=null){throwmethodError(method,"Only one HTTP method is allowed. Found: %s and %s.",this.httpMethod,httpMethod);}this.httpMethod=httpMethod;//赋值this.hasBody=hasBody;if(value.isEmpty()){//注解内值为空直接返回return;}// Get the relative URL path and existing query string, if present.intquestion=value.indexOf('?');//url中包含? 并且?不是最后一位if(question!=-1&&question<value.length()-1){// Ensure the query string does not have any named parameters.StringqueryParams=value.substring(question+1);MatcherqueryParamMatcher=PARAM_URL_REGEX.matcher(queryParams);if(queryParamMatcher.find()){throwmethodError(method,"URL query string \"%s\" must not have replace block. "+"For dynamic query parameters use @Query.",queryParams);}}//获取urlthis.relativeUrl=value;//解析url中的参数this.relativeUrlParamNames=parsePathParameters(value);}
private@NullableParameterHandler<?>parseParameter(intp,TypeparameterType,@NullableAnnotation[]annotations,booleanallowContinuation){ParameterHandler<?>result=null;if(annotations!=null){for(Annotationannotation:annotations){//解析参数上的注解ParameterHandler<?>annotationAction=parseParameterAnnotation(p,parameterType,annotations,annotation);if(annotationAction==null){continue;}if(result!=null){throwparameterError(method,p,"Multiple Retrofit annotations found, only one allowed.");}result=annotationAction;}}if(result==null){if(allowContinuation){try{if(Utils.getRawType(parameterType)==Continuation.class){isKotlinSuspendFunction=true;returnnull;}}catch(NoClassDefFoundErrorignored){}}throwparameterError(method,p,"No Retrofit annotation found.");}returnresult;}
privateParameterHandler<?>parseParameterAnnotation(intp,Typetype,Annotation[]annotations,Annotationannotation){if(annotationinstanceofQuery){//校验validateResolvableType(p,type);//获取注解Queryquery=(Query)annotation;//获取注解的值Stringname=query.value();//是否编码booleanencoded=query.encoded();Class<?>rawParameterType=Utils.getRawType(type);gotQuery=true;if(Iterable.class.isAssignableFrom(rawParameterType)){if(!(typeinstanceofParameterizedType)){throwparameterError(method,p,rawParameterType.getSimpleName()+" must include generic type (e.g., "+rawParameterType.getSimpleName()+"<String>)");}ParameterizedTypeparameterizedType=(ParameterizedType)type;TypeiterableType=Utils.getParameterUpperBound(0,parameterizedType);//获取ConverterConverter<?,String>converter=retrofit.stringConverter(iterableType,annotations);//创建ParameterHandler 并调用iterable()方法returnnewParameterHandler.Query<>(name,converter,encoded).iterable();}elseif(rawParameterType.isArray()){Class<?>arrayComponentType=boxIfPrimitive(rawParameterType.getComponentType());Converter<?,String>converter=retrofit.stringConverter(arrayComponentType,annotations);returnnewParameterHandler.Query<>(name,converter,encoded).array();}else{Converter<?,String>converter=retrofit.stringConverter(type,annotations);returnnewParameterHandler.Query<>(name,converter,encoded);}}}
static<ResponseT,ReturnT>HttpServiceMethod<ResponseT,ReturnT>parseAnnotations(Retrofitretrofit,Methodmethod,RequestFactoryrequestFactory){//判断是否是挂起函数booleanisKotlinSuspendFunction=requestFactory.isKotlinSuspendFunction;booleancontinuationWantsResponse=false;booleancontinuationBodyNullable=false;//获取方法上的注解Annotation[]annotations=method.getAnnotations();TypeadapterType;if(isKotlinSuspendFunction){//挂起函数Type[]parameterTypes=method.getGenericParameterTypes();TyperesponseType=Utils.getParameterLowerBound(0,(ParameterizedType)parameterTypes[parameterTypes.length-1]);if(getRawType(responseType)==Response.class&&responseTypeinstanceofParameterizedType){// Unwrap the actual body type from Response<T>.responseType=Utils.getParameterUpperBound(0,(ParameterizedType)responseType);continuationWantsResponse=true;}else{// TODO figure out if type is nullable or not// Metadata metadata = method.getDeclaringClass().getAnnotation(Metadata.class)// Find the entry for method// Determine if return type is nullable or not}adapterType=newUtils.ParameterizedTypeImpl(null,Call.class,responseType);annotations=SkipCallbackExecutorImpl.ensurePresent(annotations);}else{adapterType=method.getGenericReturnType();}//获取CallAdapterCallAdapter<ResponseT,ReturnT>callAdapter=createCallAdapter(retrofit,method,adapterType,annotations);//获取CallAdapter的返回类型TyperesponseType=callAdapter.responseType();//如果返回类型是okhttp3.Responseif(responseType==okhttp3.Response.class){throwmethodError(method,"'"+getRawType(responseType).getName()+"' is not a valid response body type. Did you mean ResponseBody?");}if(responseType==Response.class){throwmethodError(method,"Response must include generic type (e.g., Response<String>)");}// TODO support Unit for Kotlin?if(requestFactory.httpMethod.equals("HEAD")&&!Void.class.equals(responseType)){throwmethodError(method,"HEAD method must use Void as response type.");}//获取ConverterConverter<ResponseBody,ResponseT>responseConverter=createResponseConverter(retrofit,method,responseType);okhttp3.Call.FactorycallFactory=retrofit.callFactory;if(!isKotlinSuspendFunction){//创建CallAdaptedreturnnewCallAdapted<>(requestFactory,callFactory,responseConverter,callAdapter);}elseif(continuationWantsResponse){//noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.return(HttpServiceMethod<ResponseT,ReturnT>)newSuspendForResponse<>(requestFactory,callFactory,responseConverter,(CallAdapter<ResponseT,Call<ResponseT>>)callAdapter);}else{//noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.return(HttpServiceMethod<ResponseT,ReturnT>)newSuspendForBody<>(requestFactory,callFactory,responseConverter,(CallAdapter<ResponseT,Call<ResponseT>>)callAdapter,continuationBodyNullable);}}
privatestatic<ResponseT,ReturnT>CallAdapter<ResponseT,ReturnT>createCallAdapter(Retrofitretrofit,Methodmethod,TypereturnType,Annotation[]annotations){try{//noinspection unchecked//调用Retrofit的callAdapter方法return(CallAdapter<ResponseT,ReturnT>)retrofit.callAdapter(returnType,annotations);}catch(RuntimeExceptione){// Wide exception range because factories are user code.throwmethodError(method,e,"Unable to create call adapter for %s",returnType);}}
privatestatic<ResponseT>Converter<ResponseBody,ResponseT>createResponseConverter(Retrofitretrofit,Methodmethod,TyperesponseType){Annotation[]annotations=method.getAnnotations();try{returnretrofit.responseBodyConverter(responseType,annotations);}catch(RuntimeExceptione){// Wide exception range because factories are user code.throwmethodError(method,e,"Unable to create converter for %s",responseType);}}
publicfinalclassRxJavaCallAdapterFactoryextendsCallAdapter.Factory{/** * Returns an instance which creates synchronous observables that do not operate on any scheduler * by default. */publicstaticRxJavaCallAdapterFactorycreate(){returnnewRxJavaCallAdapterFactory(null);}/** * Returns an instance which creates synchronous observables that * {@linkplain Observable#subscribeOn(Scheduler) subscribe on} {@code scheduler} by default. */publicstaticRxJavaCallAdapterFactorycreateWithScheduler(Schedulerscheduler){if(scheduler==null)thrownewNullPointerException("scheduler == null");returnnewRxJavaCallAdapterFactory(scheduler);}privatefinalSchedulerscheduler;privateRxJavaCallAdapterFactory(Schedulerscheduler){this.scheduler=scheduler;}@OverridepublicCallAdapter<?,?>get(TypereturnType,Annotation[]annotations,Retrofitretrofit){Class<?>rawType=getRawType(returnType);booleanisSingle=rawType==Single.class;//判断返回值是否是Single.classbooleanisCompletable="rx.Completable".equals(rawType.getCanonicalName());if(rawType!=Observable.class&&!isSingle&&!isCompletable){returnnull;}if(isCompletable){returnnewRxJavaCallAdapter(Void.class,scheduler,false,true,false,true);}booleanisResult=false;booleanisBody=false;TyperesponseType;if(!(returnTypeinstanceofParameterizedType)){Stringname=isSingle?"Single":"Observable";thrownewIllegalStateException(name+" return type must be parameterized"+" as "+name+"<Foo> or "+name+"<? extends Foo>");}TypeobservableType=getParameterUpperBound(0,(ParameterizedType)returnType);Class<?>rawObservableType=getRawType(observableType);if(rawObservableType==Response.class){if(!(observableTypeinstanceofParameterizedType)){thrownewIllegalStateException("Response must be parameterized"+" as Response<Foo> or Response<? extends Foo>");}responseType=getParameterUpperBound(0,(ParameterizedType)observableType);}elseif(rawObservableType==Result.class){if(!(observableTypeinstanceofParameterizedType)){thrownewIllegalStateException("Result must be parameterized"+" as Result<Foo> or Result<? extends Foo>");}responseType=getParameterUpperBound(0,(ParameterizedType)observableType);isResult=true;}else{responseType=observableType;isBody=true;}//创建RxJavaAdapterreturnnewRxJavaCallAdapter(responseType,scheduler,isResult,isBody,isSingle,false);}}
@OverridepublicObjectadapt(Call<R>call){Observable<Response<R>>responseObservable=isAsync?newCallEnqueueObservable<>(call):newCallExecuteObservable<>(call);Observable<?>observable;if(isResult){observable=newResultObservable<>(responseObservable);}elseif(isBody){observable=newBodyObservable<>(responseObservable);}else{observable=responseObservable;}if(scheduler!=null){observable=observable.subscribeOn(scheduler);}if(isFlowable){// We only ever deliver a single value, and the RS spec states that you MUST request at least// one element which means we never need to honor backpressure.returnobservable.toFlowable(BackpressureStrategy.MISSING);}if(isSingle){returnobservable.singleOrError();}if(isMaybe){returnobservable.singleElement();}if(isCompletable){returnobservable.ignoreElements();}returnRxJavaPlugins.onAssembly(observable);}
finalclassCallEnqueueObservable<T>extendsObservable<Response<T>>{privatefinalCall<T>originalCall;CallEnqueueObservable(Call<T>originalCall){this.originalCall=originalCall;}@OverrideprotectedvoidsubscribeActual(Observer<?superResponse<T>>observer){// Since Call is a one-shot type, clone it for each new observer.Call<T>call=originalCall.clone();CallCallback<T>callback=newCallCallback<>(call,observer);observer.onSubscribe(callback);if(!callback.isDisposed()){call.enqueue(callback);//执行请求}}privatestaticfinalclassCallCallback<T>implementsDisposable,Callback<T>{privatefinalCall<?>call;privatefinalObserver<?superResponse<T>>observer;privatevolatilebooleandisposed;booleanterminated=false;CallCallback(Call<?>call,Observer<?superResponse<T>>observer){this.call=call;this.observer=observer;}@OverridepublicvoidonResponse(Call<T>call,Response<T>response){if(disposed)return;try{observer.onNext(response);if(!disposed){terminated=true;observer.onComplete();}}catch(Throwablet){Exceptions.throwIfFatal(t);if(terminated){RxJavaPlugins.onError(t);}elseif(!disposed){try{observer.onError(t);}catch(Throwableinner){Exceptions.throwIfFatal(inner);RxJavaPlugins.onError(newCompositeException(t,inner));}}}}@OverridepublicvoidonFailure(Call<T>call,Throwablet){if(call.isCanceled())return;try{observer.onError(t);}catch(Throwableinner){Exceptions.throwIfFatal(inner);RxJavaPlugins.onError(newCompositeException(t,inner));}}@Overridepublicvoiddispose(){disposed=true;call.cancel();}@OverridepublicbooleanisDisposed(){returndisposed;}}}
finalclassBodyObservable<T>extendsObservable<T>{privatefinalObservable<Response<T>>upstream;BodyObservable(Observable<Response<T>>upstream){this.upstream=upstream;}@OverrideprotectedvoidsubscribeActual(Observer<?superT>observer){upstream.subscribe(newBodyObserver<T>(observer));}privatestaticclassBodyObserver<R>implementsObserver<Response<R>>{privatefinalObserver<?superR>observer;privatebooleanterminated;BodyObserver(Observer<?superR>observer){this.observer=observer;}@OverridepublicvoidonSubscribe(Disposabledisposable){observer.onSubscribe(disposable);}@OverridepublicvoidonNext(Response<R>response){if(response.isSuccessful()){observer.onNext(response.body());}else{terminated=true;Throwablet=newHttpException(response);try{observer.onError(t);}catch(Throwableinner){Exceptions.throwIfFatal(inner);RxJavaPlugins.onError(newCompositeException(t,inner));}}}@OverridepublicvoidonComplete(){if(!terminated){observer.onComplete();}}@OverridepublicvoidonError(Throwablethrowable){if(!terminated){observer.onError(throwable);}else{// This should never happen! onNext handles and forwards errors automatically.Throwablebroken=newAssertionError("This should never happen! Report as a bug with the full stacktrace.");//noinspection UnnecessaryInitCause Two-arg AssertionError constructor is 1.7+ only.broken.initCause(throwable);RxJavaPlugins.onError(broken);}}}}
privateokhttp3.CallgetRawCall()throwsIOException{okhttp3.Callcall=rawCall;if(call!=null)returncall;// Re-throw previous failures if this isn't the first attempt.if(creationFailure!=null){if(creationFailureinstanceofIOException){throw(IOException)creationFailure;}elseif(creationFailureinstanceofRuntimeException){throw(RuntimeException)creationFailure;}else{throw(Error)creationFailure;}}// Create and remember either the success or the failure.try{returnrawCall=createRawCall();}catch(RuntimeException|Error|IOExceptione){throwIfFatal(e);// Do not assign a fatal error to creationFailure.creationFailure=e;throwe;}}
privateokhttp3.CallcreateRawCall()throwsIOException{//调用RequestFactory的create方法创建Request//调用CallFactory的newCall方法创建okhttp3.Callokhttp3.Callcall=callFactory.newCall(requestFactory.create(args));if(call==null){thrownewNullPointerException("Call.Factory returned null.");}returncall;}