主流框架开源库

主流开源库-Retrofit的使用

2020-04-15  本文已影响0人  isLJli

基本使用

github官网 官方文档

第一定义一个接口

/**
* 第一步新建立一个接口
*/
public interface ServiceApi {
  @GET("use") //登陆接口 GET(相对路径)
  Call<User> userLogin(
          //@Query(后台需要解析的路径)
          @Query("userName") String userName,
          @Query("password") String password);

}

第二步创建Retrofit和接口的实例

public class RetrofitClient {

  private static final  ServiceApi mServiceApi;

  static {
      OkHttpClient okHttpClient=new OkHttpClient();

      Retrofit retrofit = new Retrofit.Builder()
              .baseUrl("http://192.168.220.1:8080/")
              //添加解析转换工厂 Gson解析、Xml解析等
              .addConverterFactory(GsonConverterFactory.create())  //这是我们最常用的两个方法
          //    .addCallAdapterFactory()
              //添加okhttpClient,不添加默认就是光杆okhttpClient
              .client(okHttpClient)
              .build();


      //创建接口的实例对象
      mServiceApi = retrofit.create(ServiceApi.class);
  }


  public static ServiceApi getServiceApi(){
      return mServiceApi;
  }
}

根据接口实例调用其方法请求数据,并得到返回数据

Call<User> call= RetrofitClient.getServiceApi().userLogin("DaMing","12345");
     call.enqueue(new Callback<User>() {
         @Override
         public void onResponse(Call<User> call, Response<User> response) {
             User user = response.body();

         }

         @Override
         public void onFailure(Call<User> call, Throwable t) {

         }
     });

2.使用retrofit的优化

问题:
1.不能打印服务端返回的信息?
通过retrofit订阅的okhttpclient,拿到此okhttpclient的拦截器拿到我们的请求和返回的数据,然后把此数据打印出来。okhttp已经为我们提供了此封装的拦截器可以直接打印数据:HttpLoggingInterceptor官网文档

//添加依赖:
implementation 'com.squareup.okhttp3:logging-interceptor:4.3.1'
//为okhttpClient添加上.addInterceptor拦截器
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(Level.BASIC);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(logging)
.build();

在项目中使用代码:

OkHttpClient okHttpClient=new OkHttpClient.Builder()
              .addInterceptor(new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
                  @Override
                  public void log(@NotNull String s) {
                      Log.d("TAG",s);
                  }
              }).setLevel(HttpLoggingInterceptor.Level.BODY))
              .build();

      Retrofit retrofit = new Retrofit.Builder()
              .baseUrl("http://192.168.220.1:8080/")
              //添加解析转换工厂 Gson解析、Xml解析等
              .addConverterFactory(GsonConverterFactory.create())  //这是我们最常用的两个方法
          //    .addCallAdapterFactory()
              //添加okhttpClient,不添加默认就是光杆okhttpClient
              .client(okHttpClient)
              .build();

2.对于返回数据的状态,比如出现错误404等,没有做相应的处理。
思路:根据返回的状态码做不同的响应
1.把返回的数据的,共有部分专门写一个类,如返回的状态码、消息等。

public class BaseResult {

  String code;

  String msg;
   .....
}

2.写一个总的返回数据类,用泛型表示我们想要的数据(写在上面同一个类中也可以)

//使用泛型T,来存储我们变化的数据
public class Result<T> extends BaseResult{
 public Object data;
}

3.写一个实现Callback接口的抽象类,在里面判断code的状态

public abstract class HttpCallBack<T> implements Callback<Result<T>> {

  @Override
  public void onResponse(Call<Result<T>> call, Response<Result<T>> response) {
      Result<T> result = response.body();

      if(!result.getCode().equals("200")){
          onError(result.code,result.msg);
      }
      // 解析,获取类上面的泛型
      Class <T> dataClass = (Class <T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
      Gson gson = new Gson();
      T data=gson.fromJson(result.data.toString(),dataClass);
      onSuccess(data);
  }

  @Override
  public void onFailure(Call<Result<T>> call, Throwable t) {
      // 处理失败,联网,解析出错

  }

  //成功的话直接返回我们需要的T
  public abstract void onSuccess(T result);

  public abstract void onError(String code,String msg);
}

4.执行接口请求

RetrofitClient.getServiceApi().userLogin("daming","23")
            .equals(new HttpCallBack<User>() {
                @Override
                public void onSuccess(User result) {
                    Toast.makeText(MainActivity4.this,result.getName(),Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(String code, String msg) {
                    Toast.makeText(MainActivity4.this,code+msg,Toast.LENGTH_LONG).show();

                }
            });

3. baseUrl 问题?Retrofit 找不到任何入口可以修改
1 不同的 baseUrl 构建不同的 Retrofit 对象 (不应该首选)
2 自己想办法,取巧也行走漏洞

上一篇 下一篇

猜你喜欢

热点阅读