android - retrofit 源码分析

好记性不如写博客。
进入自问自答环节:
Retrofit 有什么东西呢?
  • 动态代理模式
  • 工厂模式
  • 建造者模式
  • 注解反射

Retrofit 那些类是必须要说的?

  • Retrofit
  • requestFactory
  • ParameterHandler
  • HttpServiceMethod
  • Converter
  • CallAdapter

思考问题?
请求加密 响应解密 该如何做?
返回体加入特殊字段怎么做?


开始

流程:因为uml 不方便放上去,所以就简单说下。

简单使用:

RetrofitInit.class
init(){

  retrofit = new Retrofit.Builder()
                .client(getDefaultOkHttpClient().build())
                .baseUrl(ApiConstants.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(getGson()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
     }
     
Method.class
	@GET("/") Single<BaseResult<String>> http();
    @POST("/") Single<BaseResult<String>> request(@Body String body);

use:
	retrofit.create(Method.class).request();
	retrofit.create(Method.class).http();

简单流程:

  1. (Retrofit) 请求方法()
  2. (RequestFactory) 校验注解
    1. 校验方法(GET POST) 是否正确。
    2. 校验解析参数与方法是否对应
    3. (Converter requset String 转换 ) POST 和 GET 进行分类并且调用 requestBodyConverter | stringConverter 转化并组装。
  3. (HttpServiceMethod)返回类型 类型的校验。括号里面不符合 (void GenericArrayType(数组) TypeVariable(T ) WildcardType(通配符) ) 从外到里 判断。
    1. 确认 返回 适配器(CallAdapter.get()) == 返回类型
    2. 确定返回response 转换器 Converter.responseBodyConverter
    3. (OkHttpCall)配置okhttp 请求 响应 取消等流程
  4. invoke

思考:

Converter.responseBodyConverter 正式使用?
在哪里算是真正的执行 OkHttpCall.execute?

解答:

问题一: 请求加密 响应解密 该如何做?

添加自定义 addConverterFactory
>>>>(具体写法可参照 GsonConverterFactory.create(getGson())).

注意:

stringConverter 支持:

@FieldMap @HeaderMap @Path @Query @QueryMap @Field

requestBodyConverter 支持

@Body  @Part @PartMap

可以自定义注解 标识改http 是否要加密。

 @BASE64
 @POST("/") 
Single<BaseResult<String>> request(@Body String body);

问题二: 返回体加入特殊字段怎么做?

这里只能提个思路。业务不同,不好细说。
BaseResult 是我们定义resultType
responseBodyConverter 方法中可以获取返回类型。

彩蛋:
设置 validateEagerly=true,会发现不一样的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值