哈喽大家好,今天给大家介绍一款非常牛逼的对网络请求框架封装的一个框架,
它的名字呢就是我们的标题retrofit,出品子square,哇大佬级别的出品,在早期做
开发的时候retrofit、okhttp、picasso我们最常用的组合,因为他们都是square公司
出品的,想想都激动,合计绝技哟,咳咳回归正题retrofit
1.retrofit是使用注解和动态代理的形式封装而成的,用于网络请求的框架.
2.使用动态代理模式哟,很强,底层是okHttp的封装,这样就使我们的网络请求非常的灵活。
工作原理
下面就是重要的环节代码:
第一步导入依赖,支持gson解析
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
第二步,创建Bean
第三步创建接口
retrofit里面的注解,我就和请求的方法一起介绍了,显得简单
get请求
首先我们需要一个接口里面写注解,和请求的方法
这个里面@GET()方法体中的方法是对我们字符串的拼接,一般都是把公司的域名给提出去,这里就把我们的网址变得非常灵活
Call 请求方法的类型
getInstance(@Query(“key”) String key,@Query(“num”) String page);获取参数的方法
这里面就用到了一个@Query注解,这个注解主要就是对我们网址后面的参数进行拼接如:?num=10&page=1;
@GET("nba/")
Call<NetWorkBean> getInstance(@Query("key") String key,@Query("num") String page);
第四步:网络请求开始
//创建retrofit.Builder对象
Retrofit retrofit = new Retrofit.Builder()
//支持gson解析
.addConverterFactory(GsonConverterFactory.create())
//拼接请求头Constants.BASE_URL = “http://api.tianapi.com/”
.baseUrl(Constants.BASE_URL)
.build();
//实例化接口实例
MyServiceInterface myServiceInterface = retrofit.create(MyServiceInterface.class);
//调用接口中的方法,并传入参数
Call<NetWorkBean> instance = myServiceInterface.getInstance("71e58b5b2f930eaf1f937407acde08fe","10");
//支持异步
instance.enqueue(new Callback<NetWorkBean>() {
@Override//成功
public void onResponse(Call<NetWorkBean> call, Response<NetWorkBean> response) {
//判断是否请求成功
if(response != null && response.isSuccessful()){
//获取集合
List<NetWorkBean.NewslistBean> newslist = response.body().getNewslist();
//设置数据
mAdapter.setData(newslist);
}else{
//请求失败失败
}
}
@Override//请求错误
public void onFailure(Call<NetWorkBean> call, Throwable t) {
}
});
如果参数多的话我们就可以吧@Query换成@QueryMap了,作用就是把参数编程一个集合中存入
@GET("cook/query")
Call<ResponBean> getResponBean(@QueryMap Map<String,String> map);
请求网络的代码
//创建map集合
Map<String, String> map = new HashMap<>();
map.put("key","91c73d6bce9656b27ad1e6db09b2ecad");
map.put("menu","西红柿");
map.put("rn","10");
map.put("pn",page+"");
//创建Retrofit.Builder对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constants.BASE_URL_TEXT)
.addConverterFactory(GsonConverterFactory.create())
.build();
//创建接口实例对象
MyServiceInterface myServiceInterface = retrofit.create(MyServiceInterface.class);
//获取方法
Call<ResponBean> responBean = myServiceInterface.getResponBean(map);
//异步请求
responBean.enqueue(new Callback<ResponBean>() {
@Override
public void onResponse(Call<ResponBean> call, Response<ResponBean> response) {
//判断是否请求成功
if(response != null && response.isSuccessful()){
//获取集合
List<ResponBean.ResultBean.DataBean> data = response.body().getResult().getData();
//设置数据
if(page == 0){
mAdapter.setData(data);
}else{
mAdapter.addData(data);
}
loadConpleted();
}else{
//请求失败失败
}
}
@Override
public void onFailure(Call<ResponBean> call, Throwable t) {
}
});
下面介绍一个Post请求
@FormUrlEncoded 主要的功能就是防止乱码,也是我们post要加的一个参数
@FieldMap相当于上面说的@QueryMap,区别就在于前者用在post请求,后者用get请求
当然有@FieldMap就有@Field用法和@Query相同
//get请求
@FormUrlEncoded
@POST("cook/query")
Call<ResponBean> getPostRespon(@FieldMap Map<String,String> map);
代码
//创建map集合
Map<String, String> map = new HashMap<>();
map.put("key","91c73d6bce9656b27ad1e6db09b2ecad");
map.put("menu","西红柿");
map.put("rn","10");
map.put("pn",page+"");
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(Constants.BASE_URL_TEXT)
.build();
MyServiceInterface myServiceInterface = retrofit.create(MyServiceInterface.class);
Call<ResponBean> postRespon = myServiceInterface.getPostRespon(map);
postRespon.enqueue(new Callback<ResponBean>() {
@Override
public void onResponse(Call<ResponBean> call, Response<ResponBean> response) {
//判断是否请求成功
if(response != null && response.isSuccessful()){
//获取集合
List<ResponBean.ResultBean.DataBean> data = response.body().getResult().getData();
//设置数据
if(page == 0){
mAdapter.setData(data);
}else{
mAdapter.addData(data);
}
loadConpleted();
}else{
//请求失败失败
}
}
@Override
public void onFailure(Call<ResponBean> call, Throwable t) {
}
});
这里说明一下,这要先写这些常用的网络请求方法,没必要先了解结构和参数,我们会用了之后,他的其他参数都会水到聚成的,所以不要着急,慢慢来,