Retrofit+OkHttp+RXJava+自定义拦截器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Retrofit+OkHttp+RXJava+自定义拦截器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5597字,纯文字阅读大概需要8分钟。
内容图文
//自定义拦截器
public class CustomIntercept implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
SharedPreferences sp = App.mcontext.getSharedPreferences("config", Context.MODE_PRIVATE);
String userId = sp.getString("userId", "");
String sessionId = sp.getString("sessionId", "");
Request.Builder newBuilder = original.newBuilder();
newBuilder.method(original.method(), original.body());
if (!TextUtils.isEmpty(userId) && !TextUtils.isEmpty(sessionId)) {
newBuilder.addHeader("userId", userId);
newBuilder.addHeader("sessionId", sessionId);
}
Request request = newBuilder.build();
return chain.proceed(request);
}
}
//Retrofit+OkHttp+RXJava
public class RetrofitManagerUtil<T> {
private final String BASE_URL = "http://mobile.bwstudent.com/small/";
private static RetrofitManagerUtil manager;
//单例模式
public static synchronized RetrofitManagerUtil getInstance() {
if (manager == null) {
manager = new RetrofitManagerUtil();
}
return manager;
}
//声明BaseApis
private BaseApis mBaseApis;
public RetrofitManagerUtil() {
//日志拦截器
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//获取 builder对象
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.writeTimeout(15, TimeUnit.SECONDS);//写入超时
builder.readTimeout(15, TimeUnit.SECONDS);//读取超时
builder.connectTimeout(15, TimeUnit.SECONDS);//连接超时
builder.addNetworkInterceptor(interceptor);//添加自定义拦截器
builder.retryOnConnectionFailure(true);
//获取 client 对象
OkHttpClient client = builder.build();
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(BASE_URL)
.client(client)
.build();
mBaseApis = retrofit.create(BaseApis.class);
}
public Map<String, RequestBody> generateRequestBody(Map<String, String> requestDataMap) {
Map<String, RequestBody> requestBodyMap = new HashMap<>();
for (String kay : requestDataMap.keySet()) {
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"),
requestDataMap.get(kay) == null ? "" : requestDataMap.get(kay));
requestBodyMap.put(kay, requestBody);
}
return requestBodyMap;
}
/**
* get请求
*
* @param url
* @return
*/
public RetrofitManagerUtil get(String url, HttpListener mHttpListener) {
mBaseApis.get(url)
.subscribeOn(Schedulers.io())//后台执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())//最终完成后执行在哪个线程
.subscribe(getObserver(mHttpListener));//设置我们的 RxJava
return manager;
}
/**
* 表单post请求
*
* @param url
* @param map
* @return
*/
public RetrofitManagerUtil postFormBody(String url, Map<String, RequestBody> map, HttpListener mHttpListener) {
//判断,当map为空的时候,重新创建一个 HashMap
if (map == null) {
map = new HashMap<>();
}
mBaseApis.postFormBody(url, map)//postFormBody请求
.subscribeOn(Schedulers.io())//后台执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())//最终完成后执行在哪个线程
.subscribe(getObserver(mHttpListener));//设置我们的 RxJava
return manager;
}
/**
* 普通put请求
*
* @param url
* @param map
* @return
*/
public RetrofitManagerUtil put(String url, Map<String, Object> map, HttpListener mHttpListener) {
//判断,当map为空的时候,重新创建一个 HashMap
if (map == null) {
map = new HashMap<>();
}
mBaseApis.put(url, map)//post请求
.subscribeOn(Schedulers.io())//后台执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())//最终完成后执行在哪个线程
.subscribe(getObserver(mHttpListener));//设置我们的 RxJava
return manager;
}
/**
* 普通post请求
*
* @param url
* @param map
* @return
*/
public RetrofitManagerUtil post(String url, Map<String, Object> map, HttpListener mHttpListener) {
//判断,当map为空的时候,重新创建一个 HashMap
if (map == null) {
map = new HashMap<>();
}
mBaseApis.post(url, map)//post请求
.subscribeOn(Schedulers.io())//后台执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())//最终完成后执行在哪个线程
.subscribe(getObserver(mHttpListener));//设置我们的 RxJava
return manager;
}
/**
* 创建观察者模式
*/
private Observer getObserver(final HttpListener mHttpListener) {
Observer mObserver = new Observer<ResponseBody>() {
@Override
public void onCompleted() {
}
@Override
public void one rror(Throwable e) {
if (mHttpListener != null) {
mHttpListener.onFailed(e.getMessage());
}
}
@Override
public void onNext(ResponseBody responseBody) {
try {
String data = responseBody.string();// TODO: 2018/12/27 注意: 这里是string(),不是toString()!!!
if (mHttpListener != null) {
mHttpListener.onSuccess(data);
}
} catch (IOException e) {
e.printStackTrace();
if (mHttpListener != null) {
mHttpListener.onFailed(e.getMessage());
}
}
}
};
return mObserver;
}
//声明接口
private HttpListener mHttpListener;
// set方法
public void setHttpListener(HttpListener httpListener) {
mHttpListener = httpListener;
}
//自定义接口
public interface HttpListener {
void onSuccess(String data);//成功
void onFailed(String error);//失败
}
}
//BaseApi
import java.util.Map;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.PartMap;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
import rx.Observable;
public interface BaseApis<T> {
//get请求
@GET
Observable<ResponseBody> get(@Url String url);
//post请求
@POST
Observable<ResponseBody> post(@Url String url, @QueryMap Map<String, String> map);
//post表单请求
@Multipart
@POST
Observable<ResponseBody> postFormBody(@Url String url, @PartMap Map<String, RequestBody> requestBodyMap);
//put请求
@PUT
Observable<ResponseBody> put(@Url String url, @QueryMap Map<String, String> map);
}
内容总结
以上是互联网集市为您收集整理的Retrofit+OkHttp+RXJava+自定义拦截器全部内容,希望文章能够帮你解决Retrofit+OkHttp+RXJava+自定义拦截器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。