专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
复利大王  ·  江浙沪美女留子回国下嫁怀孕后悔 ·  22 小时前  
复利大王  ·  某航离谱瓜! ·  22 小时前  
复利大王  ·  某一线女网红下海? ·  22 小时前  
复利大王  ·  老同学中捞一捞能不能找到免费P友 ·  昨天  
复利大王  ·  不讲武德!中x银行? ·  昨天  
51好读  ›  专栏  ›  郭霖

Say Hello to Retrofit

郭霖  · 公众号  · android  · 2016-10-12 08:00

正文

请到「今天看啥」查看全文


1 & to = 2 & amount = 500.00

好了,当然实际来说RESTful肯定不是就这点内容。这里我们只是了解一下RESTful最基本和核心的设计理念。

从官方介绍初识Retrofit

当我们要去学习一样新的技术,还有什么是比官方的资料更好的了呢?所以,第一步我们打开网址:

http://square.github.io/retrofit

然后开始阅读,我们发现官方的介绍非常简单粗暴,一上来就通过一个 Introduction 来展示了如何使用 Retrofit 来进行一个最基本的请求。下面我们就逐步的分析一下:

从上图中,我们首先注意到了一个关键的说明信息: Retrofit会将你的HTTP API转换为Java中的interface的形式 。OK,接着看:

这里我们读到的描述是:Retrofit类 可以针对之前 定义的interface 生成一个具体实现。我们发现官方对此解释的很言简意赅,但更通俗的来讲的话:

也就是说虽然我们之前将此次请求的API信息封装为了一个接口,但我们也知道Java中接口是不能产生对象的,这时Retrofit类就站出来扮演了这个角色。

我们可以将Retrofit类看作是一个“工厂类”的角色,我们在接口中提供了此次的“产品”的生产规格信息,而Retrofit则通过信息负责为我们生产。

这里我们看到了一个重要的东西“ Call ”: 通过之前封装的请求接口对象创建的任一的Call都可以发起一个同步(或异步)的HTTP请求到远程服务器

之后说了一些通过注解来描述request的好处,然后这个简单的Introduction就结束了。那么,现在我们来简单总结一下,目前为止我们的感受如何。

我觉得就仅从以上简单的介绍当中我们起码有两点直观感受:那就是 解耦明确;使用简单 。通过注解的方式描述request让人眼前一亮。但与此同时:

我们发现读完Introduction后,仅仅是这个基本的用例中,都仍然有很多小细节需要我们通过实际使用之后才能搞明白。这可能在一定程度上说明了:

为什么说Retrofit的使用门槛相对于其它库来说要更高一些。不过没关系,我们自己先来写一个比官方Introduction更简单的用例,再逐步深入。

写第一个Demo碰坑

已经阅读完了官方的用例介绍,乍看之下没什么,但实际用起来说不定就得碰坑。为方便测试,仍然通过 servlet 在本地简单的实现服务器。

我们现在的设想可能是这样的,我只是想要写一个demo来测试一下用 Retrofit 来成功发起一次最基本的 get请求,所以最初的 doGet 无比简单:

完成了以上代码的编写,然后我们把该servlet的URL配置一下,言简意赅的,就配置为“ /api/retrofitTesting ”好了。这时服务器就准备完毕了。

很显然,下面我们就可以把焦点放在Android客户端的实现上来了。为了使用 Retrofit,所以我们的第一步工作自然就是在自己的项目中 设置依赖

配置好了依赖,接着我们就可以开始编码工作了。还记得官方用例的第一步吗?所以我们要做的显然是模仿它也把我们自己的HTTP API封装成interface。

public interface DemoService {
   @GET("api/retrofitTesting")
   Call testHttpGet(); }
// GSON - BEAN
class ResponseInfo {
   String describe; }

现在我们再来看这个所谓的API接口,可能就更加明确一点了。首先是通过 注解@GET 来声明本次请求方式为GET以及注明API-URL。

而就之后声明的方法来说:从其为 Call 的返回类型不难猜想多半与请求的发起有关,因为如果我们对 OkHttp 有所了解的话,一定就记得下面这样的代码:

newCall方法 实际就是返回一个Call类型的实例。而 Retrofit 中的Call接口相对于 OkHttp 添加了一个泛型,该泛型用于说明本次请求响应的数据解析类型。

那么这里的泛型为什么是我们自己建立的一个实体类呢?其实回忆一下之前服务器在 response 中返回的内容(JSON),就不难猜想到与GSON有关。

好的,我们继续按照官方用例中接下来的步骤去完善我们的demo。封装好了interface,接下来自然就是调用了,最终的代码如下:

有了之前的说明并对照官方示例,现在会发现以上代码很容易理解。而我们发现官方没有给出的step4其实也很熟悉,因为它和OkHttp的使用是相同的。

这个时候看上去我们的准备工作就已经完成了,于是兴致勃勃的编译并运行demo来查看一下效果,却发现收到了如下的一个异常:

为什么会出现这种情况呢?蛋疼啊!别急,通过异常信息的描述,我们得知这似乎与类型的转换相关,然后带着这个疑问再去查看官方文档,于是发现:

从上述信息我们得知 Retrofit 默认只能将响应体转换为 OkHttp 中的 ResponseBody,而我们之前为 Call 设置的泛型类型是自定义的类型 ResponseInfo 。

将JSON格式的数据转换为 Java-BEAN,很自然就会想到GSON。而 Retrofit 如果要执行这种转换是要依赖于另一个库的,所以我们还得在项目中配置另一个依赖:

之后,在构造Retrofit对象的时候加上一句代码就可以了:

这个时候,当我们再次运行程序就没问题了,成功的得到如下的日志打印:

现在,经过我们的一番摸索和折腾,关于Retrofit很基本的第一个demo就捣鼓出来了。

其实这是有意义的,因为回想一下会发现:现在我们对于Retrofit大致的使用套路,在心里已经有个一二三了。

回到官方文档继续学习







请到「今天看啥」查看全文


推荐文章
复利大王  ·  江浙沪美女留子回国下嫁怀孕后悔
22 小时前
复利大王  ·  某航离谱瓜!
22 小时前
复利大王  ·  某一线女网红下海?
22 小时前
复利大王  ·  不讲武德!中x银行?
昨天
思想聚焦  ·  中国式母子:别把儿子逼得不认娘
8 年前
编程派  ·  Airflow:Python 工作流管理利器
7 年前