对于Retrofit2刚开始用的时候说真的很不习惯,感觉封装OKhttp之后反而更麻烦了,后来用到项目中就感觉这个框架很强大,请求网络变得更灵活了,而且易于维护,还可以和时下比较火热的RxJava进行完美融合,在Retrofit2中是用Gson解析数据的。这里只是简单的说下Retrofit2的使用,对于Retrofit2 + RxJava 本人也是在学习中,各位有好的资源还请分享,共同学习。好了,下面记录下本人在项目中对于Retrofit2的封装使用。
导库
这里我将Retrofit2和Gson的库同时导入,各位可以到GitHub查看最新版本,这里我将版本写到project的gradle中,在需要用的地方引用即可。
ext{
gsonVersion = '2.8.1'
// retrofit2
retrofitVersion ='2.3.0'
}
// Gson解析
compile "com.google.code.gson:gson:$rootProject.ext.gsonVersion"
// Retorfit2
compile "com.squareup.retrofit2:retrofit:$rootProject.ext.retrofitVersion"
贴代码
下面将我们需要使用的请求方式写到接口中,这里我就不一一举例了,就写了一些常用的请求。RetrofitService接口代码:
public interface RetrofitService {
/**
* 请求数据
*
* @param url
* @param body
* @return
*/
@POST()
Call<ResponseBody> postWithBody(@Url String url, @Body RequestBody body);
/**
* 单文件上传
*
* @param url
* @param type
* @param maskey
* @param androidID
* @param file
* @return
*/
@Multipart
@POST()
Call<ResponseBody> upload(@Url String url, @Part("type") RequestBody type, @Part("maskey") RequestBody maskey, @Part("androidID") RequestBody androidID, @Part("account") RequestBody account, @Part("isVisible") RequestBody isVisible, @Part("binder") RequestBody binder, @Part MultipartBody.Part file);
/**
* 多文件上传
*下面是我需要的参数,你可以更具需求改变
* @param url
* @param type
* @param maskey
* @param androidID
* @param parts
* @return
*/
@Multipart
@POST()
Call<ResponseBody> multUpload(@Url String url, @Part("type") RequestBody type, @Part("maskey") RequestBody maskey, @Part("androidID") RequestBody androidID, @Part("binder") RequestBody binder, @Part() List<MultipartBody.Part> parts);
下面是网络请求的接口
IHttpData:
public interface IHttpData {
void getHttpData(String url, Map parameter, HttpData.OnResponseListener responseListener);
void upload(String url, String type, String maskey, String androidID, String binder, String fileUri, HttpData.OnResponseListener responseListener);
void multUpload(String url, String type, String maskey, String androidID ,String binder, List<String> filePaths, HttpData.OnResponseListener responseListener);
}
定义好接口之后就要实现我们的接口的方法的,访问网络的请求,及状态返回的处理,HttpData代码如下:
public class HttpData implements IHttpData {
private static final String TAG = HttpData.class.getSimpleName();
private static Retrofit retrofit;
private static RetrofitService retrofitService;
OkHttpClient client;
public HttpData() {
if (retrofit == null) {
// 这里是设置网络超时,文件上传或下载可能比较慢
// client = new OkHttpClient.Builder()
// .connectTimeout(1, TimeUnit.DAYS)
// .writeTimeout(1, TimeUnit.DAYS)
// .readTimeout(1, TimeUnit.DAYS)
// .build();
retrofit = new Retrofit.Builder().baseUrl(HttpUrl.BASE_HTTP).client(client).build();
retrofitService = retrofit.create(RetrofitService.class);
}
}
@Override
public void getHttpData(String url, Map parameter, final OnResponseListener responseListener) {
//网络请求,获取数据
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), new JSONObject(parameter).toString());
//启动请求
Call<ResponseBody> call = retrofitService.postWithBody(url, body);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String json =response.body().string();
responseListener.responseSuccess(json);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
responseListener.responseFailed();
}
});
}
/**
* 上传单个文件
*
* @param url
* @param type
* @param fileUri
* @param responseListener
*/
@Override
public void upload(String url, String type, String maskey, String androidID, String binder, String fileUri, final OnResponseListener responseListener) {
File file = new File(fileUri);
RequestBody typeRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), type);
RequestBody maskeyRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), maskey);
RequestBody androidIDRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), androidID);
RequestBody binderRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), binder);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part fileBody = MultipartBody.Part.createFormData("media", file.getName(), requestFile);
Call<ResponseBody> call = retrofitService.upload(url, typeRequestBody, maskeyRequestBody, androidIDRequestBody, binderRequestBody, fileBody);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String json = response.body().string();
responseListener.responseSuccess(json);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
responseListener.responseFailed();
}
});
}
/**
* 多文件上传
*
* @param url
* @param type
* @param filePaths
* @param responseListener
*/
@Override
public void multUpload(String url, String type, String maskey, String androidID, String binder, List<String> filePaths, final OnResponseListener responseListener) {
RequestBody typeRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), type);
RequestBody maskeyRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), maskey);
RequestBody androidIDRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), androidID);
RequestBody binderRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), binder);
List<MultipartBody.Part> parts = new ArrayList<>(filePaths.size());
for (int i = 0; i < filePaths.size(); i++) {
File file = new File(filePaths.get(i));
RequestBody fileBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), fileBody);
parts.add(part);
}
Call<ResponseBody> call = retrofitService.multUpload(url, typeRequestBody, maskeyRequestBody, androidIDRequestBody, binderRequestBody, parts);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String json = response.body().string();
responseListener.responseSuccess(json);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
responseListener.responseFailed();
}
});
//这个接口是为了告诉调用者该网络请求的状态
public interface OnResponseListener {
void responseSuccess(String json);
void responseFailed();
}
}
这样就将Retrofit2的网络请求都封装好了,这样封装是为了使用方便,易于维护,不用修改每一个有网络请求的地方,只需要修改我们的接口和方法即可,使用就更简单了,直接实例化我们的HttpData 就好了,调用需要的请求。
//实例化网络的请求类
HttpData httpData = new HttpData();
//map存储我们的访问参数
Map map = new HashMap();
//url 即我们的接口
httpData.getHttpData(url, map, new HttpData.OnResponseListener() {
@Override
public void responseSuccess(String json) {
//这里表示访问成功,处理服务端返回的json,用Gson转换即可
}
@Override
public void responseFailed() {
//这里表示访问出错了
}
});
对于Retrofit2的理解不深,文档写的不好,勿喷,让各位见笑了,希望能帮助到刚学习的人,记录下来也是为了让自己对与Retrofit2的理解更深刻一些,大神们有更好的封装使用方法还请赐教。