关于Retrofit 2.0的使用

前言

前不久 Retrofit 2.0 正式发布,一直很想试试看这款很火的网络库,所以最近有点时间稍微研究了下 Retrofit 2.0 的使用。苦于网上虽然有很多相关教程,但是很少有代码示例和使用说明,所以,我写点自己对于 Retrofit 使用上的理解,并附上自己的 demo 源码。

配置

在工程里添加网络访问权限是必须的,所以在AndroidManifest.xml中添加如下代码

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

在 app/build.gradle 引入下列库

1
2
3
4
5
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
compile 'com.squareup.okhttp3:okhttp:3.0.0'
compile 'com.google.code.gson:gson:2.5'

coverter-gson 可以方便的把返回结果转成对象模型,而 converter-scalars 则可以把返回结果转成String。
如果需要将返回数据转成其他类型,也可以引入其他一些包

1
2
3
4
5
compile 'com.squareup.retrofit2:converter-jackson'
compile 'com.squareup.retrofit2:converter-moshi'
compile 'com.squareup.retrofit2:converter-protobuf'
compile 'com.squareup.retrofit2:converter-wire'
compile 'com.squareup.retrofit2:converter-simplexml'

使用

定义一个接口,用于 http 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public interface GitHubService {
@GET("users")
Call<String> listRepos();
/**
* 参数比较少的情况下,可以直接传出参数名和参数值
* @param page 参数值
* @return 返回请求
*/
@GET("repositories/892275/contributors")
Call<String> repos(@Query("page")int page);
/**
* 参数比较多时,可以以map的形式传入参数名和值
* @param options 参数Map
* @return 返回请求
*/
@GET("user/repos")
Call<String> getRequestWithMap(@QueryMap Map<String, String> options);
@FormUrlEncoded
@POST("/some/endpoint")
Call<String> getPostWithMap(@FieldMap Map<String, String> names);
/**
* 其他的一些使用方式可以参考官方使用说明
* http://square.github.io/retrofit/
*/

创建 Retrofit 实例

1
2
3
4
5
6
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
//解析结果为需要的类型
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();

发起请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GithubService service = getInstance().create(GitHubService.class);
Call<String> repos = service.listRepos();
repos.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, retrofit2.Response<String> response) {
String str = response.body();
text.setText(str);
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.i("info",t.getMessage());
}
});

注意事项

  1. baseUrl 以 “/” 结尾,多为域名,而 @URL 则不以 “/”
  2. 文中仅列举了两个 GET 请求的方式,其他请求方式参照官网介绍 Retrofit 官方介绍
  3. 初次接触 Retrofit,不足之处还望见谅,后续对 Retrofit有新的见解将更新此文
  4. demo 地址:RetrofitDemo