美文网首页
Retrofit 2.1 笔(详细)

Retrofit 2.1 笔(详细)

作者: Demon鑫 | 来源:发表于2016-10-19 01:11 被阅读0次

    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
    代码地址

    相关文章

      网友评论

          本文标题:Retrofit 2.1 笔(详细)

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