Android网络请求框架Retrofit使用详解

前言

技术日新月异,一天不跑,就out了!
早点的Android的网络请求框架android-async-http,Volley,XUtils早已被抛诸脑后,到前段时间的OKHttp,再到最近一段时间大火的Retrofit,封装的越来越好!代码越来越简洁!
Retrofit与okhttp共同出自于大名鼎鼎的Square公司,retrofit就是对okhttp又做了一层封装。把网络请求都交给给了Okhttp,下面就介绍一下Retrofit网络请求框架的使用!

使用

①现在Retrofit官方最新版本是2.1.0,那么首先呢就是添加依赖了,在build.gradle中引入:

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

注意:我们导入的retrofit2各个包的版本号要一致,否则就会报错!
第二个包是我们ConverterFactory的String依赖包,也就是说我们的返回值是String,第二个包是我们ConverterFactory的Gson依赖包,我们的反正值是我们定义的Gson实体类。具体怎么使用,就要看我们在定义请求接口的时候,Call泛型里边写的是谁!!!
②然后需要我们定义一个请求接口:

import retrofit2.Call;
import retrofit2.http.POST;
import retrofit2.http.Query;

/**
 * Created by Admin on 2016/7/19.
 */
public interface RequestInterface {
    //%e5%8c%97%e4%ba%ac为北京的URL编码,URLEncoder#encode("北京","UTF-8")
    //以此URL为例
    String URL = " http://api.36wu.com/Weather/GetWeather?district=%E5%8C%97%E4%BA%AC";

    @POST("Weather/GetWeather")
    Call getData(@Query("district") String district);

}

这里的URL是我在网上随便找的一个天气API接口,请求方式是POST,当然我们也可以使用GET请求!

    @GET("{url}")
    Call getData(@Path("url") String url);

Retrofit提供的请求方式注解有@GET和@POST,参数注解有@PATH和@Query等,@Query就是我们的请求的键值对的设置,我们构建Call对象的时候会传入此参数,这里的@Query("district")就是键,后边的String district就是对应的值。@PATH指的是通过参数填充完整的路径,这里的参数url会被填充至{url}中,形成完整的Url请求地址,{url}相当于一个占位符!
③接着给出我们的Gson实体类,因为这个API接口要申请appkey,我这里直接拿来用的所以返回的json信息是

 {
     "message":"该authkey错误或该authkey无权访问此接口,如商用请购买服务,试用请在线申请。",
     "status":401
 }

所以我就以该json数据创建一个Gson实体类

public class ResponseData {
    private String message;
    private String status;

    @Override
    public String toString() {
        return "消息|"+message+"\n"+
                "状态码|"+status;
    }
}

说到这,说一个题外话,这样的json数据比较简单,当我们遇到比较复杂的json数据的时候,我们也应该按照对应的返回字段创建出对应的正确的Gson实体类。
可以参考一下下面这篇文章,写的比较清晰:
http://blog.csdn.net/tkwxty/article/details/34474501
④最后就是具体的使用了:

Retrofit  retrofit=new Retrofit.Builder()
    .baseUrl("http://api.36wu.com/")
    //增加返回值为String的支持
    .addConverterFactory(ScalarsConverterFactory.create())
     //增加返回值为Gson的支持(返回实体类)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

//这里采用的是Java的动态代理模式,得到请求接口对象
RequestInterface 
requestInterface=retrofit.create(RequestInterface.class);
//传入district的值,得到Call对象
Call call=requestInterface.getData("%E5%8C%97%E4%BA%AC"); 
//call#enqueue请求网络
call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                Log.d("response",response.body().toString());
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                Log.d("failure","失败"+t.toString());
            }
        });
    }

这里有一个需要注意的问题:就是baseUrl和@POST的地址拼接问题,建议在baseUrl中最后加上/,而不要在POST中地址开始使用/,这样才是拼接的正确的Url结果,否则会出现各种你意向不到的情况!
这样整个网络请求就介绍完了,上面的打印结果:

消息|该authkey错误或该authkey无权访问此接口,如商用请购买服务,试用请在线申请。
状态码|401

如果我们在请求接口里边写的是Call,那么得到的打印解果将是返回的整个json数据。

源码解析及用的设计模式

能力有限,分析的不透彻,我在简书上面看到stay大神的分析,收藏一下:

Retrofit分析-漂亮的解耦套路
http://www.jianshu.com/p/45cb536be2f4#

Retrofit分析-经典设计模式案例
http://www.jianshu.com/p/fb8d21978e38

推荐阅读

鸿洋大神的一篇关于Retrofit的博客,值得一读:
Retrofit2 完全解析 探索与okhttp之间的关系
http://blog.csdn.net/lmj623565791/article/details/51304204

你可能感兴趣的:(Android学习笔记)