依赖
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>