retrofit注解

2021-04-04  本文已影响0人  面向星辰大海的程序员

@GET 表示get请求

@GET("url")//""一般是整个Url的后半部分
fun 方法(): Call<bean类或ResponseBody>

@POST 表示post请求

@POST("url")//""一般是整个Url的后半部分
fun 方法(): Call<bean类或ResponseBody>

@HTTP 比较通用

@HTTP(method = "get", path = "project/tree/json", hasBody = false)
fun 方法(): Call<bean类或ResponseBody>

@Straming 表示响应体的数据以流的方式返回,适用于返回的数据比较大,常用于下载大文件

@Streaming
@GET
fun downloadFile(@Url fileUrl: String): Call<ResponseBody>

@Headers 添加请求头且不会覆盖

@Headers("Cache-Cantrol: max-age=10000")
@GET("")
fun example1(): Call<ResponseBody>

@Header 添加请求头并且会覆盖已有的相同的请求头,必须提供参数,如果参数为null,这个头会被省略,否则会使用参数值的toString方法的返回值

@GET("")
fun example2(@Header("xx") xx: String): Call<ResponseBody>

@Body 表示以json方式请求 多用于post非表单请求

@POST("url")//""一般是整个Url的后半部分
fun 方法(@Body wanAndroidProjectBean: WanAndroidProjectBean): Call<bean类或ResponseBody>

@FormUrlEncoded配合@Field以表单的形式发送Http请求

@FormUrlEncoded 
@POST
fun loggin(
@Field("name") name: String,
@Field("password") password: String,
@Field("array") array: Array<String>,
@FieldMap map: Map<String, String>
): Call<ResponseBody>

@Field @FieldMap配合@FormUrlEncoded以表单的形式发送Http请求

@FormUrlEncoded 
@POST
fun loggin(
@Field("name") name: String,
@Field("password") password: String,
@Field("array") array: Array<String>,
@FieldMap map: Map<String, String>
): Call<ResponseBody>

@Url表示一个url

@GET
fun downloadFile(@Url fileUrl: String): Call<ResponseBody>

@Path

@GET("xxx/{id}/xx")
fun example4(@Path("id") id: Int): Call<ResponseBody>

@Query @QueryMap @QueryName在url后面加?name=xx&page=xx

@GET("xxx")/
fun example5(
@Query("name") name: String,
@QueryMap map: Map<String, String>,
@QueryName() page: Int
): Call<ResponseBody>

@Multipart 表示请求体是一个支持文件上传的Form表单,需要结合@Part使用

@Part 用于表单字段与@Multipart结合使用,支持三种类型:{@link RequestBody}、{@link okhttp3.MultipartBody.Part}、任意类型

@PartMap 用于表单字段与@Multipart结合使用,默认接受的类型是Map<String,RequestBody>,可用于多文件上传

//上传单个文件
val file = File("")
val requestBody = RequestBody.create(MediaType.parse("image/png"),file)
upload(requestBody)
@Multipart
@POST("xx/xx")
fun upload(@Part("file\";filename\";test.png") file: RequestBody): Call<ResponseBody>

@Multipart
@POST("project/upload")
fun upload2(@Part file: MultipartBody.Part): Call<RequestBody>
val file = File("")
val requestBody = RequestBody.create(MediaType.parse("image/png"),file)
val filePart = MultipartBody.Part.createFormData("上传的key",
file.name,requestBody)
val call = wanAndroidApi.upload2(filePart)
call.execute()


//上传多个图片
@Multipart
@POST("project/upload")
fun upload3(@PartMap map: Map<String,RequestBody>): Call<RequestBody>
//图片集合
val files = listOf<File>()
val map = mutableMapOf<String,RequestBody>()
files.forEach() {file ->
val requestBody = RequestBody.create(MediaType.parse("image/png"),file)
map["file\";filename=\"test.png"] = requestBody
}
wanAndroidApi.upload3(map)

@Multipart
@POST("project/upload")
fun upload4(@PartMap map: Map<String,MultipartBody.Part>): Call<RequestBody>
val files = listOf<File>()
val map = mutableMapOf<String,MultipartBody.Part>()
files.forEachIndexed { index, file ->
val requestBody = RequestBody.create(MediaType.parse("image/png"),file)
val part = MultipartBody.Part.createFormData("上传的key${index}",file.name,requestBody)
map["上传的key${index}"] = part
}
wanAndroidApi.upload4(map)
Multipart
上传文件使用: Content-Type:multipart/form-data

///////上传单张图片//////
/**
* Multipart:表示请求实体是一个支持文件上传的Form表单,需要配合使用@Part,适用于有文件 上传的场景
* Part:用于表单字段,Part和PartMap与Multipart注解结合使用,适合文件上传的情况
* PartMap:用于表单字段,默认接受的类型是Map<String,REquestBody>,可用于实现多文件上传
* Part 后面支持三种类型,{@link RequestBody}、{@linkokhttp3.MultipartBody.Part} 、任意类型;
*
* @param file 服务器指定的上传图片的key值
* @return
*/
@Multipart
@POST("project/upload")
Call<ProjectBean> upload1(@Part("file" + "\";filename=\"" + "test.png")RequestBody file);
@Multipart
@POST("project/xxx")
Call<ProjectBean> upload2(@Part MultipartBody.Part file);
////////请求///////////
//上传单个图片1
File file = new File("");
RequestBody requestBody =RequestBody.create(MediaType.parse("image/png"),file);
wanAndroidApi.upload1(requestBody).execute();
//上传单个图片2
MultipartBody.Part imagePart = MultipartBody.Part.createFormData("上传的key",file.getName(),requestBody);
wanAndroidApi.upload2(imagePart).enqueue(new Callback<ProjectBean>() {
@Override
public void onResponse(Call<ProjectBean> call,Response<ProjectBean> response) { }
@Override
public void onFailure(Call<ProjectBean> call, Throwablet) { }
});
///////上传多张图片//////
@Multipart
@POST("project/upload")
Call<ProjectBean> upload3(@PartMap Map<String, RequestBody> map);
@Multipart
@POST("project/xxx")
Call<ProjectBean> upload4(@PartMap Map<String, MultipartBody.Part> map);
////////使用//////////
//上传多张图片1
//图片集合
List<File> files = new ArrayList<>();
Map<String, RequestBody> map = new HashMap<>();
for (int i = 0; i < files.size(); i++) {
RequestBody requestBody =RequestBody.create(MediaType.parse("image/png"), files.get(i));
map.put("file" + i + "\";filename=\"" + files.get(i).getName(),requestBody);
}
wanAndroidApi.upload3(map).execute();
//上传多张图片2
Map<String, MultipartBody.Part> map1 = new HashMap<>();
File file1 = new File("");
RequestBody requestBody1 =RequestBody.create(MediaType.parse("image/png"), file1);
MultipartBody.Part part1 = MultipartBody.Part.createFormData("上传的key1",file1.getName(), requestBody1);
map1.put("上传的key1", part1);
File file2 = new File("");
RequestBody requestBody2 =RequestBody.create(MediaType.parse("image/png"), file2);
MultipartBody.Part part2 = MultipartBody.Part.createFormData("上传的key2",file2.getName(), requestBody2);
map1.put("上传的key2", part2);
wanAndroidApi.upload4(map1).execute();
//////图文混传/////
/**
* @param params
* @param files
* @return
*/
@Multipart
@POST("upload/upload")
Call<ProjectBean> upload5(@FieldMap() Map<String, String> params,@PartMap() Map<String, RequestBody> files);
/**
* Part 后面支持三种类型,{@link RequestBody}、{@linkokhttp3.MultipartBody.Part} 、任意类型;
*
* @param userName
* @param passWord
* @param file
* @return
*/
@Multipart
@POST("project/xxx")
Call<ProjectBean> upload6(@Part("username") RequestBody userName,@Part("password") RequestBody passWord,@Part MultipartBody.Part file);
//////使用///////
MediaType textType = MediaType.parse("text/plain");
RequestBody name = RequestBody.create(textType, "zero");
RequestBody password = RequestBody.create(textType, "123456");
File file = new File("");
RequestBody requestBody =RequestBody.create(MediaType.parse("image/png"), file);
MultipartBody.Part part = MultipartBody.Part.createFormData("上传的key", file.getName(), requestBody);
wanAndroidApi.upload6(name, password, part).enqueue(new Callback<ProjectBean>() {
@Override
public void onResponse(Call<ProjectBean> call,Response<ProjectBean> response) {
}
@Override
public void onFailure(Call<ProjectBean> call,Throwable t) {
}
});

Streaming
未使用该注解,默认会把数据全部载入内存,之后通过流获取数据也是读取内存中数据,所以返回数据
较大时,需要使用该注解
/**
* 12.Streaming注解:表示响应体的数据用流的方式返回,适用于返回的数据比较大,该注解在
在下载大文件的特别有用
*/
@Streaming
@GET
Call<ProjectBean> downloadFile(@Url String fileUrl);
上一篇下一篇

猜你喜欢

热点阅读