Retrofit是对okhttp的封装库,通过注解支持restful写法,更简洁,更优雅。
1.引入
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
如果需要将返回结果用GSON解析,还需要引入convert库
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
2.创建Retrofit对象工具类
public class RetrofitClientUtil {
private static HashMap<String, Retrofit> retorfitMaps = new HashMap<>(); //根据baseUrl不同,缓存Retrofit对象
private static Retrofit getRetrofit(String baseUrl) {
if (!retorfitMaps.containsKey(baseUrl)) {
OkHttpClient client = new OkHttpClient();
client.setReadTimeout(30, TimeUnit.SECONDS);
client.setRetryOnConnectionFailure(true);
client.setConnectTimeout(20, TimeUnit.SECONDS);//设置超时
client.setWriteTimeout(30, TimeUnit.SECONDS);
//client.interceptors().add(new NotEdcodeLoggingInterceptor());//不加密时日志
client.networkInterceptors().add(new RequestHeaderInterceptor());//请求头
Retrofit retrofit = new Retrofit
.Builder()
// .baseUrl(CommunityConstants.SERVER_URI_NEW)
.baseUrl(baseUrl)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
// .addConverterFactory(EncryptionGsonConvertrFactory.create())//加密
.addConverterFactory(GsonConverterFactory.create())//不加密
.client(client)
.build();
retorfitMaps.put(baseUrl,retrofit);
}
return retorfitMaps.get(baseUrl);
}
public static <T> T createRequest(Class<T> service) {
Retrofit retrofit = getRetrofit(Constans.SERVER_URI_NEW);
T instance = retrofit.create(service);
return (T) requestMaps.get(service);
}
}
3.网络请求类:
(1)新建网络请求回调接口
public interface HttpBackListener {
void onSuccess(String requestId, Object object);
void onException(String requestId,String error);
}
(2)新建网络请求工具类
public class HttpRequestPresenter {
public Subscription updateUserInfo(String requestId,User user, HttpBackListener listener) {
UserService userService = HttpClient.createRequest(UserService.class);
return userService.updateUserInfo(user).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscriberImpl<LockInfoData>(requestId, listener));
}
class SubscriberImpl<T> extends Subscriber<T> {
private HttpBackListener listener;
private String requestId;
private SubscriberImpl(String requestId, HttpBackListener listener) {
this.listener = listener;
this.requestId = requestId;
}
public SubscriberImpl() {
super();
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (listener != null)
listener.onException(requestId, e.getMessage());
}
@Override
public void onNext(T t) {
if (listener != null)
listener.onSuccess(requestId, t);
}
}
}
4.请求服务接口
public interface UserService<T> {
@POST("userService/updateUserInfo")
Observable<User> updateUserInfo(@Body User user);
}
5.调用
HttpRequestPresenter httpPresenter = new HttpRequestPresenter();
httpPresenter.updateUserInfo("updateUserInfo", user, new HttpBackListener() {
@Override
public void onSuccess(String requestId, Object object){
}
@Override
public void onException(String requestId, String error{
}
});
- 如上框架使用就算完成了,下面讲一下服务接口注解的用法
(1)@path
/**http://xxx.com/userService/getUser/2/sun*/
@GET("userService/getUser/{id}/{name}")
Observable<User> getUser(@Path("id") String id,@Path("name") String name);
(2)@Query
/**http://xxx.com/userService/getUser?name=sun*/
@GET("userService/getUser")
Observable<User> getUser(@Query("name") String name);
(3)@QueryMap (效果同Query)
@GET("userService/getUser")
Observable<User> getUser(@QueryMap Map<String, String> map);
还有一种类似的,传
(4)@Multipart
@POST("userService/uploadFiles")
@Multipart
Observable<User> uploadFiles(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);
或者
@POST("userService/uploadFiles")
@Multipart
Observable<User> uploadFiles(@PartMap Map<String, RequestBody> maps, @Part MultipartBody.Part file);
文件上传代码
MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", "test.txt", file);
UserService userService = HttpClient.createRequest(UserService.class); userService.uploadFiles("name","age",filePart)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscriberImpl<LockInfoData>(requestId, listener));
还有Field、FieldMap、Header、Headers、Url等注解,不过以上基本上开发中能碰到的需求都能cover掉了。