正文
1
&
to
=
2
&
amount
=
500.00
好了,当然实际来说RESTful肯定不是就这点内容。这里我们只是了解一下RESTful最基本和核心的设计理念。
当我们要去学习一样新的技术,还有什么是比官方的资料更好的了呢?所以,第一步我们打开网址:
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更简单的用例,再逐步深入。
已经阅读完了官方的用例介绍,乍看之下没什么,但实际用起来说不定就得碰坑。为方便测试,仍然通过 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大致的使用套路,在心里已经有个一二三了。