美文网首页
retrofit注解

retrofit注解

作者: 面向星辰大海的程序员 | 来源:发表于2021-04-04 17:27 被阅读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);
    

    相关文章

      网友评论

          本文标题:retrofit注解

          本文链接:https://www.haomeiwen.com/subject/dvackltx.html