Android 网路请求框架
一、RetrofitService 详细方法
1.retrofit注解
- 方法注解:@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、@HTTP。
- 标记注解:@FormUrlEncoded、@Multipart、@Streaming。
- 参数注解:@Query,@QueryMap、@Body、@Field、@FieldMap、@Part、@PartMap。
- 其他注解:@Path、@Header、@Headers、@Url。
2.方法的编写
-
@Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符串被@Path进行注释
@GET("group/{id}/users") Call<List<ResponseBody>> groupList(@Path("id") int groupId);
@GET("group/{id}/users") id为占位符
@Path URL占位符
请求地址等同于http://baseurl/group/groupId/users
-
@Query,@QueryMap:查询参数,用于GET查询,需要注意的是@QueryMap可以约定是否需要encode
@GET("group/users") Call<ResponseBody> groupListT(@Query("id") int groupId);
地址等同于:
http://baseurl/group/users?id=groupId
@GET("group/users") Call<ResponseBody> getNews(@QueryMap(encoded = true) Map<String, String> options);
@Query 查询参数
@QueryMap 查询参数 可以约定是否需要encode -
@Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符串被@Path进行注释
@GET("group/{id}/users") Call<ResponseBody> groupList(@Path("id") int groupId);
@GET("group/{id}/users") id为占位符
@Path URL占位符
请求地址等同于http://baseurl/group/groupId/users
-
@Body:POST请求体,将实例对象根据转换方式转换为对应的json字符串参数,这个转化方式是GsonConverterFactory定义的。
@POST("add") Call<ResponseBody> addUser(@Body ResBOperatorBean user);
@Body POST请求体
-
@Field,@FieldMap:Post方式传递简单的键值对,需要添加@FormUrlEncoded表示表单提交。Content-Type:application/x-www-form-urlencoded
@FormUrlEncoded @POST("user/edit") Call<ResponseBody> updateUser(@Field("fn") String first, @Field("ln") String last);
@FormUrlEncoded 表单提交
@Field Post方式传递简单的键值对
@FieldMap 键值对集合 -
@Part,@PartMap:用于POST文件上传,其中@Part MultipartBody.Part代表文件,@Part(“key”) RequestBody代表参数
。需要添加@Multipart表示支持文件上传的表单,Content-Type: multipart/form-data@Multipart @POST("upload") Call<ResponseBody> upload(@Part("description") RequestBody description, @Part MultipartBody.Part file);
@Multipart 支持文件上传的表单
@Part 用于POST文件上传
@PartMap/** 上传参数建立 File file = new File(""); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Part body = MultipartBody.Part.createFormData("picture", file.getName(), requestFile); String descriptionString = "hello, this is description speaking"; RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString); */
-
@Header:header处理,不能被互相覆盖,用于修饰参数。动态设置Header值
@GET("user") Call<ResponseBody> getUser(@Header("Authorization") String authorization); // 等同于静态设置Header值 @Headers("Authorization: authorization")//这里authorization就是上面方法里传进来变量的值 @GET("widget/list") Call<ResponseBody> getUser();
@Header 修饰header
-
@Headers 用于修饰方法,用于设置多个Header值
@Headers({ "Accept: application/vnd.github.v3.full+json", "User-Agent: Retrofit-Sample-App" }) @GET("users/{username}") Call<ResponseBody> getUserT(@Path("username") String username);
@Headers 修饰header
-
@HTTP:可以替代其他方法的任意一种
@HTTP(method = "get", path = "users/{user}", hasBody = false) Call<ResponseBody> getFirstBlog(@Path("user") String user);
method 请求方法,不区分大小写
path 请求路径
hasBody 是否有请求体 -
@Url:使用全路径复写baseUrl,适用于非统一baseUrl的场景。
@GET Call<ResponseBody> v3(@Url String url);
@GET GET请求
@Url 使用全路径复写baseUrl -
@Streaming:用于下载大文件
@Streaming @GET Call<ResponseBody> downloadAsync(@Url String fileUrl);
@Streaming 用于下载大文件
/** 接收后写法 ResponseBody body = response.body(); long fileSize = body.contentLength(); InputStream inputStream = body.byteStream(); */
二、自定义请求返回基类
1.用途说明
可以统一返回参数(俗称:数据壳)。如:errorCode、message、data...
可根据自身要求进行调整。
2.代码
package com.demon.retrofit20.http;
/**
* @author Demon
* @version V1.0
* @Description: 请求返回基类
* @date 2016年10月18日16:17:35
*/
public class BaseCallBean<T> {
public boolean success;
public String code;
public T data;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
三、自定义CallBack
1.用途说明
用作请求接收的统一处理。如:成功时执行的相应操作、失败时的统一处理、异常的统一处理...
可根据自身要求进行调整。
2.代码
package com.demon.retrofit20.http;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* @author Demon
* @version V1.0
* @Description: 自定义CallBack
* @date 2016年10月18日16:19:25
*/
public abstract class CusCallback<T extends BaseCallBean> implements Callback<T> {
@Override
public void onResponse(Call<T> call, Response<T> response) {
// 请求接收成功的统一处理...
/*
if (response.body().code.equals("0")) {
onSuccess(response);
} else {
onFailure(response.body().code);
}
*/
onSuccess(response);
}
@Override
public void onFailure(Call<T> call, Throwable t) {
// 请求接收失败的统一处理...
/*
if (t instanceof SocketTimeoutException) {
// 网络异常
onNetError();
} else if (t instanceof ConnectException) {
// 网络异常
onNetError();
} else if (t instanceof RuntimeException) {
// 系统异常
onSysError();
}
*/
onFailure(t.getMessage());
}
/**
* 请求成功
* @param response Response
*/
public abstract void onSuccess(Response<T> response);
/**
* 请求失败
* @param message 错误消息
*/
public abstract void onFailure(String message);
}
四、出坑解决方案
1.乱码解决方式
String name = URLEncoder.encode("111","UTF-8");
五、未探索内容
1.自定义Converter
2.缓存策略
3.与RxJava 结合
2016/10/19 1:04:11
代码地址