Retrofit2使用总结

了解Retrofit2:
1)其本质上就是对okHttp的封装,使用面向接口的方式进行网络请求。
2)使用注解和动态代理,极大的简化网络请求的步骤。
3)默认使用OKHttp处理网络请求,默认使用Gson解析(可以自定义)

Retrofit2常用的注解接口:
@Post:表示为post请求方式
@Get:表示为get请求方式
@FormUrlEncoded:以表单的形式提交请求参数
@FieldMap:指定所有集合表单控件的名称,login (@FieldMap Map map)  以map集合的形式提交表单数据
BaseUrl与@url的区别: BaseUrl最好以 / 结尾,而@url最好别以 / 开头

Retrofit2代码实现步骤
1)定义一个接口(主要作用是用注解的形式封装请求地址和请求参数),比如UserApi
2)实例化Retrofit 
3)通过Retrofit实例,获取一个接口服务对象: create(UserApi.class)
4)通过接口服务对象ApiService,调用接口中的方法,获取call对象
5)Call对象执行请求(异步请求、同步请求)

UaseApi: 接口的创建,主要用于封装一个模块中,多个请求接口,其中包含请求参数,请求方式,请求URL,请求方法名


添加依赖:

    //添加依赖jackson依赖
    compile 'com.squareup.retrofit2:converter-jackson:2.0.1'
    //添加retrofit2依赖
    compile 'com.squareup.retrofit2:retrofit:2.0.1'
    //添加日志信息拦截依赖
    compile 'com.squareup.okhttp3:logging-interceptor:3.7.0'
    //添加对rxJava的支持
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
    compile 'io.reactivex:rxandroid:1.1.0'
    //ButterKnife 7.0.1对应sdk24
    compile 'com.jakewharton:butterknife:8.5.1'
    apt 'com.jakewharton:butterknife-compiler:8.5.1'

案例:

Retrofit2的基本使用:

        //获取一个Retrofit2对象
        Retrofit Retrofit = new Retrofit.Builder()
                .baseUrl(UrlConstant.BASE_URL_TEST)
                .build();
        //通过Retrofit实例,创建服务接口对象
        ApiService apiService = Retrofit.create(ApiService.class);
        //通过接口服务对象,调用接口中的方法,获取call对象
        Call call = apiService.getNetData();
        //通过call对象执行网络请求(同步请求execute,异步请求enqueue)
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if (response.isSuccessful()) {
                    ResponseBody body = response.body();
                    //获取json字符串
                    try {
                        String result = body.string();
                        tv_content.setText(result);
                        Log.i(TAG, result);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                Log.i(TAG, "请求失败");
            }
        });

1、Retrofit2设置Json转换器

为Retrofit2添加json转换器;

当创建一个Retrofit实例的时候可以为其添加一个Json转换器,这样就会自动将Json格式的响应体转换为所需要的Java对象。

GsonFormat是AndroidStudio中的一个插件。

创建retrofit实例,我们通过addConverterFactory指定一个factory来对响应反序列化

        //进行一系列的序列化设置
        ObjectMapper mapper = new ObjectMapper();
        //创建Retrofit实例:addConverterFactory(JacksonConverterFactory.create(mapper))
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(UrlConstant.BASE_URL2)
                .addConverterFactory(JacksonConverterFactory.create(mapper))
                .build();
        ApiService apiService = retrofit.create(ApiService.class);
        Call call = apiService.addJsonConvertFactoryTest(map);
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if (response.isSuccessful()) {
                    LoginEntity bodyList = response.body();
                        Log.i(TAG, bodyList.getMsg());
                        Log.i(TAG, bodyList.getData().getCity()+ "");
                }
            }
            @Override
            public void onFailure(Call call, Throwable t) {

            }
        });

2、Retrofit2手动设置网络请求客户端

可以在OkHttpClient中进行一系列的网络请求设置

        OkHttpClient client = new OkHttpClient.Builder()
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(UrlConstant.BASE_URL_TEST)
                .addConverterFactory(JacksonConverterFactory.create())
                //手动设置OkHttpClient客户端
                .client(client)
                .build();

3、Retrofit2添加拦截器,获取日志信息

使用自定义的OkHttpClient

在retrofit2.0中是没有日志功能的;但是retrofit2.0中依赖OkHttp,所以也就能够通过OkHttp中的interceptor来实现获取底层的请求和响应日志;

        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor)
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(UrlConstant.BASE_URL_TEST)
                .addConverterFactory(JacksonConverterFactory.create())
                //手动设置OkHttpClient客户端
                .client(client)
                .build();

4、Retrofit2添加请求头

    //使用@Headers注解,添加请求头信息
    @Headers({
            "Content-Type: application/json",
    })
    @FormUrlEncoded
    @POST("login")
    Call addJsonConvertFactoryTest(@FieldMap Map map);

5、Retrofit2通过Https协议访问网络配置

本事上是OkHttp协议支持https协议。

6、Retrofit2设置缓存

在自定义的OkHttpClient中进行设置


ApiService接口中的代码:

package com.example.administrator.retrofit2;


import com.example.administrator.retrofit2.entity.ItemEntity;
import com.example.administrator.retrofit2.entity.LoginEntity;
import com.example.administrator.retrofit2.entity.Student;

import java.util.List;
import java.util.Map;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import rx.Observable;

/**
 * Created on 2017/5/9.
 * Author:crs
 * Description:ApiService 主要用于封装网络请求参数和url
 */
public interface ApiService {
    //请求方式;url参数;没有请求参数;返回值类型为Call
    @GET("basil2style")
    Call getNetData();

    //获取第一页数据,存在子url
    @GET("article/page=1")
    Call getPageData();

    @GET("article/list/{type}?")
    Call getListData(@Path("type")String type, @Query("page")int page);

    //为Retrofit添加json转化器
    @GET("basil2style")
    Call> addJsonConvertFactory();

    //为Retrofit添加json转化器

    //使用@Headers注解,添加请求头信息
    @Headers({
            "Content-Type: application/json",
    })
    @FormUrlEncoded
    @POST("login")
    Call addJsonConvertFactoryTest(@FieldMap Map map);

    @GET("search/repositories")
    Call queryRetrofitByGetCallMap(@QueryMap Map map);

    @GET("search/repositories")
    Call queryRetrofitByGetCall(@Query("q")String owner, @Query("since")String time,
                                              @Query("page")int page, @Query("per_page")int per_Page);
    
    @GET("repos/{owner}/{repo}/contributors")
    Observable> contributorsByRxJava(@Path("owner") String owner, @Path("repo") String repo);
}

借鉴此博客: http://blog.csdn.net/ljd2038/article/details/51046512

你可能感兴趣的:(Retrofit2使用总结)