Android 網(wǎng)路請(qǐng)求框架
一秩仆、RetrofitService 詳細(xì)方法
1.retrofit注解
- 方法注解:@GET业汰、@POST、@PUT饿这、@DELETE浊伙、@PATH、@HEAD长捧、@OPTIONS嚣鄙、@HTTP。
- 標(biāo)記注解:@FormUrlEncoded串结、@Multipart拗慨、@Streaming廓八。
- 參數(shù)注解:@Query,@QueryMap、@Body赵抢、@Field剧蹂、@FieldMap、@Part烦却、@PartMap宠叼。
- 其他注解:@Path、@Header其爵、@Headers冒冬、@Url。
2.方法的編寫
-
@Path:URL占位符摩渺,用于替換和動(dòng)態(tài)更新,相應(yīng)的參數(shù)必須使用相同的字符串被@Path進(jìn)行注釋
@GET("group/{id}/users") Call<List<ResponseBody>> groupList(@Path("id") int groupId);
@GET("group/{id}/users") id為占位符
@Path URL占位符
請(qǐng)求地址等同于http://baseurl/group/groupId/users
-
@Query,@QueryMap:查詢參數(shù)简烤,用于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 查詢參數(shù)
@QueryMap 查詢參數(shù) 可以約定是否需要encode -
@Path:URL占位符,用于替換和動(dòng)態(tài)更新,相應(yīng)的參數(shù)必須使用相同的字符串被@Path進(jìn)行注釋
@GET("group/{id}/users") Call<ResponseBody> groupList(@Path("id") int groupId);
@GET("group/{id}/users") id為占位符
@Path URL占位符
請(qǐng)求地址等同于http://baseurl/group/groupId/users
-
@Body:POST請(qǐng)求體摇幻,將實(shí)例對(duì)象根據(jù)轉(zhuǎn)換方式轉(zhuǎn)換為對(duì)應(yīng)的json字符串參數(shù)横侦,這個(gè)轉(zhuǎn)化方式是GsonConverterFactory定義的。
@POST("add") Call<ResponseBody> addUser(@Body ResBOperatorBean user);
@Body POST請(qǐng)求體
-
@Field绰姻,@FieldMap:Post方式傳遞簡單的鍵值對(duì),需要添加@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方式傳遞簡單的鍵值對(duì)
@FieldMap 鍵值對(duì)集合 -
@Part,@PartMap:用于POST文件上傳狂芋,其中@Part MultipartBody.Part代表文件榨馁,@Part(“key”) RequestBody代表參數(shù)
。需要添加@Multipart表示支持文件上傳的表單帜矾,Content-Type: multipart/form-data@Multipart @POST("upload") Call<ResponseBody> upload(@Part("description") RequestBody description, @Part MultipartBody.Part file);
@Multipart 支持文件上傳的表單
@Part 用于POST文件上傳
@PartMap/** 上傳參數(shù)建立 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處理翼虫,不能被互相覆蓋,用于修飾參數(shù)屡萤。動(dòng)態(tài)設(shè)置Header值
@GET("user") Call<ResponseBody> getUser(@Header("Authorization") String authorization); // 等同于靜態(tài)設(shè)置Header值 @Headers("Authorization: authorization")//這里authorization就是上面方法里傳進(jìn)來變量的值 @GET("widget/list") Call<ResponseBody> getUser();
@Header 修飾header
-
@Headers 用于修飾方法,用于設(shè)置多個(gè)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 請(qǐng)求方法珍剑,不區(qū)分大小寫
path 請(qǐng)求路徑
hasBody 是否有請(qǐng)求體 -
@Url:使用全路徑復(fù)寫baseUrl,適用于非統(tǒng)一baseUrl的場景灭衷。
@GET Call<ResponseBody> v3(@Url String url);
@GET GET請(qǐng)求
@Url 使用全路徑復(fù)寫baseUrl -
@Streaming:用于下載大文件
@Streaming @GET Call<ResponseBody> downloadAsync(@Url String fileUrl);
@Streaming 用于下載大文件
/** 接收后寫法 ResponseBody body = response.body(); long fileSize = body.contentLength(); InputStream inputStream = body.byteStream(); */
二次慢、自定義請(qǐng)求返回基類
1.用途說明
可以統(tǒng)一返回參數(shù)(俗稱:數(shù)據(jù)殼)旁涤。如:errorCode翔曲、message、data...
可根據(jù)自身要求進(jìn)行調(diào)整劈愚。
2.代碼
package com.demon.retrofit20.http;
/**
* @author Demon
* @version V1.0
* @Description: 請(qǐng)求返回基類
* @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.用途說明
用作請(qǐng)求接收的統(tǒng)一處理。如:成功時(shí)執(zhí)行的相應(yīng)操作菌羽、失敗時(shí)的統(tǒng)一處理掠械、異常的統(tǒng)一處理...
可根據(jù)自身要求進(jìn)行調(diào)整。
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) {
// 請(qǐng)求接收成功的統(tǒng)一處理...
/*
if (response.body().code.equals("0")) {
onSuccess(response);
} else {
onFailure(response.body().code);
}
*/
onSuccess(response);
}
@Override
public void onFailure(Call<T> call, Throwable t) {
// 請(qǐng)求接收失敗的統(tǒng)一處理...
/*
if (t instanceof SocketTimeoutException) {
// 網(wǎng)絡(luò)異常
onNetError();
} else if (t instanceof ConnectException) {
// 網(wǎng)絡(luò)異常
onNetError();
} else if (t instanceof RuntimeException) {
// 系統(tǒng)異常
onSysError();
}
*/
onFailure(t.getMessage());
}
/**
* 請(qǐng)求成功
* @param response Response
*/
public abstract void onSuccess(Response<T> response);
/**
* 請(qǐng)求失敗
* @param message 錯(cuò)誤消息
*/
public abstract void onFailure(String message);
}
四、出坑解決方案
1.亂碼解決方式
String name = URLEncoder.encode("111","UTF-8");
五猾蒂、未探索內(nèi)容
1.自定義Converter
2.緩存策略
3.與RxJava 結(jié)合
2016/10/19 1:04:11
代碼地址