retrofit2.0 网络请求

当初使用retrofit的使用还是1.0的版本,当初还仅仅停留在使用的阶段。记得当初面试官问的时候,却说不出一二。原因还是那个—>我并没有看源码,并不知道是怎么一回事。现在发展到2.0,赶紧捉紧自己的脚本。

非主流解析(一):xml

配置:How to use Retrofit and SimpleXML together in downloading and parsing an XML file from a site?

官方文档:simple-xml,通过注解在对应的类来统一这个解析器,使用起来就像解析json的感觉。

例子:Android and Xml Serialization with Simple

非主流解析(二):get请求中请求参数为array即:数组

原以为是后台设计的不合理,才有这么的请求,又不是json格式,而是直接键值对,还要是数组,我真的不会啊。

但发现iOS居然可以,只能乖乖我的问题了。于是只能google了,关键词:retrofit2 get request array。结果还真的有,直接在retrofit的issues中就提到了:Is it possible to use query string arrays - e.g. a[]=2&a[]=3&a[]=4 #472

按着提示虽然没有了@EncodeQuery,但还是可以尝试用@Query进行代替。我的代码为:

1
2
3
4
5
6
7
8
9
10



@GET(ApiConstants.URL_GET_GOODS)

Observable<HttpResponse<ProductListDTO>> getGoodsList(@Query("cate[]") List<Integer> cates

,@Query("brand[]")List<Integer> brands,@Query("price_zone[]")List<Integer> price_zone,@Query("price") String price

,@Query("order")String order,@Query("search")String search);

不过我发现:我之前就是用List<Integer>了,只是我的Query不对而已。现在知道array对应的参数为@Query(“array[]”),要加两个中括号。

案例

【译】Retrofit 2 - 如何从服务器下载文件

源码解析

Retrofit2 动态代理下的分析
Retrofit2 源码解析
Retrofit分析-经典设计模式案例
Retrofit分析-漂亮的解耦套路

个人总结几点:(retrofit是对okhttp的封装)

  • 解耦
  • 自定义解析流的数据方式(json,xml等)

实战

添加日志过滤器

即:自动打印出请求前的http数据和返回时候http的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private static OkHttpClient okHttpClient;
private static OkHttpClient.Builder httpClientBuilder;

static {
httpClientBuilder = new OkHttpClient().newBuilder();
HttpLoggingInterceptor httpLogging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) { Log.d("Network",message);
}
});
httpLogging.setLevel(HttpLoggingInterceptor.Level.BODY);//此句很重要,不设置将无法输出,可以根据是否为debug状态而进行打印日志。默认值为Level.NONE

httpClientBuilder.interceptors().add(httpLogging);
okHttpClient = httpClientBuilder.build();
}

关于版本上的兼容

讲解版本1到2的升级变化。