Retrofit 是个什么?
可以理解为OKHttp这个网络请求框架的加强版,主要的网络请求工作是用OkHttp来实现的,但是如果不了解OkHttp的也没关系。Retrofit仅仅只是负责网络请求接口的封装,说白了就是OkHttp的管家,只是这个管家比较666,使用起来相对OkHttp而言方便很多,看到这里肯定有疑问,既然就是OKHttp的管家,我直接用OKHttp就好了,干嘛多此一举。好吧~~ 我开始也是这么想的,但Retrofit也有他的特点,不然就没有存在的必要了,特点:包含了特别多注解,方便简化你的代码量。并且还支持很多的开源库(著名例子:Retrofit + RxJava)。关于Rxjava此文不做介绍,可以找度娘。
那就正式开始进行学习吧,我根据例子来进行举例。
使用:
- 第一步、添加依赖
由于Retrofit是基于OkHttp,所以还需要添加OkHttp库依赖
在build.grale添加如下依赖:
dependencies {
// Okhttp库
compile 'com.squareup.okhttp3:okhttp:3.1.2'
// Retrofit库
compile 'com.squareup.retrofit2:retrofit:2.0.2'
}
- 第二步、添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
第三步、 创建一个实体类:
{ "name" : "Ravi Tamada", "email" : "ravi8x@gmail.com", "phone" : { "home" : "08947 000000", "mobile" : "9999999999" } }
根据这条json数据,创建ResultBean这个实体类,里面还有一个Phone的实体省略了
public class ResultBean {
String name;
String email ;
Phone phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Phone getPhone() {
return phone;
}
public void setPhone(Phone phone) {
this.phone = phone;
}
}
第四步、创建接口
刚刚说Retrofit 是OKhttp的管家,那么它是通过什么来管理的呢?是通过接口(自己定义),Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数。比如有这么一个请求https://api.androidhive.info/volley/person_object.json写成接口的方式,我写的接口只有一个getName的请求方法,采用的是get请求:
public interface APi {
@GET("volley/{fileName}")
Call<ResultBean> getName(@Path("fileName") String fileName);
}
代码解释:
ResultBean:实体类
getName:方法名
@GET是个什么玩意呢?这个Retrofit的注解,表明这个请求方法采用GET请求,(HTTP请求有8种GET/POST/DELETE/HEAD/PUT/OPTION。。我们最常用的就是GET和POST)。
@Path:这个又是什么呢? 他是对请求参数的注解。先撇开这个不谈,我们来谈一下Retrofit 的地址
举个例子:https://www.baidu.com/android/android?name=wang&age=3,我们将这个url分为三个部分
BaseUrl : https://www.baidu.com/(记住在Retrofit的BaseUrl后面要以/结尾)
GET:android/android
参数部分:?name=wang&age=3
根据这条地址我们可以把接口写成
@GET("android/android")
Call<实体类> 方法名(@Query("name") String name,@Query("age") int age);
当然还有一个BaseUrl,这个是我们创建Retrofit时设置的,在下面的代码中可以见到。Retrofitde的url=baseurl+get+参数
此时根据我们的代码,就可以生成自动https://www.baidu.com/android/android?name=wang&age=3这条请求啦,这也是为什么我在上面写明Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数。
可能有些人会有疑问,为什么之前使用的是@path,现在使用的是@Query呢?这是根据参数类型的不同而使用不同的注解。我们来看最先的那条URL:https://api.androidhive.info/volley/person_object.json ,在这条url中我得get部分写的是volley/{filename},之所以这样写是因为这里的filename是可以根据用户的需要而改变,就拿这个例子来说如果我对filename指定值为android.json,那么这条url会变成https://api.androidhive.info/volley/android.json
这两个的用法区别就是?=@path 、{}=@Query,我们知道URL的请求参数有多种,其实这些注解也就是一个配套使用,根据不同的请求参数使用不同的注解,下面我列举了Retrofit的参数注解和请求方法注解
Retrofit注解
- 请求方法
注解代码 | 请求格式 |
---|---|
@GET | GET请求 |
@POST | POST请求 |
@DELETE | DELETE请求 |
@HEAD | HEAD请求 |
@OPTIONS | OPTIONS请求 |
@PATCH | PATCH请求 |
- 请求参数
注解代码 | 说明 |
---|---|
@Headers | 添加请求头 |
@Path | 替换路径 |
@Query | 替代参数值,通常是结合get请求的 |
@FormUrlEncoded | 用表单数据提交 |
@Field | 替换参数值,是结合post请求的 |
第五步:创建Retrofit对象
retrofit = new Retrofit.Builder()
.baseUrl("https://api.androidhive.info/")
.addConverterFactory(GsonConverterFactory.create())
.build();
baseurl:不解释
addconverterFactoty:(数据解析器)得到一条json数据以后,解析成我们想要的数据,常用的方法是Gson,Retrofit支持多种解析方法
- 使用时需要在Gradle添加依赖
数据解析器 | Gradle依赖 |
---|---|
Gson | com.squareup.retrofit2:converter-gson:2.0.2 |
Jackson | com.squareup.retrofit2:converter-jackson:2.0.2 |
Simple XML | com.squareup.retrofit2:converter-simplexml:2.0.2 |
Protobuf | com.squareup.retrofit2:converter-protobuf:2.0.2 |
Moshi | com.squareup.retrofit2:converter-moshi:2.0.2 |
Wire | com.squareup.retrofit2:converter-wire:2.0.2 |
Scalars | com.squareup.retrofit2:converter-scalars:2.0.2 |
第六步、创建网络请求接口实例
//创建接口实例(自己定义的那个接口)
APi aPi = retrofit.create(APi.class);
//对请求参数进行分封装
Call<ResultBean> resultBeanCall = aPi.getName("person_object.json");
第七步、发送同步异步请求
//异步请求
resultBeanCall.enqueue(new Callback<ResultBean>() {
@Override
public void onResponse(Call<ResultBean> call, Response<ResultBean> response) {//请求成功回调此方法
ResultBean resultBean =response.body();//对数据进行解析
Log.e("TAG",resultBean.getName());
}
@Override
public void onFailure(Call<ResultBean> call, Throwable t) {
//失败回调此方法
}
});
// 发送网络请求(同步) 和异步相差不大
Response<Reception> response = resultBeanCall.execute();
// 对返回数据进行处理 response.body().show();
好了~~,文章讲到这里,至少能够基本使用了,剩下的在补充