• 23.2、Android -- OkHttp3 基础学习 自定义设置


    说明

    一个项目中的网络请求肯定不止一个。多个的话就涉及到相同的请求信息,或者相同的信息过滤条件。
    因此,就需要自定义OkHttp3设置。可以通过拦截器、过滤器实现

    测试方法都是在test 测试用例中进行的

    拦截器

    应用拦截器

    使用addInterceptor
    
    • 1
    	new OkHttpClient.Builder().addInterceptor(new Interceptor() {
                //应用拦截器
                @NonNull
                @Override
                public Response intercept(@NonNull Chain chain) throws IOException {
    
                    Request request = chain.request().newBuilder().addHeader("SystemType", "android")
                            .addHeader("version", "20220803.001.123")
                            .build();
                    System.out.println("version2"+chain.request().headers("version"));
                    Response response = chain.proceed(request);
                    return response;
                    //正常返回,不处理
                    //return chain.proceed(chain.request());
                }
            }).build();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    网络拦截器

    使用addNetworkInterceptor

    	new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() {
                        //网络拦截器
                        @NonNull
                        @Override
                        public Response intercept(@NonNull Chain chain) throws IOException {
                            System.out.println("version"+chain.request().headers("version"));
                            Request request = chain.request().newBuilder().addHeader("locDesc", "cwc")
                                    .addHeader("userName", "lianmei")
                                    .build();
                            Response response = chain.proceed(request);
                            return response;
                        }
                    })
                    .build();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    备注
    1、addInterceptor早于addNetworkInterceptor执行
    2、addInterceptor是程序增加的,
    addNetworkInterceptor是网络增加,可以获取addInterceptor的请求信息
    3、addInterceptor不管有误网络都会执行,
    addNetworkInterceptor,有网络是才执行,没有网络时不执行

    过滤器最终代码

    package com.pha.four;
    
    import androidx.annotation.NonNull;
    
    import org.junit.Test;
    
    import java.io.IOException;
    
    import okhttp3.Call;
    import okhttp3.Interceptor;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.Response;
    
    public class OkHttpSetting {
        @Test
        public void InterCeptorTest() {
            OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
                //应用拦截器
                @NonNull
                @Override
                public Response intercept(@NonNull Chain chain) throws IOException {
    
                    Request request = chain.request().newBuilder().addHeader("SystemType", "android")
                            .addHeader("version", "20220803.001.123")
                            .build();
                    System.out.println("version2"+chain.request().headers("version"));
                    Response response = chain.proceed(request);
                    return response;
                    //正常返回,不处理
                    //return chain.proceed(chain.request());
                }
            }).addNetworkInterceptor(new Interceptor() {
                        //网络拦截器
                        @NonNull
                        @Override
                        public Response intercept(@NonNull Chain chain) throws IOException {
                            System.out.println("version"+chain.request().headers("version"));
                            Request request = chain.request().newBuilder().addHeader("locDesc", "cwc")
                                    .addHeader("userName", "lianmei")
                                    .build();
                            Response response = chain.proceed(request);
                            return response;
                        }
                    })
                    .build();
    
            Request request = new Request.Builder().url("http://www.httpbin.org/get?a=2&b=3")
                    .build();
            Call call = okHttpClient.newCall(request);
            Response response = null;
            try {
                response = call.execute();
                System.out.println(response.body().string());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 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
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    缓存和cookie

    缓存

    通过.cache(new Cache(new File(“C:\Users\Cherry”),1024*1024)) 缓存

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .cache(new Cache(new File("C:\\Users\\Cherry"),1024*1024))
                    .build();
    
    • 1
    • 2
    • 3

    cookie

    通过cookieJar(new CookieJar(){})记录到程序内
    通过Map cookieMap = new HashMap<>(); 记录个网站的cookie 。

    package com.pha.four;
    
    import androidx.annotation.NonNull;
    
    import org.junit.Test;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import okhttp3.Call;
    import okhttp3.Cookie;
    import okhttp3.CookieJar;
    import okhttp3.FormBody;
    import okhttp3.HttpUrl;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.Response;
    
    public class OkHttpCookieTest {
        Map<String,List<Cookie>>  cookieMap = new HashMap<>();
        @Test
        public void CookieTest() {
    
            OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
                //记录cookies
                @Override
                public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {
                    cookieMap.put(httpUrl.host() ,list);
                }
    
                @NonNull
                @Override
                public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
                    List<Cookie> cookies = OkHttpCookieTest.this.cookieMap.get(httpUrl.host());
                    return cookies == null ? new ArrayList<>() : cookies;
                }
            }).build();
            FormBody formBody = new FormBody.Builder().add("username","ty082093105")
                    .add("password","123123")
                    .build();
            Request request = new Request.Builder().url("https://www.wanandroid.com/user/login")
                    .post(formBody)
                    .build();
            Call call = okHttpClient.newCall(request);
            try  {
                Response response = call.execute();
                System.out.println(response.body().string());
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
            //使用cookies
            request = new Request.Builder().url("https://www.wanandroid.com/lg/collect/list/0/json")
                    .build();
            call = okHttpClient.newCall(request);
            try  {
                Response response = call.execute();
                System.out.println(response.body().string());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 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
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    记忆点

    1、应用拦截器addInterceptor
    2、网络拦截器addNetworkInterceptor
    3、缓存cache
    4、cookie记录:cookieJar(new CookieJar(){}).build()

  • 相关阅读:
    STC单片机RAM在KEIL编程使用
    推荐系统笔记(十一):使用coo_matrix函数遇到的坑
    嵌入式Linux系统中ARM汇编语言的使用方法
    unity基础3-数据持久化
    使用粒子群优化进化神经网络
    C语言进阶——深度剖析数据在内存中的存储
    人大女王金融硕士项目——不断挑战自己,提升自己就在现在
    Java 反射机制快速入门及常见方法全归纳。
    Java并发编程: Thread常见方法
    信号包络及其提取方法(Matlab)
  • 原文地址:https://blog.csdn.net/u013059089/article/details/126150235