最新消息:欢迎访问Android开发中文站!商务联系微信:loading_in

Android 网络请求库Retrofit简单使用

开发进阶 AndroidChina 3083浏览 0评论

什么是 Retrofit ?

Retrofit 是一套 RESTful 架构的 Android(Java) 客户端实现,基于注解,提供 JSON to POJO(Plain Ordinary Java Object ,简单 Java 对象),POJO to JSON,网络请求(POST,GET, PUT,DELETE 等)封装。

既然只是一个网络请求封装库,现在已经有了那么多的大家已经耳熟能详的网络请求封装库了,为什么还要介绍它呢,原因在于 Retrofit 是一套注解形的网络请求封装库,让我们的代码结构更给为清晰。它可以直接解析JSON数据变成JAVA对象,甚至支持回调操作,处理不同的结果。
想更详细的了解 Retrofit,可以查看官方文档 。

话不多说,直入主题~~

一、集成

目前我使用的是AndroidStudio,那么在model的build.gradle文件中添加以下引用:

compile 'com.squareup.okhttp3:okhttp:3.2.0' 
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'

说明:

Retrofit依赖于okhttp,所以需要集成okhttp
API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析.请使用最新版的Gson

二、返回的数据格式

使用的是百度API的数据接口:名人名言API

这里写图片描述

这里写图片描述

该接口的API主机地址为:http://apistore.baidu.com

需要访问的接口:avatardata/mingrenmingyan/lookup;

需要一个key等于apikey的Header和一个keyword等于名人名言的查询关键字,而且该请求为GET请求.

访问该API返回的数据格式如下:

<br />{<br />    "total": 914,<br />    "result": [<br />        {<br />            "famous_name": "布兰登",<br />            "famous_saying": "人生至善,就是对生活乐观,对工作愉快,对事业兴奋。"<br />        },<br />        {<br />            "famous_name": "魏书生",<br />            "famous_saying": "抽打自己的鞭子要掌握在自己的手里,在漫长的人生道路的每一步上,都要经常鞭策自警,万不可以为有过一两次抽打就可以沿途平安了。"<br />        },<br />        {<br />            "famous_name": "亨·易卜生",<br />            "famous_saying": "夺走了普通人生活的幻想,也就等于夺去了他的幸福"<br />        },<br />        {<br />            "famous_name": "佚名",<br />            "famous_saying": "不知道自己走向何方的人,大都是人生的匆匆过客。"<br />        },<br />        {<br />            "famous_name": "南丁格尔",<br />            "famous_saying": "人生欲求安全,当有五要。一是清洁空气,二是澄清饮水,三是流通沟渠,四是扫洒屋宇,五是日光充足。"<br />        }<br />    ],<br />    "error_code": 0,<br />    "reason": "Succes"<br />}<br />

三、AndroidStudio插件 GsonFormat

我们根据上面API返回的json数据来创建一个FamousInfo数据对象,我们可以利用AndroidStudio插件 GsonFormat 快速,方便的将json数据转为Java 对象,
FamousInfo.java

<br />package com.woyou.androidsample.bean;<br /><br />import java.util.List;<br /><br />/**<br /> * Created by Xiho on 2016/3/14.<br /> */<br />public class FamousInfo {<br /><br />    /**<br />     * total : 227<br />     * result : [{"famous_name":"车尔尼雪夫斯基","famous_saying":"非凡的单纯,非凡的明确\u2014\u2014这是天才的智慧的最可惊人的品质。"},{"famous_name":"约·德莱顿","famous_saying":"天才在社会生活中往往显得迟钝而"},{"famous_name":"雨果","famous_saying":"敢于冲撞命运才是天才"},{"famous_name":"卡莱尔","famous_saying":"所谓天才,就是比任何人都先抵挡痛苦的经验本领。"},{"famous_name":"林肯","famous_saying":"卓越的天才不屑走一条人家走过的路。他寻找迄今没有开拓过的地区。"},{"famous_name":"席勒","famous_saying":"产生天才的土壤比天才还要难找"},{"famous_name":"爱因斯坦","famous_saying":"任何天才不能在孤独的状态中发展"},{"famous_name":"民谚","famous_saying":"名人的古怪行为是天才的标志,凡人的古怪行为是神经出了毛病"},{"famous_name":"鲁迅","famous_saying":"哪里有天才,我是把别人喝咖啡的工夫都用在了工作上了。"},{"famous_name":"塞涅夫","famous_saying":"没有某些发狂的劲头,就没有天才。"},{"famous_name":"狄德罗","famous_saying":"精神的浩瀚想象的活跃心灵的勤奋:就是天才。"},{"famous_name":"爱默生","famous_saying":"平凡的人希望,天才的人创造。"},{"famous_name":"契诃夫","famous_saying":"真正的天才是常常隐藏在群众里面,绝不挤向人前去露脸的。"},{"famous_name":"别林斯基","famous_saying":"任何天才,不经过艰苦不断的劳动,不经过最使空想家头疼和懊恼的最初纯物质和机械的劳动,就无法精通任何种类的艺术。"},{"famous_name":"杨格","famous_saying":"我愿意以天才比美德,以学问比财富。如美德越少的人,越需要财富,天才越低的人,越需要学问。"},{"famous_name":"巴尔扎克","famous_saying":"职业尽管不同,但天才的品德并无分别。"},{"famous_name":"恩格斯","famous_saying":"逆境使天才脱颖而出,顺境会埋没"},{"famous_name":"巴尔扎克","famous_saying":"破坏的人和建设的人,两者都是意志的现象:一个是准备工作,另一个是完成工作;前者好像是一个恶的天才,后者似乎是一个善的天才;对这一个给予光荣,对另一个给予忘却。恶者哇啦哇啦,把庸俗的人们从梦里惊醒,对他佩服得五体投地,可是善者却一直默不作声。"},{"famous_name":"培根","famous_saying":"如果孩子确有某种超群的天才,那当然应该扶植发展。但就一般情况说,下面这句格言很有用的:\u201c长期的训练会通过适应化难为易。\u201d"},{"famous_name":"爱迪生","famous_saying":"天才是百分之一的灵感,百分之九十九的血汗。"}]<br />     * error_code : 0<br />     * reason : Succes<br />     */<br /><br />    private int total;<br />    private int error_code;<br />    private String reason;<br />    /**<br />     * famous_name : 车尔尼雪夫斯基<br />     * famous_saying : 非凡的单纯,非凡的明确——这是天才的智慧的最可惊人的品质。<br />     */<br /><br />    private List&amp;lt;ResultEntity&amp;gt; result;<br /><br />    public void setTotal(int total) {<br />        this.total = total;<br />    }<br /><br />    public void setError_code(int error_code) {<br />        this.error_code = error_code;<br />    }<br /><br />    public void setReason(String reason) {<br />        this.reason = reason;<br />    }<br /><br />    public void setResult(List&amp;lt;ResultEntity&amp;gt; result) {<br />        this.result = result;<br />    }<br /><br />    public int getTotal() {<br />        return total;<br />    }<br /><br />    public int getError_code() {<br />        return error_code;<br />    }<br /><br />    public String getReason() {<br />        return reason;<br />    }<br /><br />    public List&amp;lt;ResultEntity&amp;gt; getResult() {<br />        return result;<br />    }<br /><br />    public static class ResultEntity {<br />        private String famous_name;<br />        private String famous_saying;<br /><br />        public void setFamous_name(String famous_name) {<br />            this.famous_name = famous_name;<br />        }<br /><br />        public void setFamous_saying(String famous_saying) {<br />            this.famous_saying = famous_saying;<br />        }<br /><br />        public String getFamous_name() {<br />            return famous_name;<br />        }<br /><br />        public String getFamous_saying() {<br />            return famous_saying;<br />        }<br />    }<br />}<br /><br />

四、实现过程

首先, 按照官方的说明,我们需要创建一个接口,返回 Call;如下:

<br />@GET("/avatardata/mingrenmingyan/lookup")<br />    Call&amp;lt;FamousInfo&amp;gt; getFamousResult(@Header("apiKey") String apiKey,<br />                                     @Query("keyword") String keyword,<br />                                     @Query("page") int page,<br />                                     @Query("rows") int rows);<br />

这里我们使用的是Retrofit 提供注解的方式来定义接口的

* @get后面我们填写需要访问对应的接口地址

* @Header用来添加Header

* @Query用来添加查询关键字

现在接口定义好了,我们来* 定义Retrofit 网络接口服务的包装类 *

<br />package com.woyou.androidsample;<br /><br />import android.content.Context;<br /><br />import retrofit2.GsonConverterFactory;<br />import retrofit2.Retrofit;<br /><br />/**<br /> * Retrofit 网络接口服务的包装类<br /> * Created by Xiho on 2016/3/14.<br /> */<br />public class RetrofitWrapper {<br />    private static RetrofitWrapper instance;<br />    private Context mContext;<br />    private Retrofit retrofit;<br /><br />    private RetrofitWrapper() {<br />           //1.创建Retrofit对象<br />        retrofit = new Retrofit.Builder().baseUrl(Constant.BASEURL) // 定义访问的主机地址<br />                .addConverterFactory(GsonConverterFactory.create())  //解析方法<br />                .build();<br />    }<br />    /**<br />     * 单例模式<br />     *<br />     * @return<br />     */<br />    public static RetrofitWrapper getInstance() {<br />        if (instance == null) {<br />            synchronized (RetrofitWrapper.class){<br />                if (instance==null){<br />                    instance = new RetrofitWrapper();<br />                }<br />            }<br />        }<br />        return instance;<br />    }<br /><br />    public &amp;lt;T&amp;gt; T create(final Class&amp;lt;T&amp;gt; service) {<br />        return retrofit.create(service);<br />    }<br /><br />}<br /><br />/**<br />   * Created by Xiho on 2016/3/14.<br />   */<br />public class Constant {<br />    public  static String BASEURL="http://apis.baidu.com"; //服务器地址<br />    public  static String APIKEY="4c4f0c3c49e09d5578ae0ba49fa84a97";<br /><br />}<br />

网络服务的包装类定义好了之后,在定义一个访问的Model(个人编码风格,其实可以更简洁点)。

<br />public class FamousInfoModel {<br />    private static FamousInfoModel famousInfoModel;<br />    private FamousService mFamousService;<br /><br />    /**<br />     * 单例模式<br />     *<br />     * @return<br />     */<br />    public static FamousInfoModel getInstance(Context context) {<br />        if (famousInfoModel == null) {<br />            famousInfoModel = new FamousInfoModel(context);<br />        }<br />        return famousInfoModel;<br />    }<br /><br />    private FamousInfoModel(Context context) {<br />        mFamousService = (FamousService) RetrofitWrapper.getInstance().create(FamousService.class);<br />    }<br /><br />    /**<br />     * 查询名人名言<br />     *<br />     * @param famousInfoReq<br />     * @return<br />     */<br />    public Call&amp;lt;FamousInfo&amp;gt; queryLookUp(FamousInfoReq famousInfoReq) {<br />        Call&amp;lt;FamousInfo&amp;gt; infoCall = mFamousService.getFamousResult(famousInfoReq.apiKey, famousInfoReq.keyword, famousInfoReq.page, famousInfoReq.rows);<br />        return infoCall;<br />    }<br />}<br /><br />

五、如何使用

构建好接口以后,可以使用了!

使用分为四步:

  • 创建Retrofit对象
  • 创建访问API的请求
  • 发送请求
  • 处理结果
    主要代码如下:
<br />FamousInfoModel famousInfoModel =FamousInfoModel.getInstance(getApplicationContext());<br />// 获取事件<br />    private void initEvent() {<br />        mSerachBtn.setOnClickListener(new View.OnClickListener() {<br />            @Override<br />            public void onClick(View v) {<br />                //创建访问的API请求<br />                Call&amp;lt;FamousInfo&amp;gt; callFamous= famousInfoModel.queryLookUp(initParams());<br />                //发送请求<br />                callFamous.enqueue(new Callback&amp;lt;FamousInfo&amp;gt;() {<br />                    @Override<br />                    public void onResponse(Call&amp;lt;FamousInfo&amp;gt; call, Response&amp;lt;FamousInfo&amp;gt; response) {<br />                        if(response.isSuccess()){<br />                            FamousInfo result = response.body();<br />                            if(result!=null){<br />                                List&amp;lt;FamousInfo.ResultEntity&amp;gt; entity = result.getResult();<br />                                    mTxtContent.setText("1、"+entity.get(0).getFamous_saying()+"\n---"+entity.get(0).getFamous_name()+"\n 2、"<br />                                            +entity.get(1).getFamous_saying()+"\n---"+entity.get(1).getFamous_name());<br />                            }<br />                        }<br />                    }<br />                    @Override<br />                    public void onFailure(Call&amp;lt;FamousInfo&amp;gt; call, Throwable t) {<br /><br />                    }<br />                });<br />            }<br />        });<br />    }<br />

最后运行的效果图如下:

这里写图片描述

* 搜索的结果我只是显示了其中一部分,只用来使用Retrofit 这个框架,没有很具体去做一些处理啦,后面还会用一些其他的库,还会使用本Demo 来进行测试,所以这次就简单写了下。*

附上源码:AndroidRetrofitSample

六、扩展阅读

* Retrofit:*

* Retrofit 官方文档:http://square.github.io/retrofit

* Retrofit 使用介绍:http://www.cnblogs.com/angeldevil/p/3757335.html

* Retrofit 离线缓存策略:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0115/3873.html

我的博客:http://blog.csdn.net/u011974987

转载请注明:Android开发中文站 » Android 网络请求库Retrofit简单使用

您必须 登录 才能发表评论!