网络请求框架Retrofit

依赖

github搜索Retrofit

implementation 'com.squareup.retrofit2:retrofit:2.3.0'

配置 Retrofit

retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.18.249:8080/")
.build();

定义数据接口

public interface DataServer {
    //@Get 表示定义一个 get 请求方法 ,@Get 后面内容表示请求的子路径
    //@Query("id") 表示在地址后添加的参数 , 如这里的 id 则表示为 http://zzz.zzz/user_info?id=userId
    @GET("user_info")
    Call<ResponseBody> getUserInfo(@Query("id") Integer userId);
}

使用数据接口

创建数据接口实例,使用 Retrofit 的 create 方法来创建

DataServer dataServer = retrofit.create(DataServer.class);

调用接口方法

Call<ResponseBody>call=dataServer.getUserInfo(5);

执行请求解析结果

call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        if(response.isSuccessful()){
            String str = null;
            try {
                str = response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }
            tv.setText(str);
        }
    }
    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
    }
});

Json解析:

依赖转换模块

implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

添加转换工厂,可以自定义 gson 对象

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
    // 配置 Retrofit
    retrofit = new Retrofit.Builder()
        .baseUrl("http://192.168.18.249:8080/")
        .addConverterFactory(GsonConverterFactory.create(gson)) // 添加转换器
        .build();

对于固定返回的json格式 如:

{code:1,data:{}} 或者 {code:1,data:[]}

可以封装一个基本的模板

public class BaseData<T>{
    private int code;
    private T data;
    ...
}

如果要获取一个结果的对象,如获取用户基本信息方法,可以使用如下:

@GET("user_info")
Call<BaseData<User>> getUserInfo(@Query("id") Integer userId);
Call<BaseData<List<Article>>> ...

解析结果如下:

DataServer dataServer=retrofit.create(DataServer.class);
    Call<BaseData<User>>call=dataServer.getUserInfo(5);
    call.enqueue(new Callback<BaseData<User>>() {
        @Override
        public void onResponse(Call<BaseData<User>> call, Response<BaseData<User>> response) {
            if(response.isSuccessful()){
                BaseData<User> data = response.body();
                if(data.getCode()==1) {
                    User u = data.getData();
                    tv.setText(u.toString());
                }else{
                    tv.setText(" 获取失败 ");
                }
            }
        }
        @Override
        public void onFailure(Call<BaseData<User>> call, Throwable t) {

        }
    });

OkHttp 配置

主要配置缓存,公共参数,请求头信息,读写,连接超时配置

private OkHttpClient.Builder getOkHttpBuilder(){
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    //配置缓存大小,/mnt/sdcard/Android/data/应用包名/cache/weibocache
    File cacheFile = new File(context.getExternalCacheDir(),"weibocache");
    Cache cache = new Cache(cacheFile,1024*1024*50);  
    //配置缓存操作的过滤器
    Interceptor cacheInterceptor = new Interceptor(){
        @Override
        public Response intercept(Chain chain)throws IOException{
            // 配置请求模式
            Request request = chain.request();
            Request.Builder requestBuilder = request.newBuilder().method(request.method(),request.body());
            // 检测网络连接状态
            if(isConnected()){
            //连网状态不读缓存
            requestBuilder.cacheControl(CacheControl.FORCE_NETWORK);
            }else{
                // 不联网读缓存
                requestBuilder.cacheControl(CacheControl.FORCE_CACHE);
                }
            Request newRequest = requestBuilder.build();
            Response response = chain.proceed(newRequest);
            if(isConnected()){
                // 联网环境,缓存超时时间设置为 0
                response = response.newBuilder()
                    .removeHeader("Pragma")
                    .header("Cache-Control","public,max-age=0")
                    .build();
            }else{
                // 不联网环境,缓存超时时间设置为一周
                response = response.newBuilder()
                .removeHeader("Pragma")
                .header("Cache-Control","public,only-if-cached,max-stale="+(60*60*24*7))
                .build();           
            }
            return response;
        }
    };
    // 添加缓存配置
    builder.cache(cache).addInterceptor(cacheInterceptor);
    // 配置读写超时时间
    builder.readTimeout(30, TimeUnit.SECONDS);
    builder.writeTimeout(30,TimeUnit.SECONDS);
    builder.connectTimeout(30,TimeUnit.SECONDS);
    // 错误重连
    builder.retryOnConnectionFailure(true);
    return builder;

}

添加配置

    retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.18.249:8080/");
                //添加转换器
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(getOkHttpBuilder().builder())//okHttp配置
                .build();

注解

基本的请求方法
@GET@POST@PUT@HEAD@DELETE 、等等
URL地址中使用的注解
@Query 添加单个参数 (String 以及基本数据类型 )
@QueryMap  添加多个参数类型为 Map<String,String>
表单
@FormUrlEncoded  描述表单内容提交(提交的是字符串)
@Multipart 描述的带文件的表单(文件上传)

@Field  表示提交一个字符串参数
@FieldMap  多个字符串参数

@Part  提交单个文件,数据类型 Multipart.Part
@PartMap  多文件上传,数据类型为 Map<String,Multipart.Part>

猜你喜欢

转载自blog.csdn.net/life_s/article/details/79489856