Retrofit是针对于Android/Java的、基于okHttp的、一种轻量级且安全的、并使用注解方式的网络请求框架。
Retrofit它有哪些好处和优势呢
Retrofit使用注解方式简化了我们的URL拼写形式,而且注解含义一目了然,使用起来也非常简单,支持同步和异步执行,使得请求变得异常简单,只要调用enqueue/execute即可.
这里先说一下Retrofit中的注解,其中HTTP注解有五个,用来修饰请求方法:
@GET @POST @PUT @DELETE @HEAD
这五个注解正好涵盖了数据的增删改查方法,每一个请求方法都必须要由这五个注解中的一个修饰。
这里我们就主要说一说最常用的@GET @POST的用法
假设我们请URL为:http://ip.taobao.com/service/getIpInfo.php?ip=202.202.32.202
使用方法呢我们首先要定义一个接口
public interface MyService1 {
//?参数为?前面的到 /(斜杠)之间的值
@GET("getIpInfo.php")
//Get中的注解用@Query
Call<IP> getIP(@Query("ip") String ip);
/*********************************************************************************/
@FormUrlEncoded
@POST("getIpInfo.php")
//Post中的注解一定要用@Field不能用@Query
Call<IP> postIP(@Field("ip") String ip);
}
上面代码中分别定义了GET和POST两种请求类型,可以看出定义的方法基本是相同的。但是,我们会发现括号中的注解不相同。那么括号中的注解是干什么的呢,简单点说其实就是前面的注解和后面的参数其实就相当于Key和Value,结合上面的URL地址可以看出,注解中的内容为ip这正是我们地址上参数的Key。而后面的String ip就是我们要填写的Value.
还有就是括号中的两种注解是分别用在两种不同的请求上的,@GET对应的是@Query,@POST对应的是@Fiele。千万不能用混了!千万不能用混了!千万不能用混了!说三遍。
那么我们的接口定义完了,现在要开始实例化retrofit,配置好请求地址和解析方式
//实例化retrofit,配置好请求地址和解析方式
Retrofit retrofit = new Retrofit.Builder()
//★Retrofit2 的baseUlr 必须以 /(斜线) 结束,不然会抛出一个IllegalArgumentException
.baseUrl("http://ip.taobao.com/service/")
.addConverterFactory(GsonConverterFactory.create())//设置将json解析为javabean所用的方式
.build();
//通过retrofit创建第一步定义的接口的实例,
//供在外部直接通过该实例调用该接口的getIPad方法,完成网络请求
MyService1 mservice = retrofit.create(MyService1.class);
//调用getIP(或者postIP)方法得到Call
// final Call<IP> call = taobaoIPService.getIP("202.202.32.202");
final Call<IP> call = mservice.postIP("202.202.32.202");
上面的注释写的很详细了,这里就不多说了,这里有一个概念就是最后的到的call是什么。
Call是Retrofit中重要的一个概念,代表被封装成单个请求/响应的交互行为,我的理解就是通过它的方法把你的接口转换成了Http请求。然后我们可以调用它的execute和enqueue方法分别发送同步和异步请求
下面是开始异步请求
// call.enqueue开启异步网络请求
call.enqueue(new Callback<IP>() {
@Override
//请求成功
public void onResponse(Response<IP> response, Retrofit retrofit) {
IP body = response.body();
String result = body.getData().getRegion();
Log.e("TAG",result);
// 3.可以直接更改UI,因为onResponse方法已经在UI线程中
tv.setText(result);
// 4.取消请求
call.cancel();
}
@Override
//请求失败
public void onFailure(Throwable throwable) {
Log.e("TAG",throwable.toString());
tv.setText(throwable.toString());
throwable.printStackTrace();
}
});
这里面就很好理解了,调用enqueue方法开启异步网络请求,里面要的参数是Callback<T>类型,那我们就实例化一个Callback<T> ,然后从写里面的两个方法,这里可以看出来可以直接修改UI说明是在主线程中执行的方法。
这就是Retrofit2的基本用法。