java封装拦截请求_Retrofit,OkHttp拦截器,RxJava封装请求网络
Retrofit和Okhttp和RxJava的封装
导入依赖
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.squareup.okhttp3:okhttp:3.9.0'加入权限
先写几个公共的封装类
retrofit的封装类
public class RetrofitUtils {
private static IGetService service = null;
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
//单例模式
public static IGetService getInstance(){
if(service==null){
synchronized (RetrofitUtils.class){
if(service==null){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.tianapi.com")
.addConverterFactory(ScalarsConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(OkHttpUtils.getInstance())
.build();
service = retrofit.create(IGetService.class);
}
}
}
return service;
}
}okhttp的封装类
public class OkHttpUtils {
private static OkHttpClient client = null;
public static OkHttpClient getInstance(){
if(client==null){
synchronized (OkHttpUtils.class){
if(client==null){
client = new OkHttpClient.Builder()
.connectTimeout(2000, TimeUnit.SECONDS)
.writeTimeout(2000,TimeUnit.SECONDS)
.readTimeout(2000,TimeUnit.SECONDS)
.addInterceptor(new LoggingInterceptor())
.addInterceptor(new CommonHeaderInterceptor())
.build();
}
}
}
return client;
}
}
LoggingInterceptor日志拦截器的封装
public class LoggingInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Response response = chain.proceed(request);
long t2 = System.nanoTime();
System.out.println(" this request url "+response.request().url()+" "+(t2-t1)/1000000);
return response;
}
}CommonHeaderInterceptor公共的请求头拦截器
public class CommonHeaderInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder builder = request.newBuilder();
builder.addHeader("key","aa");
builder.addHeader("User-Agent","android");
return chain.proceed(builder.build());
}
}观察者Observer的封装
//观察者的封装
public abstract class AbstractObserver implements Observer {
//不需要下面重写的四个方法,只需要自己写的两个抽象方法
public abstract void onSuccess(T t);
public abstract void onFailure();
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String result) {
//这里的s是请求网络传回来的string字符串
Type type = getClass().getGenericSuperclass();
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
Class clazz = (Class) types[0];//强转成类对象
//使用gson解析
Gson gson = new Gson();
T t = (T) gson.fromJson(result,clazz);
//调用抽象方法onSuccess
onSuccess(t);
}
@Override
public void onError(Throwable e) {
onFailure();
}
@Override
public void onComplete() {
}
}Retrofit的接口
public interface IGetService {
/* @GET("/nba")
Observable get(@QueryMap Map map);*/
//-----------------------下面用于封装的请求
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
//返回string字符串的请求方法,传后面整个url
@GET
Observable get1(@Url String url);//重载
@GET
Observable get1(@Url String url,@QueryMap Map map);
@FormUrlEncoded
@POST
Observable post1(@Url String url, @FieldMap Map map);
@POST
Observable post1(@Url String url);
}APIFactory.java这个类里面有对应的四个方法get1, post1
public class APIFactory {
//单例模式
private static APIFactory factory = null;
public static APIFactory getInstance(){
if(factory==null){
synchronized (APIFactory.class){
if(factory==null){
factory = new APIFactory();
}
}
}
return factory;
}
//这里面写方法.
public void get1(String url, Map map, Observer observer){
//调用retrofit工具类的方法
RetrofitUtils.getInstance().get1(url, map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void get1(String url,Observer observer){
RetrofitUtils.getInstance().get1(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void post1(String url,Map map,Observer observer){
RetrofitUtils.getInstance().post1(url,map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void post1(String url,Observer observer){
RetrofitUtils.getInstance().post1(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}在model层里面调用APIFactory里面的4个方法get1,post1,
//具体的model层
public class LoginModelImpl {
//model层处理数据,请求网络
public void getData(final LoginModelCallBack loginModelCallBack) {
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
Map map = new HashMap<>();
map.put("key","71e58b5b2f930eaf1f937407acde08fe");
map.put("num","10");
/* Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.tianapi.com")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
IGetService service = retrofit.create(IGetService.class);
service.get(map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(Bean bean) throws Exception {
loginModelCallBack.success(bean);
}
});*/
//------------
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
//调用apifactory
//传参map集合
APIFactory.getInstance().get1("/nba", map, new AbstractObserver() {
@Override
public void onSuccess(Bean bean) {
// System.out.println("beanget传参 ="+bean.getNewslist().toString());
}
@Override
public void onFailure() {
// System.out.println("异常了");
}
});
//不传参,直接传路径
APIFactory.getInstance().get1("/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10", new AbstractObserver() {
@Override
public void onSuccess(Bean bean) {
// System.out.println("beanget不传参 ="+bean.getNewslist().toString());
}
@Override
public void onFailure() {
// System.out.println("异常了");
}
});
//不传参直接传路径post
APIFactory.getInstance().post1("/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10", new AbstractObserver() {
@Override
public void onSuccess(Bean bean) {
System.out.println("beanpost不带参数 ="+bean.getNewslist().toString());
loginModelCallBack.success(bean);
}
@Override
public void onFailure() {
System.out.println("异常了");
}
});
/* //传参 post路径,不好使
APIFactory.getInstance().post1("/nba", map, new AbstractObserver() {
@Override
public void onSuccess(Bean bean) {
System.out.println("beanpost带参数 ="+bean.getNewslist().toString());
}
@Override
public void onFailure() {
System.out.println("异常了");
}
});*/
}
}
java封装拦截请求_Retrofit,OkHttp拦截器,RxJava封装请求网络相关推荐
- OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3
OkHttp协议 okhttp是一个第三方类库,用于android中请求网络 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCan ...
- Okhttp 拦截器 请求添加公共参数、公共Headers 方法
retrofit 基于okhttp.使用retrofit /okhttp时候,这些都会wifi 直连的,不走系统的wifi设置,代理是抓不到包的.所以如果 想抓包那么抓网卡吧,打印请求或者添加公共参数 ...
- java参数action_Struts2之Action接收请求参数和拦截器详解
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API 需求:提供JSP的表单页面的数据,在Action中使用Servlet的A ...
- java 判断请求为 ajax请求_Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求...
Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断请求是不是ajax请求,Java判断是否为ajax请求 >>>>>> ...
- Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求
Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求 Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断 ...
- filter 拦截器 获取http请求参数
里面一些方法使用了hutool的工具类 可以替换成你自己习惯的 工具类不是记录的主要东西. 记录点 1.怎么创建拦截器 2.怎么统一管理拦截器是否启用和输用顺序 3.怎么获取传入的参数 4.怎么获取返 ...
- android方法拦截器,android OkHttp拦截器(Interceptor)的使用
一 概念 在OkHttp内部是使用拦截器来完成请求和响应,利用的是责任链设计模式,能够用来转换,重试,重写请求的机制.如今主流的网络框架非Retrofit莫属,它的内部请求也是基于OkHttp的. 在 ...
- Struts2之Action接收请求参数和拦截器
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据, ...
- 修改拦截器里的请求头_OkHttp4 源码分析(1) 请求流程分析
square/okhttpgithub.com 本文基于OkHttp4.7.1分析 同步请求示例代码 OkHttpClient client = new OkHttpClient.Builder() ...
最新文章
- bitcoin cash的地址格式 cash addr 简介
- Android之线程池深度剖析
- 左撇子的人怎么使用计算机,小漫画讲述冷知识,左撇子很苦恼,电脑自动弹窗发明者是谁?...
- javaWeb_JSP 动态指令 forward 的程序
- EBS默认的登录账户和密码
- 【Qt】水平和垂直布局
- 《网络空间欺骗:构筑欺骗防御的科学基石》一1.1 主动网络空间防御中网络空间抵赖与欺骗的视图...
- python元素定位input button_python+selenium 定位到元素,无法点击的解决方法
- 对安装好的hadoop集群做个测试
- Mysql 8 驱动问题:报错Unknown system variable 'query_cache_size'
- 在线HTML压缩工具
- 2018北大计算机复试线,北京大学历年考研复试分数线_2018考研分数线
- 最详细的 UART协议 分析在这里!
- 第二十二章 MySQL有哪些“饮鸩止渴”提高性能的方法?
- PDF文件格式转换工具 迅捷PDF转换成Word转换器
- elementUI表格中气泡位置偏移
- 华为内部访谈:凡是溜须拍马的员工,一律拿掉
- 一个成功的BI项目实施需要注意哪些? 1
- shell内建命令--Linux
- 初学graphiql 查询操作
热门文章
- Java应用程序中的内存泄漏和内存管理
- 使用序列化查找对象中的脏字段
- Servlet文件上传功能的实现(commons-fileupload)
- IntelliJ IDEA for Mac 如何将普通 Java 项目变为 Web 项目
- php如何在类的外部修改成员属性,php中如何在外部修改类的私有或受保护属性值...
- java stopself_然后,即使我停止了服务,Context.startForegroundService()也没有调用Service.startForeground()...
- 面向对象设计思想-C语言
- html中的文档格式及举例,跟我一起从零开始学习WebAssembly(三)、最简单的例子hello world(使用自定义HTML模板)...
- php伪静态后不能访问html,php伪静态后html不能访问怎么办
- c语言实验报告5数组,c语言实验报告五一维数组.doc