在构建网络层时会遇到一个问题就是要手动配置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. Windows 10 Threshold 2 升级记录

    昨天(11月17日)升级到Windows 10 Threshold 2版本.我的使用的设备是Surface Pro 3,4G内存,128G硬盘. Threshold 2是作为一个Windows系统更新 ...

  2. jquery back to top 页面底部的返回顶部按钮

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. ajax小结

    1. http是一种无状态协议 2. http请求:四部分组成 ① http 请求的方法或动作,如:GET / POST ② 正在请求的URL,总得知道请求的地址是什么 ③ 请求头,包含一些客户端环境 ...

  4. LED应用照明产品常识关键点

    一.基本关注点 1.  寿命LIFE(影响灯具寿命主要因素:热管理.工作温度.工作电压.电源.LED结温) 2.  色彩COLOR(新的LED材料以及改进的生产工艺使得高亮度LED可以生产覆盖整个可见 ...

  5. vijos 1512

    SuperBrother打鼹鼠 背景 SuperBrother在机房里闲着没事干(再对比一下他的NOIP,真是讽刺啊......),于是便无聊地开始玩“打鼹鼠”...... 描述 在这个“打鼹鼠”的游 ...

  6. javascript里面foreach遍历函数介绍,以及跟jquery里面each的区别

    foreach是把数组从头到尾遍历一遍,有三个参数分别是:数组元素,数组索引,数组本身.如果是一个参数,就是数组元素. var data=[1,2,3,4,5,6]; var sum=0; data. ...

  7. 在移动端如何选择字体大小和布局的单位,px或dp?

    android开发中,文字大小的单位是sp,非文字的尺寸单位用dp,但是我们在设计稿用的单位是px.这些单位如何换算,是设计师.开发者需要了解的关键. 简单理解的话,px(像素)是我们UI设计师在PS ...

  8. 实现鼠标拖动canvas绘制的图片

    不啰嗦上代码: <html> <head> <meta http-equiv="Content-Type" content="text/ht ...

  9. C语言:void指针

    使用前必须进行强制类型转换 #include <stdio.h> void test(const void *p); int main(){ ; int *p = &i; puts ...

  10. SpringMVC的Controller中使用线程安全的初始化

    因为SpringMVC的Controller默认是单例, 在这种情况下, Controller中使用的私有变量必须也是单例, 例如各种service, 否则会有多线程访问数据互相修改的问题. 对于需要 ...