Retrofit是什么
对于Retrofit ,官方的描述是:“A type-safe REST client for Android and Java.”它可以通过注解来描述Http请求,URL参数,查询参数,同时,它还支持多个请求体和文件上传
Retrofit 2默认情况下利用okhttp为网络层
Retrofit用法示例
官网示例
- 1 定义java接口
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
该接口定义了一个 listRepos方法,该方法会通过HTTP GET请求去访问服务器的/users/{user}/repos路径并把返回的结果封装为List<Repo>Java对象返回。其中URL路径中的{user}的值为listRepos方法中的参数 user的取值。
- 2 通过 RestAdapter类来生成一个 GitHubService 接口的实现;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
GitHubService service = retrofit.create(GitHubService.class);
- 3 获取接口的实现后就可以调用接口函数来和服务器交互
Call<List<Repo>> repos = service.listRepos("octocat");
从上面的示例可以看出, Retrofit 使用注解来声明HTTP请求
- 支持 URL 参数替换和查询参数
- 返回结果转换为Java对象(返回结果可以为JSON, protocol buffers)
- 支持 Multipart请求和文件上传
一般使用
首先定义接口
public interface ApiCallBiz {
@GET("data/Android/{number}/{page}")
Call<List<AndroidInfoBean>> getAndroidInfo(@Path("number") int number, @Path("page") int page);
}
getAndroidInfo( )方法通过注解@GET
标注为get请求,完整的url根据创建retrofit对象时传入的baseUrl
+@GET
的所填写的value
组成,value
的完整值会根据调用接口是传入的参数补充完整,例如data/Android/10/1
创建 retrofit
对象完成请求服务器
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://gank.io/api/")
.addConverterFactory(GsonConverterFactory.create())//gson解析
.build();
ApiCallBiz mApiCallBiz =retrofit.create(ApiCallBiz.class);
Call<List<AndroidInfoBean>> call = mApiCallBiz.getAndroidInfo1(10,1);
call.enqueue(new Callback<List<AndroidInfoBean>>() {
@Override
public void onResponse(Call<List<AndroidInfoBean>> call,Response<List<AndroidInfoBean>> response) {
Log.e("TAG",response.body().toString());
}
@Override
public void onFailure(Call<List<AndroidInfoBean>> call, Throwable t) {
}
});
构造者模式构建了baseurl
及ConverterFactory
,通过GsonConverterFactory完成对服务器返回的json数据进行对象的转换
注意:.addConverterFactory(GsonConverterFactory.create())
这里如果使用gson,需要额外导入
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
上述示例展示了使用@Path
可实现动态url的访问,retrofit还支持
- 查询参数的设置
@Query
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
对于复杂的查询参数的组合可以使用一个Map。
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
-
@POST
请求体@Body
@POST("users/new")
Call<User> createUser(@Body User user);
- 表单的方式传递键值对
@FormUrlEncoded
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
- 单文件上传
@Multipart
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
- 多文件上传
@PartMap
@Multipart @POST("register")
Call<User> registerUser(@PartMap Map<String, RequestBody> params, @Part("description") RequestBody description);}