一、使用步骤
1、在 Gradle加入Retrofit库的依赖
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
// Retrofit库
}
2、添加网络权限
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
3、接口定义
public interface BlogService {
@GET("blog/{id}")
Call<ResponseBody> getBlog(@Path("id") int id);
}
定义接口,创建请求方法。
4、创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:4567/")
.build();
Retrofit2 实例创建通过Retrofit.Builder创建,并要通过baseUrl方法设置URL
注1:Retrofit2 的baseUrl中的路径必须以/结束,某些特殊情况下可以隐藏比如 https://www.baidu.com?key=value,因为这个URL隐含的路径就是 /(斜线,代表根目录) ,而后面的?key=value
在拼装请求时会被丢掉所以写上也没用。
5、创建代理对象
BlogService service = retrofit.create(BlogService.class);
由于前面定义的接口没办法调用方法,所以需要通过Retrofit实例创建一个代理对象。
6、接口调用
Call<ResponseBody> call = service.getBlog(2);
// 用法和OkHttp的call如出一辙,
// 不同的是如果是Android系统回调方法执行在主线程
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
二、Retrofit注解详解
Retrofit一共有22个注解。
1、http请求方法
![](https://img.haomeiwen.com/i1724103/db95c51539b62c96.png)
Http可以通过其三个属性 :method
、path
,hasBody
来实现其他的请求方法
public interface BlogService {
/**
* method 表示请求的方法,区分大小写
* path表示路径
* hasBody表示是否有请求体
*/
@HTTP(method = "GET", path = "blog/{id}", hasBody = false)
Call<ResponseBody> getBlog(@Path("id") int id);
}
2、标记类
![](https://img.haomeiwen.com/i1724103/4d09b5595bfb3291.png)
Streaming : 文件下载,如果没有添加这个字段,就是一次性下载后再保存,如果遇到大文件很容易造成内存溢出。
3、参数类
![](https://img.haomeiwen.com/i1724103/073abf80aacf492e.png)
Field 和 FieldMap 与 FormUrlEncoded注解配合
Part 和 PartMap 与 Multipart 注解配合,适合文件上传情况。
{占位符} 和 path尽量只用在URL的path部分,url中的参数使用Query和QueryMap代替。
三、Gson和Converter
在默认情况下Retrofit只支持将HTTP的响应体转换换为ResponseBody
,这也是为什么我在前面的例子接口的返回值都是 Call<ResponseBody>
, 但如果响应体只是支持转换为ResponseBody
的话何必要引入泛型呢, 返回值直接用一个Call
就行了嘛,既然支持泛型,那说明泛型参数可以是其它类型的, 而Converter
就是Retrofit为我们提供用于将ResponseBody
转换为我们想要的类型。
引入Gson支持:
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
通过GsonConverterFactory为Retrofit添加Gson支持:
Gson gson = new GsonBuilder()
//配置你的Gson
.setDateFormat("yyyy-MM-dd hh:mm:ss")
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:4567/")
//可以接收自定义的Gson,当然也可以不传
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
4、RxJava与CallAdapter
说到Retrofit就不得说到另一个火到不行的库RxJava
,网上已经不少文章讲如何与Retrofit结合,但这里还是会有一个RxJava的例子,不过这里主要目的是介绍使用CallAdapter
所带来的效果。
第3节介绍的Converter
是对于Call<T>
中T
的转换,而CallAdapter
则可以对Call
转换,这样的话Call<T>
中的Call
也是可以被替换的,而返回值的类型就决定你后续的处理程序逻辑,同样Retrofit提供了多个CallAdapter
,这里以RxJava
的为例,用Observable
代替Call
:
引入RxJava支持:
implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
// 针对rxjava2.x(adapter-rxjava2的版本要 >= 2.2.0)
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
通过RxJavaCallAdapterFactory为Retrofit添加RxJava支持:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:4567/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
// 针对rxjava2.x
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
网友评论