背景
如果看到了 OkHttp, RxJava 相关文章的话,一定会同时看到 Retrofit。
OkHttp 是对 http 客户端进行了封装,RxJava 是反应式宣言,那 Retrofit 是什么呢?
于是这便是本文的写作背景。
第一个例子
Retrofit 的一个用法是直接把 Http 请求封装为 Java 对象。举个例子就明白了。
封装请求参数
原始的 url 为:
curl -s "http://ip.taobao.com/service/getIpInfo2.php?ip=119.75.213.61"
{"code":0,"data":{"ip":"119.75.213.61","country":"中国","area":"","region":"北京","city":"北京","county":"XX","isp":"电信","country_id":"CN","area_id":"","region_id":"110000","city_id":"110100","county_id":"xx","isp_id":"100017"}}
下面开始变魔术,将 url 网络调用变为 java 方法调用,调用方对网络基本无感知。
IPService.java
运行结果
{"code":0,"data":{"ip":"119.75.213.61","country":"中国","area":"","region":"北京","city":"北京","county":"XX","isp":"电信","country_id":"CN","area_id":"","region_id":"110000","city_id":"110100","county_id":"xx","isp_id":"100017"}}
在本例中,通过接口注解,调用 java 方法,Retrofit 自动将其转化为 http 请求参数,去请求服务器,并返回结果。
本例主要演示参数的封装。
封装运行结果
上面的例子中,返回的结果为 ResponseBody,还需要自己处理。在本例中,通过定义一个 IP 类,来直接返回 IP 类对象。具体如下:
IPService2.java
IP.java
运行结果
Result [code=0, data=IP [ip=119.75.213.61, country=中国, area=, region=北京, city=北京, county=XX, isp=电信, country_id=CN, area_id=, region_id=110000, city_id=110100, county_id=xx, isp_id=100017]]
到此为止,完成了一个入门使用说明。但是实际情况中,对于输入和输出可能有更复杂的情况。这时,怎么用 retrofit 来处理呢?
输入和输出
输入和输出可能有多种情况。
输入
输入参数的指定方法,可以通过 url,可以通过 body,可以通过表单、分块表单,可以通过 Header 等。
这里仅罗列一下,需要的时候可以去[1]中来找示例,都不复杂。
请求方法:
@GET
@POST
@PUT
@DELETE
@PATCH
@HEAD
@OPTIONS
@HTTP
请求标记:
@FormUrlEncoded
: 表单中的 field
@Multipart
: 分传上传
@Streaming
: 流形式返回
请求参数:
@Headers
: Header 控制
@Header
: Header 控制
@HeaderMap
: Header 控制
@Body
: HTTP 请求 body
@Field
: 表单中的 field
@FieldMap
: 表单中的 field
@Part
: 分传上传
@PartMap
: 分传上传
@Path
: 通过路径传递参数,如 "users/{user}/repos"
@Query
:
@QueryMap
:
@Url
:
输出
输出的结果可以是 Json 格式的,可以是 Protobuf 格式的,可以是 XML 格式的,可以是 Scalars 格式的,也可以是用户自定义格式的。
前面的例子即是 Json 格式的。
- Json 适配器:提供了 Gson, Jackson 和 Moshi 三种。
- Protobuf 适配器:提供了 Protobuf 和 Wire 两种。
- XML 适配器:Simple XML
自定义 Converter
如果返回的结果不是标准的 Json 格式,而是自定义的格式,又想返回成 Java 对象直接使用,怎么办呢?
这时可以通过自定义 Converter,来实现定制输出结果类。
下面举个自定义格式的例子:
通过 IPResultConverter
和 IPResultConverterFactory
来解析返回的 IP Json,输出{国家}{省}{市}
IPResultConverter.java
IPService3.java
结果
中国_北京_北京
自定义 CallAdapter
自定义 CallAdapter 是做什么的呢?
默认情况下,我们返回的是一个 Call<?>
的结果。如果我们不想要 Call<?>
,而是想要 Observable<?>
,或者想要 LiveData<?>
呢?
retrofit 允许通过自定义 CallAdapter,来对 Call<?>
再做一次转换。
如果看了前面的反应式宣言的话,这里这么做的目的就很好理解了。
同样举个例子,其中没有详细来写,仅做示例:
IPService4.java
结果
{"code":0,"data":{"ip":"119.75.213.61","country":"中国","area":"","region":"北京","city":"北京","county":"XX","isp":"电信","country_id":"CN","area_id":"","region_id":"110000","city_id":"110100","county_id":"xx","isp_id":"100017"}}
参考
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于