在构建网络层时会遇到一个问题就是要手动配置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. 感觉没睡好就..-shenmedoumeixie....

    hi 昨晚没睡好,虽然梦很香,但睡不好没精神做科研啊... 1.jQuery 十二.实现聊天室创建 12.1 基本功能 登陆: 无刷新实时交流: 支持表情. 12.2 大致效果 登陆——>验证, ...

  2. java变量的初始化

    public class Init { private int age;//非静态初始化语句<3> private static String name; //静态初始化语句,先初始化静态 ...

  3. [Flash 3D] 又是一个难题解决了。(Flash3D在android中运行)

    做了一些away3D(4.1.6)+Flash cc,项目比较大,面数多达2000万个,发现电脑还有跑20多帧,可见away3d表现确实相当不错.想把这些东西放到手机上来看,却发现总是白屏,网上搜索了 ...

  4. 网页动物园2.0发布,经过几个月的努力,采用JAVA编写!

    网页动物园2.0发布,经过几个月的努力,采用JAVA编写! 网页动物园2.0 正式发布!游戏发布 游戏名称: 网页动物园插件 游戏来源: 原创插件 适用版本: Discuz! X1.5 - X3.5 ...

  5. Java面向对象编程之异常处理机制

    一:Java的异常处理机制的优点: 1:把各种不同情况的异常情况分类,使用JAVA类来表示异常情况,这种类被称为异常类.把各种异常情况表示成异常类,可以充分的发挥类的可扩展性和可重用性. 2:异常流程 ...

  6. Linux系统资源使用情况

    概述: 用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O ...

  7. Javascript异步编程的4种方法

    你可能知道,Javascript语言的执行环境是"单线程"(single thread).   所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必 ...

  8. GNU Trove trove4j

    GNU Trove (http://trove4j.sourceforge.net/) 是一个Java 集合类库.在某些场景下,Trove集合类库提供了更好的性能,而且内存使用更少.以下是Trove中 ...

  9. [转]spring 注入静态变量

    原文: http://www.cnblogs.com/xing901022/p/4168124.html 今天碰到一个问题,我的一个工具类提供了几种静态方法,静态方法需要另外一个类的实例提供处理,因此 ...

  10. datahub

    https://help.aliyun.com/document_detail/27854.html