基本使用
第一定义一个接口
/**
* 第一步新建立一个接口
*/
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 自己想办法,取巧也行走漏洞
网友评论