压缩包:

InterceptorUnitTest.java

一、拦截器

  1. 1.OkHttpClient okHttpClient = **new **OkHttpClient.Builder().addInterceptor(**new **XXX).build();<br /> 2.OkHttpClient okHttpClient = **new **OkHttpClient.Builder().addNetwordInterceptor(**new **XXX).build();

注意:这两个方法添加拦截器的区别就是在于addInterceptor一定在前面执行,addNetworkInterceptor一定在后面执行。

image.png

二、拦截器的整体代码

1.InterceptorUnitTest类文件代码

  1. package com.example.networkdemo;
  2. import android.util.Log;
  3. import org.jetbrains.annotations.NotNull;
  4. import org.junit.Test;
  5. import java.io.IOException;
  6. import okhttp3.Call;
  7. import okhttp3.Interceptor;
  8. import okhttp3.OkHttpClient;
  9. import okhttp3.Request;
  10. import okhttp3.Response;
  11. public class InterceptorUnitTest {
  12. @Test
  13. public void interceptorTest() {
  14. OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
  15. @NotNull
  16. @Override
  17. public Response intercept(@NotNull Chain chain) throws IOException {
  18. // 前置处理
  19. Request request = chain.request().newBuilder().addHeader("os", "android")
  20. .addHeader("version", "1.0").build();
  21. Response response = chain.proceed(request);
  22. // 后置处理
  23. return response;
  24. }
  25. }).addNetworkInterceptor(new Interceptor() {
  26. @NotNull
  27. @Override
  28. public Response intercept(@NotNull Chain chain) throws IOException {
  29. System.out.println(chain.request().header("version"));
  30. return chain.proceed(chain.request());
  31. }
  32. }).build();
  33. // 请求对象
  34. Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
  35. // 准备好请求的Call对象
  36. Call call = okHttpClient.newCall(request);
  37. try {
  38. // 请求得到的响应
  39. Response response = call.execute();
  40. System.out.println(response.body().string());
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. }

三、缓存与Cookie

OkHttp按照Http协议规则实现了缓存的处理,缓存时比如:当我们发起第一次请求之后,如果后续还需要进行同样的请求,此时如果符合缓存规则,则可以减少与服务器的网络通信,直接从本地文件缓存中读取响应返回给请求者。但是默认情况下,OkHttp的缓存时关闭状态,需要我们开启。

image.png
Cookie是某些网站为了辨别用户身份,进行会话跟踪(比如确定登陆状态)而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

四、缓存的整体代码

1.InterceptorUnitTest类文件代码

  1. package com.example.networkdemo;
  2. import android.util.Log;
  3. import org.jetbrains.annotations.NotNull;
  4. import org.junit.Test;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import okhttp3.Cache;
  8. import okhttp3.Call;
  9. import okhttp3.Interceptor;
  10. import okhttp3.OkHttpClient;
  11. import okhttp3.Request;
  12. import okhttp3.Response;
  13. public class InterceptorUnitTest {
  14. @Test
  15. public void interceptorTest() {
  16. // pathname:缓存文件地址
  17. // maxSize:环迅最大容量字节
  18. OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(new Cache(new File
  19. ("C:\\Users\\ASUS\\Desktop"),1024*1024)).addInterceptor(new Interceptor() {
  20. @NotNull
  21. @Override
  22. public Response intercept(@NotNull Chain chain) throws IOException {
  23. // 前置处理
  24. Request request = chain.request().newBuilder().addHeader("os", "android")
  25. .addHeader("version", "1.0").build();
  26. Response response = chain.proceed(request);
  27. // 后置处理
  28. return response;
  29. }
  30. }).addNetworkInterceptor(new Interceptor() {
  31. @NotNull
  32. @Override
  33. public Response intercept(@NotNull Chain chain) throws IOException {
  34. System.out.println(chain.request().header("version"));
  35. return chain.proceed(chain.request());
  36. }
  37. }).build();
  38. // 请求对象
  39. Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
  40. // 准备好请求的Call对象
  41. Call call = okHttpClient.newCall(request);
  42. try {
  43. // 请求得到的响应
  44. Response response = call.execute();
  45. System.out.println(response.body().string());
  46. } catch (IOException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }