

网络请求–Retrofit2使用方法
source link: http://www.androidchina.net/4302.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 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;
@Inject
public
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
);
}
// 返回人物信息
@Override
public
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>> {
@Override
public
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.
转载请注明:Android开发中文站 » 网络请求–Retrofit2使用方法
Recommend
-
117
Offline Sample App Medium post covering this app: Building Offline-First App using MVVM, RxJava, Room and Priority Job Queue
-
107
RetrofitCache English RetrofitCache让retrofit2+okhttp3+rxjava 配置缓存如此简单。通过注解配置,可以针对每一个接口灵活配置缓存策略;同时...
-
153
README.md
-
138
Kotlin Coroutine Adapter (DEPRECATED) A Retrofit 2 CallAdapter.Factory for Kotlin coroutine's Deferred. This lib...
-
106
Retrofit: 对okhttp的封装,可以更方便的使用okhttp RxAndroid 响应式编程框架,rxjava的扩展,很爽的链式编程 魅力在于对数据的处理,与线程切换的灵活性. 用来处理异步操作(Lambda表达式不会用.用Lambda表达式代码会更少,但不会的人会看不懂...
-
83
-
59
前言 直接上数据结构: { "code": 200, "data": { "id": "1", "name": "name1", "stargazers_count": 1 }, "msg": "请求成功" } 上面的数据结构是一般比较简单而常见的数据结构,在正确的情...
-
64
title: RxJava2 + Retrofit2 完全指南 之 对返回Response的统一处理 tags: Android之路 grammar_cjkRuby: true 前言 本章在上篇
-
33
前言 今年是9102年了,应该没有还在用 userId 来鉴权了吧,也应该很少人使用 cookie 来保持会话了吧?而现在更常用的是 Authorization , 关于Authorization ...
-
5
上篇文章讲解了requests模块的基础使用,其中有get、put、post等多种请求方式,使用data、json等格式做为请求参数,在请求体中添加请求头部信息的常见信息,如:headers、cookies,以及对请求响应的处理方法。接下来讲解一下requests的高级用法。
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK