在构建网络层时会遇到一个问题就是要手动配置Http请求的Headers,写入缓存Cookie,自定义的User-Agent等参数,但是对于有几十个接口的网络层,我才不想用注解配置Headers,目前网上很多文章的方法真对这两个版本都不是很适用,有的给出的方法已经被删除,有的方法会报出异常
:(

方法一:

在翻阅官方API文档整理后的方法如下:

1.  import okhttp3.Interceptor;

2.  import okhttp3.OkHttpClient;

3.  import okhttp3.Request;

4.  import okhttp3.Response;

5.  import retrofit2.Retrofit;

6.

7.  public class RetrofitAPIManager {

8.

9.      public static final String SERVER_URL = "url";

10.

11.     public static ClientAPI provideClientApi() {

12.         Retrofit retrofit = new Retrofit.Builder()

13.                 .baseUrl(SERVER_URL)

14.                 .client(genericClient())

15.                 .build();

16.         return retrofit.create(ClientAPI.class);

17.     }

18.

19.

20.     public static OkHttpClient genericClient() {

21.         OkHttpClient httpClient = new OkHttpClient.Builder()

22.                 .addInterceptor(new Interceptor() {

23.                     @Override

24.                     public Response intercept(Chain chain) throws IOException {

25.                         Request request = chain.request()

26.                                 .newBuilder()

27.                                 .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")

28.                                 .addHeader("Accept-Encoding", "gzip, deflate")

29.                                 .addHeader("Connection", "keep-alive")

30.                                 .addHeader("Accept", "*/*")

31.                                 .addHeader("Cookie", "add cookies here")

32.                                 .build();

33.                         return chain.proceed(request);

34.                     }

35.

36.                 })

37.                 .build();

38.

39.         return httpClient;

40.     }

41. }

使用Interceptor来拦截并重新设置请求头,测试可用

  • List<Interceptor>  interceptors()方法,返回的是一个不可编辑的列表,如果对其进行编辑会报出UnSupportedOperationException
  • Interceptor的典型使用场景,就是对request和response的Headers进行编辑

方法二.、

OkHttpClient okHttpClient = new OkHttpClient.Builder()

                .cookieJar(new CookieJar() {

                    private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();

                    @Override

                    public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {

                        cookieStore.put(httpUrl, list);

                    }

                    @Override

                    public List<Cookie> loadForRequest(HttpUrl httpUrl) {

                        List<Cookie> cookies = cookieStore.get(httpUrl);

                        return cookies != null ? cookies : new ArrayList<Cookie>();

                    }

                }).build();

方法三、

Request request = new Request.Builder()

                .url(PATH)

                .post(body)

                //取出本地保存的sessionId

                .addHeader("Cookie", "sessionId")

                .build();

        Call call = mOkHttpClient.newCall(request);

        call.enqueue(new Callback() {

            @Override

            public void onFailure(Call call, IOException e) {

            }

            @Override

            public void onResponse(Call call, Response response) throws IOException {

               if (response.isSuccessful()){

                   Headers headers = response.headers();

                   List<String> cookies = headers.values("Set-Cookie");

                   Log.d(TAG, "onResponse: "+cookies.size());

                   for (String str:cookies){

                       if (str.startsWith("PHPSESSID")){

                           //将sessionId保存到本地

                           Log.d(TAG, "onResponse: "+str.split(";")[0]);

                       }

                   }

               }

            }

        });

Retrofit2 + OkHttp3设置Http请求头(Headers)方法汇总的更多相关文章

  1. js 中ajax请求时设置 http请求头中的x-requestd-with= ajax

    今天发现 AngularJS 框架的$http服务提供的$http.get() /$http.post()的ajax请求中没有带 x-requested-with字段. 这样的话,后端的php 就无法 ...

  2. 接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头

    目录 https请求 代理设置 请求头设置 获取状态码 接收响应头 https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, H ...

  3. selenium.Phantomjs设置浏览器请求头

    from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCap ...

  4. php设置http请求头信息和响应头信息

    php设置http请求头信息和响应头信息 设置请求服务器的头信息可以用fsockopen,curl组件,header函数只能用来设置客户端响应的头信息,不能设置服务器的头信息. 例子;  一.head ...

  5. Ajax设置自定义请求头的两种方法

    用自定义请求头token为例 方法一 $.ajax({ type: "post", url:"http://127.0.0.1:4564/bsky-app/templat ...

  6. angular学习笔记(二十四)-$http(2)-设置http请求头

    1. angular默认的请求头: 其中,Accept 和 X-Requested-With是$http自带的默认配置 Accept:application/json,text/plain       ...

  7. postman关联 (含获取请求头的方法)

    在Tests里面输入脚本 var jsonData = JSON.parse(responseBody);postman.setEnvironmentVariable("message&qu ...

  8. SpringBoot整合Swagger框架 ,并设置接口请求头token默认值

      引入maven依赖 <!-- swagger2--> <dependency> <groupId>io.springfox</groupId> &l ...

  9. $.ajax应用之请求头headers

    昨天项目中,由于要请求token验证,后台给出的方案是采用请求头返回token数据,给出的API文档是这样的 由于之前一直都是采用请求体发送请求,服务器在应答体李返回数据.和这个不一样: 采用jq的$ ...

随机推荐

  1. 【一周读书】All life is problem solving

    书籍:<开放的智力> 采铜是我在知乎关注最早的大V之一,那时我脑里有一大堆疑惑和问题,是他的答案帮助我理清了思绪.我从他身上学习到对书籍的爱好,对思维方法的关注,对智慧的向往.读这本小集子 ...

  2. 网格弹簧质点系统模拟(Spring-Mass System by Euler Integration)

    弹簧质点模型是利用牛顿运动定律来模拟物体变形的方法.如下图所示,该模型是一个由m×n个虚拟质点组成的网格,质点之间用无质量的.自然长度不为零的弹簧连接.其连接关系有以下三种: 1.连接质点[i, j] ...

  3. 把web项目部署到tomocat上

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 常识 1 War包 2 Tomcat服务器 配置Java运行环境 1 下载并安装JDK 2 设置JDK环境变量 3 验证是否JD ...

  4. ajax之jsonp跨域请求

    前端ajax请求代码 后台php处理代码

  5. rpc使用举例

    #server.py from SimpleXMLRPCServer import SimpleXMLRPCServer def add(x,y): return x+y server=SimpleX ...

  6. JS中将JSON的字符串解析成JSON数据格式《转》

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...

  7. js函数命名常用动词

    get 获取/set 设置, add 增加/remove 删除 create 创建/destory 移除 start 启动/stop 停止 open 打开/close 关闭, read 读取/writ ...

  8. Anterior and posterior commissures

    Source: https://en.wikipedia.org/wiki/Posterior_commissure Figrues archive.

  9. maven buid 导出项目依赖的jar包问题

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.8:copy-dependencie ...

  10. zabbix常用术语

    zabbix常用术语