Retrofit的使用

简介

Retrofit是Android中的一种网络请求框架,底层是基于OkHttp实现。(本文全部基于2.0+的版本)

接口全部来自豆瓣api
  • 添加依赖

    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
  • 创建一个Retrofit实例

public static final String BASE_URL ="https://api.douban.com/v2/";
 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

配置了接口的baseUrl和converter;
这里的baseUrl就是网络请求URL相对固定的地址,一般包括请求协议(如Http)、域名或IP地址、端口号等;
converter转换器,addConverterFactory方法是用什么来解析返回的数据,这里的GsonConverterFactory表示用Gson库来解析返回的json数据。

  • 创建业务请求接口

public interface MoviceService {
    @GET("movie/top250")
    Call  getTop250(@Query("start") int start,@Query("count")  int count);
}

@GET注解表示get的请求方式,@Query就表示参数,会以Key-Value的方式拼接到url后面。

  • 获取接口实例对象

MoviceService moviceService = retrofit.create(MoviceService.class);
  • 调用方法,获取一个Call的实例

Call call= moviceService.getTop250(0, 20);

Call在Retrofit就是进行网络请求和处理返回结果的一个类。

  • 使用Call的实例完成请求

请求分为两种同步和异步请求
  • 同步请求
MovieBean movieBean= call.execute().body();

这里注意的网络请求耗时操作要放到子线程执行,不然会抛出异常。

  • 异步请求
call.enqueue(new Callback() {
          @Override
          public void onResponse(Call call, Response response) {
          //成功 do something
           MovieBean   movieBean = response.body();
          }
          @Override
          public void onFailure(Call call, Throwable t) {
           //失败
          }
      });

到这里就用Retrofit的完成了一次完整的请求,下面让我们来说说get和post请求的参数的标签用法

  • 1.GET
  1. @Query

    从上面在完成Retrofit完整的请求就用的使这个标签,这里就不再解释了。

  2. @QueryMap

当@Query参数比较多的时候,我们就可以用@QueryMap统一用集合的方式进行传递

######创建接口实例
@GET("book/search")
 Call  getSearchBook(@QueryMap Map map);

调用的使用把参数统一在map集合中便可
Map  options = new HashMap<>();
     options.put("q","小王子");
     options.put("tag","");
     options.put("start","0");
     options.put("count","3");
Call call = moviceService.getSearchBook(options);

  1. @Query集合

参数是通过Key-Value的形式进行拼接的,当我们参数名一样,可是值不相同的时候,就可以选用这种。

######创建接口实例
@GET("book/search")
 Call getSearchBooks(@Query("q")  List list);

调用的使用把参数值统一在list集合中便可
List list = new ArrayList<>();
     //这里是随便写的,只是为了表达。
     list.add("小王子");
     list.add("哈哈哈");
Call call = moviceService.getSearchBooks(list);

  1. @Query非必填

如果请求参数为非必填,有时候即使不传该参数,服务端也可以解析
######创建接口实例

@GET("movie/top250")
 Call  getTop250s(@Query("start") int start,@Query("count")  String count);
######调用的时候传入null即可
 ```
moviceService.getTop250s(0,null);
```
  1. @Path

如果请求的是URL的相对地值即https://api.douban.com/v2/book/1125744

@GET("book/{id}")
 Call getSearhBook(@Path("id") String id);

######调用的时候传入id值即可
 ```

moviceService.getSearhBook("1125744");
```
到这里get请求的参数标签就完了。

  • 2.POST

整理中,马上更新post请求的参数标签用法,和用Retrofit别的一些用法,知识点(上传,下载,拦截器等等)。
ps 如有错误请指点,共勉,谢谢。

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