安卓网络请求框架第四弹——Retrofit2.0入门篇

来源:互联网 发布:unity3d settexture 编辑:程序博客网 时间:2024/06/07 16:53

概述:网络请求框架第四弹,其实并不是Retrofit2.0的封装,只是简单的介绍和使用,至于封装,会在介绍完RxJava后,将Retrofit2.0和RxJava配合使用进行封装。

一 Retrofit的简单介绍。

Retrofit是Square公司开源的一款网络请求框架,官网地址http://square.github.io/retrofit/ 目前 已经已更新至 2.0 版本,本篇文章只对2.0版本进行简单的介绍和使用。以前的版本请自行Google。Retrofit是rest形式的安卓客户端请求库(Rest的原理就是向一个资源的uri发送get、post、put和delete进行获取、创建、保存、删除操作)。Square公司开源的其他框架有:日历控件框架 android-times-square,依赖注入框架 dagger,一部图片加载框架 Picasso,网络请求okHttp 等。

二 Retrofit2.0的简单使用

1 添加依赖

a:Retrofit2.0的依赖

 compile 'com.squareup.retrofit2:retrofit:2.0.1'

b:gson转换器的依赖

compile 'com.squareup.retrofit2:converter-gson:2.0.1'

2 关于Retrofit2.0中url的定义方式

a:这里写图片描述
b:这里写图片描述
c:这里写图片描述
从上面的三种方式可以看出 在retrofit中url是以baseUrl与@url的方式组合在一起的 不难看出 只有第二种才最符合我们的使用习惯。总结一下 在定义url时 baseUrl需要以“/”结尾 @url不以“/”开头。
按照这种格式来定义我们的第一个Api
baseUrl为:https://api.github.com/

   @GET("repos/{owner}/{repo}/contributors")   Call<ResponseBody> contributorsBySimpleGetCal(@Path("owner") String owner, @Path("repo") String repo);

则我们拼接的整体url为:https://api.github.com/repos/square/retrofit/contributors

3发出一次请求

a: 构建retrofit对象

Retrofit retrofit = new Retrofit.Builder()                .baseUrl("https://api.github.com/")                .build();

b:构建接口对象

 ApiService service = retrofit.create(ApiService.class);

c:接口对象调方法传入参数 返回 请求对象。

Call<ResponseBody> call=service.contributorsBySimpleGetCal("square","retrofit");

d:用c中返回的call对象 执行请求(例子中是异步请求)

call.enqueue(new Callback<ResponseBody>() {            @Override            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {            }            @Override            public void onFailure(Call<ResponseBody> call, Throwable t) {            }        });

e:在call执行异步请求中传入了一个回调接口 里面有两个方法 一个成功的回调方法 一个失败的回调方法。在成功的回调方法中 我们拿到了一个 Response 对象 。这个对象就是我们需要进行处理的数据。
f:取消请求:
call.cancel();

4 对返回的response进行处理

在回调接口的成功方法中 我们拿到了response对象
我们来看看response有哪些方法:
这里写图片描述
这些方法 我就不赘述了 通过body方法 得到 ResponseBody

 ResponseBody responseBody=response.body();

我们来看看responseBody有哪些方法
这里写图片描述
图片上箭头所示的方法可以看出 通过 responseBody 的 byte方法可以得到字节数组。byteStream方法可以拿到输入流 contentType可以拿到多媒体资源 最重要的string方法可以拿到json字符串 通过这些方法我们不难看出 retrofit不仅json字符串的获取 也支持多媒体文件的操作 以及文件的操作。
同过string方法拿到字符串

String json=responseBody.string();

在这里就需要对json字符转化成java对象了 通用的处理工具有 Google推荐的Gson 阿里巴巴的fastJson 以及 json 有人肯定想既然 有一系列的转化方法来转化json字符串 为何 retrofit不直接转化json字符串成java对象返回给我们呢。是的 retrofit2.0提供了这样的操作 在构建retrofit的时候 添加Gson转换器

Retrofit retrofit = new Retrofit.Builder()                .baseUrl("https://api.github.com/")                .**addConverterFactory(GsonConverterFactory.create())**                .build();

既然retrofit要帮我们转化json字符串 那就需要转入需要转化的类型 修改我们的api 在定义接口时将类型传入

@GET("repos/{owner}/{repo}/contributors")    Call<List<Contributor>> contributorsBySimpleGetCal2(@Path("owner") String owner, @Path("repo") String repo);

现在看我们的回调接口的成功方法中是如何处理的

 ArrayList<Contributor> contributorsList = (ArrayList<Contributor>) response.body();

这样步骤就变简单多了

5 为retrofit2.0添加日志功能

在retrofit2.0中是没有日志功能的 但是由于retrofit2.0依赖于okHttp的所以 我们可以通过okHttp的拦截器功能来添加日志功能

        //构造日志拦截器        HttpLoggingInterceptor loggingInterceptor=new HttpLoggingInterceptor();        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);        //构造OkHttpClient 并设置拦截器        OkHttpClient client=new OkHttpClient.Builder()                .addInterceptor(loggingInterceptor)                .build();        //构造retrofit 并设置OKHttpClient        Retrofit retrofit=new Retrofit.Builder()                .client(client)                .baseUrl("https://api.github.com/")                .addConverterFactory(GsonConverterFactory.create())                .build();

结果如下 已成功添加日志功能
这里写图片描述

6 为retrofit请求添加请求头

a:利用注解在Api接口中添加请求头
既然retrofit2.0这么强大 肯定是有关于请求头Header的操作的
这里写图片描述
我们可以看到 有两种方法
Header一次添加一个

 Call<List<Contributor>> contributorsBySimpleGetCal3(@Header("name") String name, @Path("owner") String owner, @Path("repo") String repo);

Headers一次添加多个

    @Headers({            "Accept: application/vnd.github.v3.full+json",            "User-Agent: Retrofit-Sample-App"    })    @GET("repos/{owner}/{repo}/contributors")    Call<List<Contributor>> contributorsBySimpleGetCal3( @Path("owner") String owner, @Path("repo") String repo);

b:利用okHttp3 在构建OKHttpClient时添加拦截器设置请求头

//构造OkHttpClient 并设置拦截器        OkHttpClient client=new OkHttpClient.Builder()                .addInterceptor(new Interceptor() {                    @Override                    public okhttp3.Response intercept(Chain chain) throws IOException {                        Request request=chain.request().newBuilder()                                .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")                                .addHeader("Accept-Encoding", "gzip, deflate")                                .addHeader("Connection", "keep-alive")                                .addHeader("Accept", "*/*")                                .addHeader("Cookie", "add cookies here")                                .build();                        return chain.proceed(request);                    }                })                .addInterceptor(loggingInterceptor)                .build();

三 总结

今天为大家带了Retrofit2.0的入门篇 其实没什么东西 就是简单的介绍和使用。本文参考了 李江东的 Retrofit2.0使用详解 参考了 泡在网上的日子 Retrofit 2.0:有史以来最大的改进 这里我表示深深的感谢

1 0
原创粉丝点击