Retrofit使用動態代理來爲interface動態生成每個方法,方便接口定義和調用,和OKHttp緊密結合。可定製的有
1 Converter.Factory
用於生成參數轉換器Converter,Converter可以將參數轉換爲RequestBody,將ResponseBody轉換爲返回值。Retrofit內置了兩個Factory,一個是BuiltInConverter;另一個是GsonConverterFactory,使用Gson來將參數轉換爲RequestBody和將ResponseBody轉換爲方法的返回值
2 CallAdapter.Factory
適配底層的OKHttp的Call,做調用底層OKHttp的Call之前轉換參數生成RequestBody,執行後從ResponseBody中轉換獲取方法的返回值。
3 okhttp3.Call.Factory
用於生成OKHttp的Call,真正執行網絡操作
調用Retrofit.create後,生成一個動態代理Proxy.newProxyInstance,調用下面的代碼開始生成ServiceMethod方法,生成OKHttp的Call
ServiceMethod serviceMethod = loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
4 ServiceMethod
在調用指定的方法時,生成對應的,根據註解填充ServiceMethod對應的域,其中ParameterHandler是對某個參數來生成對應的Request相應的字段。
5 使用@Body Post單個字符串時帶有引號
Post時,用@Body來註解字符串,會給字符串兩側添加引號,這時Gson的行爲,序列化一個字符串時加上引號。此時可以用@FormUrlEncoded註解方法,@Field註解參數來生成form形式的RequestBody