Square公司开源了许多优秀的库,Retrofit就是其中之一。

Retrofit是用来简化APP访问服务器API,如果你的服务器使用的使RESTAPI,那么赶紧使用Retrofit吧。

官方的文档是用GitHub的API说明使用过程的,有的童鞋可能从没用过GitHub的API(比如我),为了简单易懂,这里我使用一个查询手机归属地的API来说明Retrofit的使用过程。

集成

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

    compile 'com.squareup.okhttp3:okhttp:3.2.0'compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'compile 'com.google.code.gson:gson:2.6.2'compile 'com.jakewharton:butterknife:7.0.1'

说明:

  • Retrofit依赖于okhttp,所以需要集成okhttp
  • API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析.请使用最新版的Gson
  • butterknife是用来View绑定的,可以不用写那些烦人的findViewById

返回的数据格式

使用的是百度的API Store提供的API,地址在此:手机号码归属地__API服务_API服务_API Store.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q0CXFzTS-1583330214728)(http://7xjhi6.com1.z0.glb.clouddn.com/Retrofit_Demo_Phone_API.png)]

该接口的API主机地址为:http://apis.baidu.com,资源地址为:/apistore/mobilenumber/mobilenumber
需要一个key等于apikey的Header和一个key等于phone的查询关键字,而且该请求为GET请求.

所以我们需要构造一个GET请求,添加一个Header,添加一个Query关键字,访问该API返回的数据格式如下:

{"errNum": 0,"retMsg": "success","retData": {"phone": "15210011578","prefix": "1521001","supplier": "移动","province": "北京","city": "北京","suit": "152卡"}
}

根据返回结果我们创建数据对象PhoneResult,如下:

public class PhoneResult {/*** errNum : 0* retMsg : success* retData : {"phone":"15210011578","prefix":"1521001","supplier":"移动","province":"北京","city":"北京","suit":"152卡"}*/private int errNum;private String retMsg;/*** phone : 15210011578* prefix : 1521001* supplier : 移动* province : 北京* city : 北京* suit : 152卡*/private RetDataEntity retData;public void setErrNum(int errNum) {this.errNum = errNum;}public void setRetMsg(String retMsg) {this.retMsg = retMsg;}public void setRetData(RetDataEntity retData) {this.retData = retData;}public int getErrNum() {return errNum;}public String getRetMsg() {return retMsg;}public RetDataEntity getRetData() {return retData;}public static class RetDataEntity {private String phone;private String prefix;private String supplier;private String province;private String city;private String suit;public void setPhone(String phone) {this.phone = phone;}public void setPrefix(String prefix) {this.prefix = prefix;}public void setSupplier(String supplier) {this.supplier = supplier;}public void setProvince(String province) {this.province = province;}public void setCity(String city) {this.city = city;}public void setSuit(String suit) {this.suit = suit;}public String getPhone() {return phone;}public String getPrefix() {return prefix;}public String getSupplier() {return supplier;}public String getProvince() {return province;}public String getCity() {return city;}public String getSuit() {return suit;}}
}

注:AndroidStudio有个插件 GsonFormat可以很方便地将Json数据转为Java对象.

实现过程

构建

首先,按照官方的说明,我们需要创建一个接口,返回Call<PhoneResult>

官方范例:

public interface GitHubService {@GET("users/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user);
}

这里我们创建一个名为PhoneService的接口,返回值为Call<PhoneResult>,如下:

public interface PhoneService {@GET("")Call<PhoneResult> getResult();
}

首先我们需要填写API的相对地址:/apistore/mobilenumber/mobilenumber

public interface PhoneService {@GET("/apistore/mobilenumber/mobilenumber")Call<PhoneResult> getResult(@Header("apikey") String apikey, @Query("phone") String phone);
}

接着我们要添加一个Header和一个Query关键字,在这里我们需要使用Retrofit提供的注解:

  • @Header用来添加Header
  • @Query用来添加查询关键字

那么,我们的接口就如下了:

public interface PhoneService {@GET("/apistore/mobilenumber/mobilenumber")Call<PhoneResult> getResult(@Header("apikey") String apikey, @Query("phone") String phone);
}

使用

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

使用分为四步:

  1. 创建Retrofit对象
  2. 创建访问API的请求
  3. 发送请求
  4. 处理结果

代码如下所示:

private static final String BASE_URL = "http://apis.baidu.com";
private static final String API_KEY = "8e13586b86e4b7f3758ba3bd6c9c9135";private void query(){//1.创建Retrofit对象Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())//解析方法.baseUrl(BASE_URL)//主机地址.build();//2.创建访问API的请求PhoneService service = retrofit.create(PhoneService.class);Call<PhoneResult> call = service.getResult(API_KEY, phoneView.getText().toString());//3.发送请求call.enqueue(new Callback<PhoneResult>() {@Overridepublic void onResponse(Call<PhoneResult> call, Response<PhoneResult> response) {//4.处理结果if (response.isSuccess()){PhoneResult result = response.body();if (result != null){PhoneResult.RetDataEntity entity = result.getRetData();}}}@Overridepublic void onFailure(Call<PhoneResult> call, Throwable t) {}});
}

可能会有疑问:第一步中的解析方法GsonConverterFactory.create()是个啥?

官方文档也说明了,这是用来转换服务器数据到对象使用的.该Demo中使用API返回的数据是JSON格式,故此使用Gson来转换,如果服务器返回的是其他类型的数据,则根据需要编写对应的解析方法.

验证

好了,现在可以验证一下了!

编译APP,安装到手机,界面如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L7eP8Xmx-1583330214729)(http://7xjhi6.com1.z0.glb.clouddn.com/Retrofit_Demo_Phone_APP_001.png)]

输入手机号码,然后点击查询按钮,结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RN41XTXI-1583330214729)(http://7xjhi6.com1.z0.glb.clouddn.com/Retrofit_Demo_Phone_APP_002.png)]

项目代码详见此处:Dev-Wiki/RetrofitDemo

更多文章请访问我的博客:DevWiki Blog

Retrofit使用教程(一)相关推荐

  1. Android Retrofit使用教程(三):Retrofit与RxJava初相逢

    上一篇文章讲述了Retrofit的基本使用,包括GET,POST等请求.今天的文章中Retrofit要与RxJava配合使用. 了解RxJava RxJava有种种好处,我不在这里一一讲述.这里我只给 ...

  2. [原创]Retrofit使用教程(二)

    上一篇文章讲述了Retrofit的简单使用,这次我们学习一下Retrofit的各种HTTP请求. Retrofit基础 在Retrofit中使用注解的方式来区分请求类型.比如@GET("&q ...

  3. retrofit与rxjava使用

    retrofit和rxjava(加深) http://www.jianshu.com/p/64af68c5638c Android Retrofit + RxJava使用详解(基础) http://w ...

  4. 简单java登录页面android_Android 之路 - RxJava2+Retrofit实现简单登陆

    原标题:Android 之路 - RxJava2+Retrofit实现简单登陆 前言 使用RxJava2+Retrofit实现简单登陆. 正文1. Hello world1.1 相关版本 Androi ...

  5. Android RxJava+Retrofit+MVP 入门总结

    前言 RxJava+Retrofit+MVP的使用已经推出一段时间了,也一直想找个时间学习一下并且应用到接下来的项目中.趁放假这段时间仔细研究了一下,确实相比于其他框架的学习成本要高一些,不过功能实现 ...

  6. 掘金翻译计划,翻译掘金上优质的英文文章

    原文链接:https://github.com/xitu/gold-miner 掘金翻译计划 掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章.内容覆盖 Andro ...

  7. android网络框架

    https://www.zhihu.com/question/35189851 个人比较推荐Square开源组合,用Retrofit(目前已经是2.0+)+OkHttp基本上已经可以处理任何业务场景了 ...

  8. Android开源库V - Layout:淘宝、天猫都在用的UI框架,赶紧用起来吧!

    前言 V- Layout 是阿里出品的基础 UI 框架,用于快速实现页面的复杂布局,在手机天猫 Android版 内广泛使用 让人激动的是,在上个月V- Layout终于在Github上开源! Git ...

  9. MMKV:微信团队开源的轻量级存储方案

    目录 定义 优点 出现的意义 原理 定义 基于 mmap 内存映射的 key-value 存储组件 是一个类似于SharedPreferences的轻量级存储方案 微信团队开源 优点 操作灵活.安全性 ...

最新文章

  1. 二维码Data Matrix简介及在VS2010中的编译
  2. python全栈学习--day40()
  3. bond的主备模式_号外号外:Redhat7通过bond技术实现双网卡绑定
  4. boost::hana::plus用法的测试程序
  5. 我的一点企业做云经验
  6. C# ListView 简单命令例子
  7. Linux 设备驱动的并发控制
  8. 小程序支付成功后跳转页面失败
  9. mysql odbc 驱动_mysql odbc驱动 mysql odbc connector
  10. 使用 CSS3 实现 3D 图片滑块效果
  11. 用python进行数据分析--准备工作
  12. window10华硕计算机主板VT,华硕电脑主板开启VT虚拟化方法详解
  13. 变频电源基本控制电路系统
  14. 学习PPT好帖子 分享之
  15. 金融反欺诈 常用特征处理方法
  16. oceanbase安装
  17. 史上最全的数据库面试题,面试前刷一刷
  18. 达梦数据库查看表字段VARCHAR类型的长度单位是BYTE还是CHAR
  19. Nginx下配置Https,测试环境的完整过程
  20. swoole基础教程-2.入门

热门文章

  1. python_speech_features文档翻译
  2. 【论文阅读】Spatio-Temporal Graph Convolutional Networks:...Traffic Forecasting[时空图卷积网络:用于交通预测的深度学习框架](1)
  3. 编程中常见的Foo,是什么意思。。
  4. 2000-2009十年十大创业新模式
  5. Centos7安装trash-cli
  6. 基于人体骨架检测的安全警戒线
  7. ios服务器需要开启ipv6的支持,关于ios苹果APP审核 支持IPv6的问题解答
  8. uniApp小程序git clone后无法运行
  9. 全文检索技术Lucene入门和学习、与数据库数据结合的demo实现
  10. 瑞云渲染 | 全面支持Anima®4渲染插件,实现高精度的群集角色!