AndroidRetrofit 的一些笔记

Posted Sodino

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AndroidRetrofit 的一些笔记相关的知识,希望对你有一定的参考价值。

文章目录
  1. 1. 前言
  2. 2. Header的统一处理
  3. 3. 访问绝对路径
  4. 4. Map的使用避免声明冗余的类
  5. 5. RequestBody为String 及 文件上传
  6. 6. 后台Json空数据规范
  7. 7. 空数据Void声明
  8. 8. ResponseBody为String
  9. 9. ResponseBody的多次读取
  10. 10. 统一的错误处理

Retrofit :A type-safe HTTP client for Android and Java.

retrofit : noun. a component or accessory added to something after it has been manufactured

mocky.io: Mock your HTTP responses to test your REST API


前言

本文默认ConverterFactoryGsonConverterFactory

请求阶段

  • Header的统一处理
  • 访问绝对路径
  • Map的使用避免声明冗余的类
  • RequestBody为String 及 文件上传

返回阶段

  • 后台Json空数据规范
  • 空数据Void声明
  • ResponseBody为String
  • ResponseBody的多次读取
  • 统一的错误处理

Header的统一处理

使用Interceptor可为每一个request添加统一的Header信息

       
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        6
       
       
        7
       
       
        8
       
       
        9
       
       
        10
       
       
        11
       
       
        12
       
       
        13
       
       
        14
       
       
        15
       
       
        16
       
       
        17
       
       
        18
       
       
        19
       
       
        20
       
       
        21
       
       
        22
       
       
        23
       
       
        24
       
       
        25
       
       
        26
       
       
        27
       
       
        28
       
       
        29
       
       
        30
       
       
        31
       
       
        32
       
       
        33
       
       
        34
       
       
        35
       
       
        36
       
       
        37
       
       
        38
       
       
        39
       
       
        40
       
       
        public 
        class OkHttpInterceptor implements okhttp3.Interceptor   
       
           
        @Override  
       
           
        public Response 
        intercept(Chain chain) 
        throws IOException   
       
       
                Request originalRequest = chain.request();  
       
         
       
       
                Request newRequest = originalRequest.newBuilder()  
       
       
                        .header(
        "sdkInt", Integer.toString(Build.VERSION.SDK_INT))  
       
       
                        .header(
        "device", Build.DEVICE)  
       
       
                        .header(
        "user-agent", 
        "android.sodino")  
       
       
                        .header(
        "ticket", Constant.TICKET)  
       
       
                        .header(
        "os", 
        "android")  
       
       
                        .header(
        "version", 
        "2.6")  
       
       
                        .header(
        "Content-Type", 
        "application/json")  
       
       
                        .build();  
       
         
       
       
                Response response = chain.proceed(newRequest);  
       
               
        return response;  
       
       
              
       
       
          
       
         
       
         
       
         
       
         
       
       
        public 
        class RetrofitUtil   
       
         
       
           
        // 定义统一的HttpClient并添加拦截器  
       
           
        private 
        static OkHttpClient okHttpClient = 
        new OkHttpClient.Builder()  
       
       
                                    .addInterceptor(
        new OkHttpInterceptor()).build();  
       
         
       
           
        public 
        static Retrofit 
        getComonRetrofit(String baseUrl)   
       
       
                Retrofit retrofit = 
        new Retrofit.Builder()  
       
       
                        .baseUrl(baseUrl)  
       
       
                        .addConverterFactory(GsonConverterFactory.create())  
       
       
                        .callbackExecutor(ThreadPool.getThreadsExecutor())  
       
       
                        .client(okHttpClient)  
       
       
                        .build();  
       
         
       
               
        return retrofit;  
       
       
              
       
       
        
       

访问绝对路径

  1. @Url
    @URL resolved against the base URL.

这种方式是动态的灵活的,不需要提前预知的。

       
        1
       
       
        2
       
       
        @GET  
       
       
        Call<ResponseBody> list(
        @Url 
        String url);
       
  1. endpoint为绝对路径

这种方式需要在编码时提前预知,与baseUrl的理念是相冲突的,不推荐使用这种方式。


Map的使用避免声明冗余的类

QueryMapQuery支持复杂的、不定数的字段。
对应的Body也可以通过定义参数类型为Map来避免声明冗余的类。

以下代码为了Post/PutBody特别定义了个IsReead类,实现方式有些重!

       
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        6
       
       
        7
       
       
        8
       
       
        9
       
       
        10
       
       
        11
       
       
        12
       
       
        13
       
       
        14
       
       
        15
       
       
        16
       
       
        17
       
       
        18
       
       
        public 
        class IsRead   
       
           
        public 
        boolean is_read;  
       
       
          
       
         
       
         
       
       
        public 
        interface Api  
       
           
        @Post 
        // or @Put  
       
       
            Call<ResponseBody> reqIsRead(
        @Body IsRead isRead);  
       
       
          
       
         
       
         
       
         
       
         
       
       
        // send a post or put request  
       
       
        Api api = createApi();  
       
       
        IsRead isRead = 
        new IsRead();  
       
       
        isRead.is_read = 
        true;  
       
       
        api.reqIsRead(isRead);
       

与如下代码的功能是相同,但更简单明了的:

       
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        6
       
       
        7
       
       
        8
       
       
        9
       
       
        10
       
       
        11
       
       
        12
       
       
        13
       
       
        14
       
       
        15
       
       
        16
       
       
        public interface Api  
       
       
            @Post 
        // or @Put  
       
       
            Call
        <ResponseBody
        > reqIsRead(@Body 
        Map
        <
        String, Boolean
        > 
        map);  
       
       
          
       
         
       
         
       
         
       
         
       
         
       
         
     

以上是关于AndroidRetrofit 的一些笔记的主要内容,如果未能解决你的问题,请参考以下文章

Android Retrofit 2.0 刷新令牌

java 定数について字体

java 定数についてClassWithConstants

Android Retrofit2 Post请求添加Json类型参数笔记

Android Retrofit 源码系列~ 设计模式分析

android Retrofig RxJava写法基于Kotlin在优化

(c)2006-2024 SYSTEM All Rights Reserved IT常识