Retrofit使用小结

Posted by wjch on 2017-01-22 本文总阅读量

Retrofit使用小结

一.简介与安装

在gradle的依赖里加入以下语句:

1
2
3
4
5
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava'
compile 'com.squareup.retrofit2:converter-gson'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
testCompile 'com.squareup.okhttp3:mockwebserver:3.5.0'

不要忘记加上网络权限:

1
<uses-permission android:name="android.permission.INTERNET" />

请注意使用ProGuard的话,要加入下面的语句:

1
-dontwarn okhttp3.**

如果要混淆应用的话,请务必加上下面的语句,避免Rxjava被混淆:

1
compile 'com.artemzin.rxjava:proguard-rules:1.2.4.0'

二.Retrofit的基本用法

1
2
3
4
5
6
Retrofit retrofit = new Retrofit.Builder().baseUrl(App.BASEURL)
.addConverterFactory(new ToStringConverterFactory())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();

这个是我在项目里的写法,Retrofit使用Builder模式,需要传递一个地址BASEURL,还需要对应的数据转换器,代码里面依次是String、gson还有RxjavaCalld的转换;它会优先将数据转换成String类型的数据,
如果是RxjavaCall,则会转化成Rxjava的Observable<>对象。
之后是要添加底层的网络请求库,如果不配置,则会使用默认的

1
2
3
4
5
6
7
8
9
10
11
12
13
Interceptor interceptor = new Interceptor() {
@Override
public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
Request newRequest = chain.request().newBuilder()
.addHeader("t", timecurrentTimeMillis)
.addHeader("userId", SharedUtil.getString(context, "id"))
.build();
return chain.proceed(newRequest);
}
};
OkHttpClient client = new OkHttpClient();
client.interceptors().add(interceptor);

先定义一个过滤器(Interceptor),在头部增加了事件和用户的ID信息,然后为OkhttpClient装配上这个过滤器,来实现请求的一些个性化的需求;我们这里接着使用OkhttpClient作为网络处理的client。

这样,我们便得到了一个retrofit对象。接下来,只要定义好请求的接口和返回数据的实体类,我们就可以为所欲为了。

三.Retrofit的一些设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface UserApi {
@GET("/users/{user}/repos")
Call<List<User>> reposForUser(@Path("user") String user);
//同步
@POST("sync")
Call<ResponseBody> syncOrder(@Body String data, @Query("sign") String sign);
//登录
@FormUrlEncoded
@POST("login")
Call<LoginResult> loginIn(@Field("name") String name, @Field("pass") String pass);
//查询
@POST("query")
Observable<Response<ResponseBody>> rxquery(@Body String data, @Query("sign") String sign);
}

上面的代码里,第一个是通过Get方式请求数据,其中@Path注解对应的user字符串会自动替换{user}的值

第二个是使用POST方法提交data和sign字符串。

第三个是模拟表单提交,所以提交的值前面都是@Field。
这三个查询都放返回的是Call对象,获取到Call对象就可以使用Call对象进行请求并对返回的数据进行操作。

Retrofit是支持Rxjava的,我们让第四个方法返回一个Observable对象,来对返回的数据进行操作;

接下来使用返回的Call对象进行请求,我们使用了call.enqueue(Callback)进行异步请求,如果想同步请求的话,可以使用execute()方法(当然不推荐这个啦)。

1
2
3
4
5
6
7
8
9
10
11
12
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
Logger.e(TAG, response.body());
}
@Override
public void onFailure(Throwable t) {
Logger.e(TAG, t.getMessage());
}
});

可以看到回调有两种情况:onResponse 和onFailure,onResponse会通过转换器自动将服务器返回的数据转换成response对象,通过ResponseBody responseBody=response.body()可以得到我们所需要的对象。这里我们因为需要的是加密后的字符串,所以需要使用Sting weneed=new String((response.body()).bytes());来获取到需要的字符串.

附录

  • ToStringConverterFactory类的地址: