Retrofit 2.0
Retrofit是SQUARE美国一家移动支付公司最近新发布的在Android平台上http访问的开源项目
一、Retrofit是什么
github官方描述:A type-safe HTTP client for Android and Java
直译一下:一款为Android和Java提供的类型-安全的HTTP客户端。
总的来说,它是用来封装网络请求的。
它采用接口注释的方式来调用网络请求,不用写实现层(已封装好)。
二、Retrofit怎么使用
1.添加依赖
//Retrofit Type-safe HTTP client for Android and Java
compile 'com.squareup.retrofit2:retrofit:2.2.0'
//转换器
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.squareup.retrofit2:converter-jackson:2.2.0'
下面两个依赖是Json和Java对象之间的转化器 你可以不添加
用基础的HttpURLConnection自己写过网络请求的同学肯定被这样的问题困扰:需要自己解析Json(实现Json和对象之间的转化),而Retrofit支持各种Json转化器:
-
Gson: com.squareup.retrofit2:converter-gson
-
Jackson: com.squareup.retrofit2:converter-jackson
-
Moshi: com.squareup.retrofit2:converter-moshi
-
Protobuf: com.squareup.retrofit2:converter-protobuf
-
Wire: com.squareup.retrofit2:converter-wire
-
Simple XML: com.squareup.retrofit2:converter-simplexml
-
Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
2.初始化
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("XXX你的访问URLXXX")
.addConverterFactory(GsonConverterFactory.create())
.build();
3.编写API
假设我要用userDevice 和 schoolId 去查询年级名和Id
public interface APIManager {
@POST("XXX/XXX你的访问具体接口的路径XXX")
Call<AjaxMsg> getGradeNameAndId(@Query("userDevice") String userDevice, @Query("schoolId") Integer schoolId);
}
其中AjaxMsg是和接口返回数据对应的对象
@Query("name")来设定body的parameters(参数)
-
如果想用表单 @FieldMap
@FormUrlEncoded
@POST("/url")
Call<T> postForm(
@FieldMap Map<String , Object> maps);
-
如果直接用对象 @Body
@POST("url")
Call<T> PostBody(
@Body Objects objects);
-
如果直接多参数 @QueryMap
@PUT("/url")
Call<T> queryMap(
@QueryMap Map<String, String> maps);
-
如果上传文件 @Part
@Multipart
@POST("/url")
Call<ResponseBody> uploadFlie(
@Part("description") RequestBody description,
@Part("files") MultipartBody.Part file);
-
如果多文件上传 @PartMap()
@Multipart
@POST("{url}")
Call<T> uploadFiles(
@Path("url") String url,
@PartMap() Map<String, RequestBody> maps);
4.调用API
Call<AjaxMsg> call = apiService.getGradeNameAndId("inf",1);
call.enqueue(new Callback<AjaxMsg>() {
@Override
public void onResponse(Call<AjaxMsg> call, Response<AjaxMsg> response) {
if(response.isSuccessful()){
Log.d("httpResult","isSuccessful");
AjaxMsg grade = response.body();
Log.d("httpResult",grade.getGradeName());
}
else{
Log.d("httpResult","isNotSuccessful");
}
}
@Override
public void onFailure(Call<AjaxMsg> call, Throwable t) {
}
});
Retrofit内部用了Json转换器自动将Json转换为Java对象
response.body()返回的就是这个对象