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