网络请求--Retrofit2使用方法
Retrofit是Square开发的网络请求库, 简化了网络请求的使用, 这个库太知名了, 好处我就不多说了. 让我们看看如何使用吧?
注意: Retrofit2的beta3版本, 使用Okhttp3, Interceptor使用方式发生改变.
主要
(1) Retrofit2(beta3)的请求方式.
(2) Okhttp3的Interceptor.
(3) Okhttp3的Deserializer.
(4) Retrofit2使用Gson转换器(Converter)和RxJava适配器(Adapter).
Github下载地址
1. 基本请求
使用接口, 区分Get和Post方法.
/*** 网络请求* <p>* Created by wangchenlong on 16/1/21.*/
public interface MarvelService {String END_POINT = "http://gateway.marvel.com/";String PARAM_API_KEY = "apikey";String PARAM_HASH = "hash";String PARAM_TIMESTAMP = "ts";@GET("/v1/public/characters")Observable<List<AvengersCharacter>> getCharacters(@Query("offset") int offset);
}
使用Retrofit类创建接口服务, 指定Gson为转换器, RxJava为适配器.
public class RestDataSource implements Repository {private final MarvelService mMarvelService;@Injectpublic RestDataSource() {// Log信息HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);// 公私密匙MarvelSigningInterceptor signingInterceptor = new MarvelSigningInterceptor(BuildConfig.MARVEL_PUBLIC_KEY, BuildConfig.MARVEL_PRIVATE_KEY);// OkHttp3.0的使用方式OkHttpClient client = new OkHttpClient.Builder().addInterceptor(signingInterceptor).addInterceptor(loggingInterceptor).build();// 选择人物信息Gson customGsonInstance = new GsonBuilder().registerTypeAdapter(new TypeToken<List<AvengersCharacter>>() {}.getType(),new MarvelResultsDeserializer<AvengersCharacter>()).create();// 适配器Retrofit marvelApiAdapter = new Retrofit.Builder().baseUrl(MarvelService.END_POINT).addConverterFactory(GsonConverterFactory.create(customGsonInstance)).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).client(client).build();// 服务mMarvelService = marvelApiAdapter.create(MarvelService.class);}// 返回人物信息@Overridepublic Observable<List<AvengersCharacter>> getCharacters(int currentOffset) {return mMarvelService.getCharacters(currentOffset);}
}
2. Interceptor
Interceptor是拦截器, 在发送之前, 添加一些参数, 或者获取一些信息.
如MarvelSigningInterceptor是添加参数, loggingInterceptor是打印参数.
/*** 添加Key和密码* <p>* Created by wangchenlong on 16/1/21.*/
public class MarvelSigningInterceptor implements Interceptor {private final String mApiKey;private final String mApiSecret;public MarvelSigningInterceptor(String apiKey, String apiSecret) {mApiKey = apiKey;mApiSecret = apiSecret;}@Override public Response intercept(Interceptor.Chain chain) throws IOException {String marvelHash = MarvelApiUtils.generateMarvelHash(mApiKey, mApiSecret);Request oldRequest = chain.request();// 添加新的参数HttpUrl.Builder authorizedUrlBuilder = oldRequest.url().newBuilder().scheme(oldRequest.url().scheme()).host(oldRequest.url().host()).addQueryParameter(MarvelService.PARAM_API_KEY, mApiKey).addQueryParameter(MarvelService.PARAM_TIMESTAMP, MarvelApiUtils.getUnixTimeStamp()).addQueryParameter(MarvelService.PARAM_HASH, marvelHash);// 新的请求Request newRequest = oldRequest.newBuilder().method(oldRequest.method(), oldRequest.body()).url(authorizedUrlBuilder.build()).build();return chain.proceed(newRequest);}
}
addQueryParameter添加网络参数.
Okhttp3使用了装饰者模式, 使用Builder添加Interceptor.
// OkHttp3.0的使用方式OkHttpClient client = new OkHttpClient.Builder().addInterceptor(signingInterceptor).addInterceptor(loggingInterceptor).build();
3. Deserializer
Deserializer是反序列化, Gson使用, 去除不使用的参数.
public class MarvelResultsDeserializer<T> implements JsonDeserializer<List<T>> {@Overridepublic List<T> deserialize(JsonElement je, Type typeOfT,JsonDeserializationContext context) throws JsonParseException {// 转换Json的数据, 获取内部有用的信息JsonElement results = je.getAsJsonObject().get("data").getAsJsonObject().get("results");return new Gson().fromJson(results, typeOfT);}
}
Gson使用Deserializer, 过滤不用的参数.
// 选择人物信息Gson customGsonInstance = new GsonBuilder().registerTypeAdapter(new TypeToken<List<AvengersCharacter>>() {}.getType(),new MarvelResultsDeserializer<AvengersCharacter>()).create();
4. 获取数据
Rx选择执行线程和返回线程.
private void loadData() {mCharactersSubscription = mRepository.getCharacters(0).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(avengersCharacters -> {mMainView.setListData(avengersCharacters);});}
Rxjava+Dagger+Retrofit, 三个编程库, 都已经写完了, 基本都是在一起使用. 文章里面都含有独立Demo, 大家可以配合使用, 感谢Square给我们带来, 的优雅代码.
OK, that’s all! Enjoy it.
网络请求--Retrofit2使用方法相关推荐
- android网络请求库volley方法详解
使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列 ...
- 简单快速处理网络请求超时的方法
最近在调试联网操作的时候碰到网络请求超时的问题,以下是简单快速处理网络超时的方法: 使用android提供的工具类AsyncTask类,此类提供了一个AsyncTask.execute().get(t ...
- fundebug php,用Fundebug插件记录网络请求异常的方法
在服务端,不管我们使用Node.js.Java.PHP还是Python等等,都会用日志以文本的形式记录请求以及报错信息.这个对于后端做事后分析是很有用的. 另一方面,前端有时候出问题其实是因为后端接口 ...
- Android9.0 http网络请求失败解决方法
前言:最近在做一个OCR,调用的是百度OCR的接口,文字识别出来之后想加一个翻译的功能,还是使用的百度翻译.(不管外界如何唱衰百度,个人感觉百度这方面做的还是可以的).由于之前请求网络用的okhttp ...
- java 轮询请求接口_Android RxJava 实际应用讲解:(无条件)网络请求轮询
前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. Github截图 RxJava如此受欢迎的原因,在于其提供了丰富 & ...
- Android RxJava应用:优雅实现网络请求轮询(无条件)
前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:轮询需求 ...
- Android RxJava操作符的学习---功能性操作符--(有条件)网络请求轮询(结合Retrofit)
1. 需求场景 2. 功能说明 采用Get方法对 金山词霸API 按规定时间重复发送网络请求,从而模拟 轮询 需求实现 停止轮询的条件 = 当轮询到第4次时 采用 Gson 进行数据解析 3. 具体实 ...
- Android RxJava操作符的学习---功能性操作符--网络请求出错重连(结合Retrofit)
1. 需求场景 2. 功能说明 功能需求说明 功能逻辑 实例说明 在本例子中:采用Get方法对 金山词霸API 发送网络请求 通过 断开网络连接 模拟 网络异常错误(恢复网络即可成功发送请求) 限制 ...
- Android RxJava操作符的学习---变换操作符---网络请求嵌套回调
变换操作符的主要开发需求场景 = 嵌套回调(Callback hell) 下面,我将采用一个实际应用场景实例来讲解嵌套回调(Callback hell) 1. 需求场景 1.1 背景 需要进行嵌套网络 ...
最新文章
- netstat 命令(Linux)
- python2.7和3.5相互兼容吗_以与Python 2.7和Python 3.5兼容的方式使用abc.ABCMeta
- 在Ubuntu下进行安卓开发遇到“insufficient permissions for device: user in plugdev group; ”问题的解决办法
- 网管日志-06.07.21
- Nginx反向代理负载均衡时,验证码不正确
- Android service 小研究
- 我们的高中教育造就了什么?
- oracle数据库小总结(2017年7月10日)
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 运行java比较好的浏览器_国内好的pc浏览器评测
- 类似Jira的十大项目管理软件
- 百宝云Post与Get事件教程
- CC00054.bigdatajava——|Java分支结构.V04|——|Java.v04|ifelse.v02|判断负数和非负数|
- 虚拟主机共享IP地址
- 8255A的工作方式
- Microsoft Excel 教程「41」,如何在 Excel 图表中添加标题?
- loadrunner Web_类函数之web_set_user()
- 获取全国地铁线站口数据(Python+百度API)
- linker与loader,x86与单片机
- Linux 安装Git Server
热门文章
- python解析xml文件选用模块_python-minidom模块【解析xml】
- php数组转字符串 join,jQuery中将数组转换成字符串join()和push()使用
- oracle10.2 迁移,实战:Oracle10.2.0.4异机迁移并升级到Oracle 11.2.0.4
- python获取用户输入中文_python中的用户输入
- 经典角点检测算法实现
- 在此处打开命令窗口_这样操作方便多了!简单DOS命令实用技巧详解
- Java处理excel根据某列的值查询,并将结果显示在其他列中
- HTTP请求中的缓存(cache)机制
- 重学JavaScript深入理解系列(一)
- 裸辞后,从Android转战Web前端的学习以及求职之路