载请标明出处: http://blog.csdn.net/u011974987/article/details/50895633;

什么是 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返回的数据格式如下:

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

三、AndroidStudio插件 GsonFormat

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

package com.woyou.androidsample.bean;import java.util.List;/*** Created by Xiho on 2016/3/14.*/
public class FamousInfo {/*** total : 227* 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":"天才是百分之一的灵感,百分之九十九的血汗。"}]* error_code : 0* reason : Succes*/private int total;private int error_code;private String reason;/*** famous_name : 车尔尼雪夫斯基* famous_saying : 非凡的单纯,非凡的明确——这是天才的智慧的最可惊人的品质。*/private List<ResultEntity> result;public void setTotal(int total) {this.total = total;}public void setError_code(int error_code) {this.error_code = error_code;}public void setReason(String reason) {this.reason = reason;}public void setResult(List<ResultEntity> result) {this.result = result;}public int getTotal() {return total;}public int getError_code() {return error_code;}public String getReason() {return reason;}public List<ResultEntity> getResult() {return result;}public static class ResultEntity {private String famous_name;private String famous_saying;public void setFamous_name(String famous_name) {this.famous_name = famous_name;}public void setFamous_saying(String famous_saying) {this.famous_saying = famous_saying;}public String getFamous_name() {return famous_name;}public String getFamous_saying() {return famous_saying;}}
}

四、实现过程

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

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

这里我们使用的是Retrofit 提供注解的方式来定义接口的
* @get后面我们填写需要访问对应的接口地址
* @Header用来添加Header
* @Query用来添加查询关键字

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

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

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

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

五、如何使用

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

使用分为四步:

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

最后运行的效果图如下:

* 搜索的结果我只是显示了其中一部分,只用来使用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 网络请求库Retrofit简单使用相关推荐

  1. android网络请求库volley方法详解

    使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列     ...

  2. android post请求添加公共参数_XHttp2 一个功能强悍的网络请求库

    XHttp2 一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装.还不赶紧点击使用说明文档,体验一下吧! 项目地址 关于我 https://github ...

  3. java中使用okhttpsoap,Android okHttp网络请求之Retrofit+Okhttp+RxJava组合

    Retrofit介绍: Retrofit和okHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库,Retrofit简化了网络请求流程,基于OkHtttp做了封装,解耦的更彻底:比 ...

  4. Android网络请求框架之Retrofit(二)

    前面一篇文章介绍了Retrofit的基本用法,没有看过的童鞋可以移步:Android网络请求框架之Retrofit(一),现在我们来继续介绍Retrofit配合RxJava.RxAndroid的用法. ...

  5. Android -- 网络请求

    一. HttpURLConnection 二. HttpClient 三.Volley 四.OkHttp 五. Retrofit ----------------------------------- ...

  6. Android网络请求归纳 HttpUrlConnection| Vollety|OKHttp3|Retrofit2

    1.网络基础知识: Android网络API库有哪些?      HttpUrlConnection: jdk内置      HttpClient:android提供,6.0被删除      Voll ...

  7. Android网络开发之Retrofit+OkHttpClient+RXJava 基本用法演示

    写本文的目的只是为了给需要帮助的朋友提供一个演示,也是记录一下使用这些流行库的基本用法,以便日后用到的时候可以及时找到. 好了,进入正题,关于这三个库的介绍我就不说了,自己百度,先看程序执行效果图: ...

  8. 流行框架(二)网络请求库 OKhttp

    文章目录 概述 HttpURLConnection GET和POST获取文本数据 GET POST OKHttp 基本使用 依赖与权限 发起一个get请求 重要概念 OkHttpClient Requ ...

  9. 「Python 编程」编码实现网络请求库中的 URL 解析器

    相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSockets 库.这里回顾一下它们的基本用法,例如使用 Requests 库向目标网站发出 GET 请求: impo ...

最新文章

  1. 数学笔记3——导数3(隐函数的导数)
  2. 成都理工大学工程技术学院计算机专业收分线,2019年成都理工大学工程技术学院美术类专业录取分数线...
  3. linux Pci字符驱动基本加载流程
  4. 多个线程对串口读取 modbus_看完这个,如果还不懂Modbus,那您去撞豆腐吧
  5. Linux工作笔记037---Centos8.2下安装mysql_测试通过_注意这里安装8.0.22版本的_8.0以后的版本有需要注意的地方_跟7.0之前的版本不一样
  6. idea 如何关闭 field injection is not recommended 警告
  7. JVM重点简述—分代收集理论与垃圾收集算法
  8. ● firewalld.service Loaded: not-found (Reason: No such file or directory)
  9. LINQToSQL中如何更好的手动设置导航字段,并返回实名类型而不是匿名类型
  10. python 简单文字游戏代码
  11. 华为交换机VTY用户界面属性配置教程
  12. SQLSERVER不同数据库联表查询
  13. Java设计模式汇总详解
  14. Sublime快捷键大全
  15. 【运动控制篇】(7)路径跟踪及组合动作方向
  16. 债券收益率预测模型_利率预测模型系列之一:简单的N-S模型运用
  17. PMI2016大会最全资料集合
  18. npm cb() never called!和 Error: getaddrinfo ENOTFOUND registry.npmjs.com registry.npmjs.com:443
  19. 第五课:实现花样流水灯
  20. 51单片机教程:51单片机驱动四个8*8点阵,拼凑16*16点阵显示标准汉字。

热门文章

  1. 泛在操作系统功能特点
  2. gdb命令行调试相关操作
  3. Android自动手绘,圆你儿时画家梦!
  4. 小分子构象搜索:随机方法和系统方法
  5. 你看到的是乱,我看到的是月亮,如是而已。
  6. 【UE4教程】Unreal 4.22 UI显示指定物体-实时渲染
  7. UVA-10929-You can say 11(秦九昭算法+同余与模算术)
  8. 分享 | 无监督视觉目标跟踪
  9. oracle 表信息查询,oracle 表信息查询
  10. java编写打字游戏_程序设计:简单字母打字游戏(JAVA编写)