手写retrofit框架
- 原始okHttp/retrofit:
RetrofitUnitTest
- 原始获取Get/Post参数:
ProxyUnitTest
- 自己手写的retrofit:
LearnMyRetrofitUnitTest
// 1. 构建retrofit请求对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.build();
// 2. 构建HOST的动态代理,并返回HOST的代理类
HOST host = retrofit.create(HOST.class);
// 3. 调用HOST方法,代理启用,从缓存中取得之前缓存的方法数据,并返回okHttp的call对象,并构造成功了内部的okHttp的request
Call<ResponseBody> call = host.get(IP, KEY);
// 4. 包装类call的方法执行,会调用真实类okHttp的execute方法,真实的去执行请求
retrofit2.Response<ResponseBody> response = call.execute();
1. new Retrofit.Builder().xxx.build()
存储baseURL,call.Factory(OkHttpClient)
2. retrofit.create(xxx.class)
Proxy.newProxyInstance(xxxxx),创建xxx.class动态代理类
3. xxx.get("", "")
xxx.get("", "")->调用代理类方法->loadServiceMethod(method)从缓存中取方法 ->
无缓存 -> 创建ServiceMethod并存储在集合中(创建build存储retrofit/method/methodAnnotations/parameterAnnotationsArray,最后build的时候,
遍历methodAnnotations->parseMethodAnnotation->parseHttpMethodAndPath存储httpMethod/relativeUrl/hasBody
遍历parameterAnnotationsArray->遍历parseParameter->parseParameterAnnotation根据注解取值,返回newParameterHandler.xxx<>(xxx),存储parameterHandlers->返回ServiceMethod)
有缓存 -> 取出ServiceMethod -> new OkHttpCall(ServiceMethod,args)-> 存储serviceMethod/args,执行serviceMethod.toCall(args)
【构建RequestBuilder请求对象,传入httpMethod/baseUrl/relativeUrl/hasBody,
遍历parameterHandlers,执行handlers[i].apply -> RequestBuilder.addxxx(name, xxx);
(RequestBuilder是okhttp操作的真正的类,里面就包括okhttp添加头,boy,参数等操作),最后执行call.Factory(OkHttpClient).newCall(requestBuilder.build())
(requestBuilder.build-> 里面真实执行了URL拼接,body构造,最后构建okhttp请求队列requestBuilder.url(url).method(method,body).build())】
->返回实现了okhttp的call接口的OkHttpCall
4. call.execute()
OkHttpCall.execute ->rawCall.execute-> call.execute