一、简介
Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求,其源码OkHttp Github。在解析源码前先了解retrofit如何使用吧。
二、Retrofit的使用
配置:
- 添加Retrofit依赖: compile 'com.squareup.retrofit2:retrofit:2.0.2'
- 添加数据解析依赖:compile 'com.squareup.retrofit2:converter-gson:2.0.2'
使用步骤:
- 创建JsonBean(可以用工具生成)
-
把Http Api 转化为 java interface
/**
* 对应Http接口的Java Interface类
*/
public interface HttpApi {
@GET("videoHome")
Call<HomeResponse> getData();
//GET请求方式,请求Url
@GET("home")
Call<HomeResponse> getHomeData();
/*GET 有参数请求:
1、可以在url后面直接进行参数拼接,比如 @GET("home?key=value&key2=value2")
2、可以用@Query进行参数设置,可以有多个
3、可以用@QueryMap进行参数设置用Map集合进行参数
*/
@GET("home")
Call<HomeReponse> getHomeData(@Query("key1") String value1, @Query("key2") String value2);
@GET("home")
Call<HomeResponse> getHomeData(@QueryMap Map<String, String> params);
/*POST 有参数请求:
1、可以用@Field进行参数设置,可以有多个
2、可以用@FieldMap进行参数设置用Map集合进行参数
3、@FormUrlEncoded注解不可少
*/
@FormUrlEncoded
@POST("search")
Call<HomeResponse> search(
@Field("keyword") String keyword,
@Field("page") String page,
@Field("pageNum") String pageNum,
@Field("orderby") String orderby
);
@FormUrlEncoded
@POST("search")
Call<HomeResponse> search(
@FieldMap Map<String, String> params
);
}
3.创建Retrofit对象, 并发起请求.示例代码:
//3.1创建Retrofit实例,进行接口实现
retrofit = new Retrofit
.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
//3.2 实例化接口类
HomeApi homeApi = retrofit.create(HomeApi.class);
//3.3 调用接口的方法得到Call
Call<HomeResponse> homeResponseCall = homeApi.getHomeData();
//3.4 执行数据的请求操作,可以用同步或者是异步的操作
//3.4.1 同步操作,耗时操作需要在线程中执行
/*try {
Response<HomeResponse> homeResponseResponse = homeResponseCall.execute();
HomeResponse homeResponse = homeResponseResponse.body();
} catch (IOException e) {
e.printStackTrace();
}*/
//3.4.2 异步的操作,与okhttp的异步执行不同的是,可以在回掉的方法中进行UI的控制操作
homeResponseCall.enqueue(new Callback<HomeResponse>() {
@Override
public void onResponse(Call<HomeResponse> call, Response<HomeResponse> response) {
HomeResponse homeResponse = response.body();
textView.setText(homeResponse.toString());
textView.setTextColor(Color.GREEN);
}
@Override
public void onFailure(Call<HomeResponse> call, Throwable t) {
textView.setText(t.getMessage());
textView.setTextColor(Color.RED);
}
});
常用注解:
请求方法:@GET / @POST / @PUT / @DELETE / @HEAD
URL处理
1、拼接注意,建议baseUrl用“/”结尾,接口中url不用"/"开头
例子:baseUrl=http://10.0.2.2:8080/market/ url=home
错误案例
案例一:
baseUrl=http://10.0.2.2:8080/market url=home
--->http://10.0.2.2:8080/home
分析:默认用最后一个斜线去拼接
案例二:
baseUrl=http://10.0.2.2:8080/market url=/home
--->http://10.0.2.2:8080/home
分析:url中开始的斜线代表主机地址http://10.0.2.2:8080
2、注解:
@Path - 替换参数
@GET("{path1}/{path2}")//注意:如果路径用“/”分割,就需要使用多个参数表示
public Call<ResponseData> groupList(@Path("path1") String path1,@Path("path2") String path2);
@Query - 添加查询参数,在GET请求中使用
@GET("home")
Call<HomeResponse> getHomeData(@Query("key1") String value1, @Query("key2") String value2);
@QueryMap - 如果有多个查询参数,把它们放在Map中,在GET请求中使用
@GET("home")
Call<HomeResponse> getHomeData(@QueryMap Map<String, String> params);
@FormUrlEncoded 编码控制 与Post请求结合使用,不能缺少。
@FormUrlEncoded
@POST("search")
Call<SearchResponse> search(
@Field("keyword") String keyword,
@Field("page") String page,
@Field("pageNum") String pageNum,
@Field("orderby") String orderby
);
@FormUrlEncoded
@POST("search")
Call<SearchResponse> search(<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px;">@FieldMap Map<String, String> params
@FieldMap Map<String, String> params
);
本章retrofit的基本用法就介绍到这里,总的来说retrofit使用起来还是很方便的,而且可以一步到位,直接拿到解析的javabean,省去了我们拿json字符串
去解析的工作,下章重点根据retrofit.enque方法这条访问网络的主线去解析retrofit的底层源码。因为第一次写,写的可能不是不太好,但还是希望能帮
到没有使用过但想了解retrofit的朋友,有错误的和表达不准确的地方还请大家多多留言指正。