Retrofit 2的使用

导入

dependencies {
    ...
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
}

Retrofit 要求 Java 7 或者 Android 2.3 以上

基本使用

  1. 首先定义一个接口,Retrofit返回http api调用结果到此接口
interface BlueService {
        @GET("book/search")
        Call getSearchBooks(@Query("q") String name,
                                                @Query("tag") String tag,
                                                @Query("start") int start,
                                                @Query("count") int count);
    }

BookSearchResponse是网络请求结果所对应的实体类

方法上面的注解GET表示get请求,此类注解还有 POST,PUT,DELETE,HEAD
下方的@Query表示参数,会以键值对的形式添加到url中,当然在@GET()中也可以直接指定参数

interface BookService {
        @GET("{id}/search")
        Call getSearchBooks(@Path("id") String id,
                                                @Query("q") String name,
                                                @Query("tag") String tag,
                                                @Query("start") int start,
                                                @Query("count") int count);
    }

此处的@Path指定的值对应于@GET中的填充位
更复杂的map参数,用@QueryMap指定

  • POST请求
@POST("users/new")
Call createUser(@Body User user);
--
@FormUrlEncoded
@POST("user/edit")
Call updateUser(@Field("first_name") String first, @Field("last_name") String last);
--
@Multipart
@PUT("user/photo")
Call updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
  • @HAED
    通过此注解可以指定请求头信息
@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call getUser(@Path("username") String username);
  1. retrofit生成一个上述接口的实现
Retrofit retrofit = new Retrofit.Builder()
      .baseUrl("https://api.douban.com/v2/")
      .addConverterFactory(GsonConverterFactory.create())
      .build();
   BlueService blueService = retrofit.create(BlueService.class);

此处必须指定ConverterFactory,这是因为retrofit 2并没有默认的转换器来转换结果,而GsonConverterFactory则需要引入另外一个包

compile 'com.squareup.retrofit2:converter-gson:2.1.0'
  1. 得到接口实现类后,调用其方法,则可以得到一个Call对象,此对象能够完成同步或者异步的请求
        // 同步
        BookSearchResponse response = call.execute().body();

        // 异步
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                retrofitDataTxt.append("\n-->onResponse()");
                retrofitDataTxt.append("\n" + response.body().toString());
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                retrofitDataTxt.append("\n-->onFailure()");
            }
        });

日志输出

由于retrofit是对okhttp的封装,本质还是对okhttp的操作,此处引入第三方日志拦截器,当然也可以自己定义okhttp请求的日志拦截器

compile 'com.squareup.okhttp3:logging-interceptor:3.6.0'
HttpLoggingInterceptor httpLoggingInterceptor
                = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient
                .Builder()
                .addInterceptor(httpLoggingInterceptor);
 Retrofit retrofit = new Retrofit.Builder()
                .client(builder.build())
                .baseUrl("https://api.douban.com/v2/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

retrofit 与 rxjava

首先导入一个支持rxjava的库

// compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' 
// 上面的并不支持rxjava2(参见 [stackoverflow](http://stackoverflow.com/questions/41140203/using-rxjava-2-and-retrofit-2-adapter-version-issue)  [retrofit2-rxjava2-adapte](https://github.com/JakeWharton/retrofit2-rxjava2-adapter))
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'

步骤和使用retrofit时一样,接口中方法的返回值改成Observable,然后retrofit添加一个addCallAdapterFactory(),将返回值转为Observable类型
再根据rxjava中的步骤进行操作,注意耗时操作放在IO线程

public interface MovieService {

    @GET("movie/subject/{movieId}")
    Observable getMovieData(@Path("movieId") String movieId);
}
...
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.douban.com/v2/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(client).build();

        MovieService movieService = retrofit.create(MovieService.class);
        Observable movieData = movieService.getMovieData("1764796");

        movieData.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(movieData1 -> textView.append("\n" + movieData1.toString()));

参考资料

  • https://github.com/square/retrofit

你可能感兴趣的:(Retrofit 2的使用)