Retrofit 2简单入门

Retrofit是一个Android/Java的type-safe HTTP客户端,它能够大大简化写网络请求的复杂程度。而之前发布的2.0版本改动非常大。1.x版本默认使用URLConnection作为底层Http Client,而2.0版本开始只能使用OkHttpClient作为底层Http Client。而数据格式的Converter配置也发生了变化。这篇文章做一个简单的入门小结。

首先在Android Studio中引入Retrofit 2以及相关的依赖库:

1
2
3
4
5
    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
 
    compile 'com.squareup.retrofit2:retrofit:2.0.0'
    compile 'com.squareup.retrofit2:converter-moshi:2.0.0'

这里是用Moshi converter库作为Converter例子。

首先创建一个最简单的HTTP客户端:

1
    Retrofit retrofit = new Retrofit.Builder().baseUrl("http://www.example.com/").build();

1.x中使用endPoint(String)方法指定endPoint,在2.0中改成了baseUrl(String)方法。

创建一个使用Moshi converter的HTTP客户端:

1
2
3
4
    Retrofit retrofit = new Retrofit.Builder()
                                .baseUrl("http://www.example.com/")
                                .addConverterFactory(MoshiConverterFactory.create())
                                .build();

使用这个客户端收到的返回消息的body都会使用Moshi Json库去做反序列化过程。

当我们所有的请求头部都有指定字段时,我们可以先创建一个定制的OkHttpClient对象,再把这个对象设置为Retrofit的底层Http client就可以了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    OKHttpClient client = new OkHttpClient.Builder();
    client.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request().newBuilder()
                    .addHeader("Context-Type", "application/json").build();
            return chain.proceed(request);
        }
    });
 
    Retrofit retrofit = new Retrofit.Builder()
                                .client(client)
                                .baseUrl("http://www.example.com/")
                                .build();

下面我们创建一个Api接口:

1
2
3
4
5
    interface Api {
        @GET("api/example/{uuid}")
        Call<void> getInfo(@Path("uuid") String uuid);
    }
</void>

发起请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    Retrofit retrofit = new Retrofit.Builder().baseUrl("http://www.example.com/").build();
    Api api = retrofit.create(Api.class);
    Call<void> getInfo = api.getInfo("uuid");
    getInfo.enqueue(new Callback</void><void>() {
        @Override
        public void onResponse(Call</void><void> call, Response</void><void> response) {
            if (response.isSuccessful() {
                // server says success
            } else {
                // server says failure
            }
        };
 
        @Override
        public void onFailure(Call</void><void> call, Throwable t) {
            // request failed. network error or something else.
        }
    });
</void>

我们通过enqueue(Callback)方法发起请求并且获得结果。Callback接口中的onResponse方法代表服务器成功收到了请求并且返回了结果,我们需要通过Response.isSuccessful()方法得知返回的结果是否正确(也就是说是否按照Converter成功反序列化了),如果其返回为false,则可能是反序列化失败活着服务器返回了400等其它错误。而Callback.onFailure方法代表请求发送失败,也就是说请求没有发送到服务器,一般是Api接口写的有问题,这个需要检查接口的定义了。

Retrofit使用起来非常方便。当然它还支持非常好的自定义功能,这个需要进一步探索。

Leave a Reply