在构建网络层时会遇到一个问题就是要手动配置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. 理解 Linux 网络栈(1):Linux 网络协议栈简单总结

    本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...

  2. Docker on Microsoft Azure

    Docker蓬勃发展,如日中天.微软自然也不甘落后,且不说即将发布的.支持Docker技术的Windows Nano Server和Windows Server 2016.我们来看看在Microsof ...

  3. as3的操作符重载

    Array.prototype.valueOf = function ():Number{       var sum:Number = 0;       for each (var v:* in t ...

  4. 嵌入式Linux驱动学习之路(八)创建最小的根文件系统

    busybox 在配置busybox,在是否选择要静态链接库时,在静态下,busybox中的工具不需要动态链接库,能够直接运行.而用户自己编写的程序如果需要动态链接库,还是依然需要有. 如果是动态链接 ...

  5. 嵌入式Linux驱动学习之路(六)u-boot启动内核

    内核启动是需要必要的启动参数.不能开机自动完全从0开始启动,需要uboot帮助内核实现重定位并提供参数. 首先,uboo会从Kernel分区中读取bootcmd环境变量,根据环境变量可自动启动. 分区 ...

  6. jmeter-HTTP COOKIE Manager

    http://wangsheng14591.blog.163.com/blog/static/327797102012829101351887/

  7. Volley(二)—— 基本Request对象 & RequestQueue&请求取消

    详细解读Volley(一)—— 基本Request对象 & RequestQueue&请求取消 Volley它非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作, ...

  8. python-day02数据类型-字符串和列表的操作

    while循环: while True: 条件语句....... 关于break和continue,break:跳出当前的循环                               contnu ...

  9. DataTable详解,以及dataview

    原文地址:http://www.cnblogs.com/moss_tan_jun/archive/2010/09/20/1832131.html 得到DataTable 得到DataTable有许多方 ...

  10. Java的jar文件安装成windows 服务

    Java的jar文件安装成windows 服务: 1.下载:nssm,复制到jar文件目录下 2. jar文件目录下创建bat文件[run.bat],内容为[java -jar 文件名.jar] 3. ...