写点什么

Retrofit 源码解读 HTTP

用户头像
Changing Lin
关注
发布于: 58 分钟前
Retrofit源码解读HTTP

1.项目概要:

本文主要介绍Retrofit如何使用,源码解读,如何实现HTTP请求?
复制代码

2.背景和需求

  • 实现 Service interface 接口类


public interface IMSearchUserService {    @FormUrlEncoded    @POST("/user/heartbeat")    Observable<Result> ping(@FieldMap Map<String, Object> fields);}
复制代码


  • 构建 Retrofit 来实例化 IMSearchUserService 实例


        Gson gson = new GsonBuilder() // 用于json的序列化                .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")                .serializeNulls()                .create();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // okhttp的拦截器
TokenInterceptor tokenInterceptor = new TokenInterceptor(); // 自定义okhttp的拦截器 OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(tokenInterceptor) .addInterceptor(interceptor) .retryOnConnectionFailure(true) .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .build();
Retrofit mRetrofit = new Retrofit.Builder() .baseUrl(ServerConfig.getInstance().getBaseUrl()) .client(client) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson)) // .addConverterFactory(FastJsonConverterFactory.create()) .build();
IMSearchUserService service = mRetrofit.create(IMSearchUserService.class);
复制代码


  • 调用 IMSearchUserService 接口中的 ping 方法


        final Map<String, Object> params = new HashMap<>();        params.put("userId", loginUserId);        params.put("access_token", mAccessToken);        service.ping(params)                .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(result -> { // 请求成功                    // 对请求结果进行解析                }, throwable -> { // 请求失败异常                    LogUtil.printException(throwable);                });
复制代码

3.实现原理

  • Retrofit 是如何实例化接口类的?


// Retrofit.javapublic <T> T create(final Class<T> service) {    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },        new InvocationHandler() {          private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, @Nullable Object[] args) throws Throwable { // If the method is a method from Object then defer to normal invocation. if (method.getDeclaringClass() == Object.class) { return method.invoke(this, args); } if (platform.isDefaultMethod(method)) { return platform.invokeDefaultMethod(method, service, proxy, args); } ServiceMethod<Object, Object> serviceMethod = (ServiceMethod<Object, Object>) loadServiceMethod(method); OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args); return serviceMethod.callAdapter.adapt(okHttpCall); } }); }
复制代码

4.使用方法

未完待续

5.对比

未完待续

6.成果展示

未完待续

7.参考文献

未完待续

发布于: 58 分钟前阅读数: 2
用户头像

Changing Lin

关注

获得机遇的手段远超于固有常规之上~ 2020.04.29 加入

我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。

评论

发布
暂无评论
Retrofit源码解读HTTP