Android Retrofit

发布时间:2026/7/8 8:07:39

Android Retrofit 最小实现定义接口publicinterfaceApiService{// GET(user)// 声明这是一个 GET 请求请求路径是 baseUrl user// 注意这里只是“接口定义”Retrofit 还没有真正发请求GET(user)CallStringgetUser();}创建 RetrofitRetrofitretrofitnewRetrofit.Builder().baseUrl(https://example.com/)// 设置根地址所有接口路径都会拼接在后面// 设置数据转换器这里是把 response body 当 String 处理// 常见还有 GsonConverterFactory解析 JSON.addConverterFactory(ScalarsConverterFactory.create())//.build();//构建 Retrofit 实例完成配置创建接口实现 (动态代理生成)// 关键点这里不是 new ApiService()// 而是 Retrofit 用“动态代理 Proxy”生成实现类// 本质返回的是一个 Proxy.newProxyInstance(...) 生成的对象// 你调用 api.getUser() 实际进入 InvocationHandler 调用 invoke 方法ApiServiceapiretrofit.create(ApiService.class);发起请求CallStringcallapi.getUser();call.enqueue(newCallbackString(){// 异步请求同步请求 使用 call.executor()OverridepublicvoidonResponse(CallStringcall,ResponseStringresponse){System.out.println(response.body());}OverridepublicvoidonFailure(CallStringcall,Throwablet){t.printStackTrace();}});Retrofit 原理Retrofit 本质是一个“接口驱动的 HTTP 请求框架”是对 OkHttp 的封装。通过动态代理把接口方法转换为 HTTP 请求再交给 OkHttp 执行。使用了 建造者模式 创建 Retrofit 对象使用了 代理模式 实例化 请求接口动态代理 retrofit.create(ApiService.class)方法 转发给 InvocationHandler.invoke() 执行Retrofit.create() 做了什么核心代码逻辑简化return(ApiService)Proxy.newProxyInstance(ApiService.class.getClassLoader(),newClass[]{ApiService.class},newInvocationHandler());Proxy 生成一个 “假类” 执行的方法 例如api.getUser()转发给 InvocationHandler.invoke() 执行简化逻辑class$Proxy0implementsApiService{InvocationHandlerhandler;publicCallUsergetUser(Stringid){returnhandler.invoke(this,ApiService.getUserMethod,newObject[]{id});}}invoke 内部逻辑解析方法Method提取Method 上的注解信息GET(user)CallUsergetUser()Retrofit 会解析HTTP Method GETURL /user找Method 对应的 ServiceMethodRetrofit 会缓存ServiceMethodserviceMethodloadServiceMethod(method);里面包含请求方式baseUrl注解解析结果参数解析规则如果 getUser() 中有参数的话Retrofit 将 Method 转换并缓存为 ServiceMethod用于封装请求解析规则构建 RequestRequestrequestnewRequest.Builder().url(https://api.com/user?id123).build();返回Call对象returnnewOkHttpCall(request);Retrofit 首先通过反射解析 Method 上的注解信息提取 HTTP 请求描述然后将 Method 转换并缓存为 ServiceMethod用于封装请求解析规则当方法被调用时ServiceMethod 会结合参数生成最终 Request最后封装为 OkHttpCall 交由 OkHttp 执行。完整链路api.getUser() ↓ Proxy 代理类 ↓ InvocationHandler.invoke() ↓ Retrofit 解析 Method Annotation ↓ 生成 ServiceMethod ↓ 构建 Request ↓ 返回 Call ↓ OkHttp 执行请求动态代理的本质就是用一个运行时生成的代理对象把接口方法调用统一转发到 InvocationHandler从而实现“方法级别的拦截与增强”。总结Retrofit 本质是对 OkHttp 的封装。它通过动态代理为接口生成实现类。当调用接口方法时会进入InvocationHandler.invoke()然后通过反射解析方法上的GET、POST、Query等注解并将解析结果封装、缓存为ServiceMethod。接着ServiceMethod会结合实际参数构建 OkHttp 的Request再封装成Call返回。只有调用execute()或enqueue()时才会真正交给 OkHttp 发起请求。一句话总结Retrofit 通过动态代理和反射把接口方法转换成 HTTP 请求最终交给 OkHttp 执行。

相关新闻