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使用方法相关推荐

  1. android网络请求库volley方法详解

    使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列     ...

  2. 简单快速处理网络请求超时的方法

    最近在调试联网操作的时候碰到网络请求超时的问题,以下是简单快速处理网络超时的方法: 使用android提供的工具类AsyncTask类,此类提供了一个AsyncTask.execute().get(t ...

  3. fundebug php,用Fundebug插件记录网络请求异常的方法

    在服务端,不管我们使用Node.js.Java.PHP还是Python等等,都会用日志以文本的形式记录请求以及报错信息.这个对于后端做事后分析是很有用的. 另一方面,前端有时候出问题其实是因为后端接口 ...

  4. Android9.0 http网络请求失败解决方法

    前言:最近在做一个OCR,调用的是百度OCR的接口,文字识别出来之后想加一个翻译的功能,还是使用的百度翻译.(不管外界如何唱衰百度,个人感觉百度这方面做的还是可以的).由于之前请求网络用的okhttp ...

  5. java 轮询请求接口_Android RxJava 实际应用讲解:(无条件)网络请求轮询

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. Github截图 RxJava如此受欢迎的原因,在于其提供了丰富 & ...

  6. Android RxJava应用:优雅实现网络请求轮询(无条件)

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:轮询需求 ...

  7. Android RxJava操作符的学习---功能性操作符--(有条件)网络请求轮询(结合Retrofit)

    1. 需求场景 2. 功能说明 采用Get方法对 金山词霸API 按规定时间重复发送网络请求,从而模拟 轮询 需求实现 停止轮询的条件 = 当轮询到第4次时 采用 Gson 进行数据解析 3. 具体实 ...

  8. Android RxJava操作符的学习---功能性操作符--网络请求出错重连(结合Retrofit)

    1. 需求场景 2. 功能说明 功能需求说明 功能逻辑  实例说明 在本例子中:采用Get方法对 金山词霸API 发送网络请求 通过 断开网络连接 模拟 网络异常错误(恢复网络即可成功发送请求) 限制 ...

  9. Android RxJava操作符的学习---变换操作符---网络请求嵌套回调

    变换操作符的主要开发需求场景 = 嵌套回调(Callback hell) 下面,我将采用一个实际应用场景实例来讲解嵌套回调(Callback hell) 1. 需求场景 1.1 背景 需要进行嵌套网络 ...

最新文章

  1. netstat 命令(Linux)
  2. python2.7和3.5相互兼容吗_以与Python 2.7和Python 3.5兼容的方式使用abc.ABCMeta
  3. 在Ubuntu下进行安卓开发遇到“insufficient permissions for device: user in plugdev group; ”问题的解决办法
  4. 网管日志-06.07.21
  5. Nginx反向代理负载均衡时,验证码不正确
  6. Android service 小研究
  7. 我们的高中教育造就了什么?
  8. oracle数据库小总结(2017年7月10日)
  9. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  10. 运行java比较好的浏览器_国内好的pc浏览器评测
  11. 类似Jira的十大项目管理软件
  12. 百宝云Post与Get事件教程
  13. CC00054.bigdatajava——|Java分支结构.V04|——|Java.v04|ifelse.v02|判断负数和非负数|
  14. 虚拟主机共享IP地址
  15. 8255A的工作方式
  16. Microsoft Excel 教程「41」,如何在 Excel 图表中添加标题?
  17. loadrunner Web_类函数之web_set_user()
  18. 获取全国地铁线站口数据(Python+百度API)
  19. linker与loader,x86与单片机
  20. Linux 安装Git Server

热门文章

  1. python解析xml文件选用模块_python-minidom模块【解析xml】
  2. php数组转字符串 join,jQuery中将数组转换成字符串join()和push()使用
  3. oracle10.2 迁移,实战:Oracle10.2.0.4异机迁移并升级到Oracle 11.2.0.4
  4. python获取用户输入中文_python中的用户输入
  5. 经典角点检测算法实现
  6. 在此处打开命令窗口_这样操作方便多了!简单DOS命令实用技巧详解
  7. Java处理excel根据某列的值查询,并将结果显示在其他列中
  8. HTTP请求中的缓存(cache)机制
  9. 重学JavaScript深入理解系列(一)
  10. 裸辞后,从Android转战Web前端的学习以及求职之路