前言
在这个技术日新月累的今天,各种新的轮子层出不穷。网络这块,从HttpClient到android-async-http,再到Volley。当下比较火的网络框架Retrofit也是受到了很多开发者的热爱。虽然项目中并没有使用到Retrofit,但抱着学习的态度,我还是打算接触一下,算是有个了解。说不定后面的开发中会用到呢?
Retrofit概述
Retrofit是一个 RESTful 的 HTTP 网络请求框架的封装。注意这里并没有说它是网络请求框架,主要原因在于网络请求的工作并不是Retrofit来完成的。Retrofit 2.0开始内置OkHttp,前者专注于接口的封装,后者专注于网络请求的高效,二者分工协作。
我们的应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数、Header、Url等信息,之后由OkHttp完成后续的请求操作,在服务端返回数据之后,OkHttp将原始的结果交给Retrofit,后者根据用户的需求对结果进行解析的过程。所谓Retrofit,其实就是Retrofitting OkHttp了。
Hello Retrofit
废话不多说,直接撸代码。
新建项目,添加依赖:
1 | compile 'com.squareup.retrofit2:retrofit:2.1.0' //Retrofit2所需要的包 |
我找了一个天气API,用作示例中的网络请求。
1 | http://weatherapi.market.xiaomi.com/wtr-v2/temp/realtime?cityId=101010100 |
101010100代表的是北京市,这个接口会返回北京的实时天气。
OK,下面开始写请求的API了。
定义如下接口:
1 | public interface RequestService { |
然后在Activity中添加代码:
1 | button.setOnClickListener(new View.OnClickListener() { |
运行代码,点击按钮。会发现Log中有如下的Log:
可见,网络请求成功。
相关说明
Retrofit支持的协议包括GET/POST/PUT/DELETE/HEAD/PATCH,当然你也可以直接用HTTP来自定义请求,这些协议均以注解的形式进行配置。- 使用
ScalarsConverterFactory可使返回值转化成String。 Retrofit使用@Query来添加请求参数,示例中发送的请求实际就是http://weatherapi.market.xiaomi.com/wtr-v2/temp/realtime?cityId=101010100,通过@Query添加了cityId参数。Retrofit还有@path注解,直接与baseUrl整合成一个完整的请求。举个例子,采用相对路径:1
2path = "apath",baseUrl = "http://host:port/a/b/"
那么最后发送的请求 url = "http://host:port/a/b/apath"
当然,Retrofit还有很多功能以及用法,以及背后它为什么如此受宠的原因,都有待慢慢学习。
It’s just the beginning!