Retrofit2 + OkHttp3设置Http请求的Headers的方法汇总

Retrofit2 +
OkHttp3设置Http请求的Headers
的方法汇总:

在构建网络层时会遇到一个问题就是要手动配置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]);
                       }
                   }

}
            }
        });

来自为知笔记(Wiz)

时间: 2024-10-13 17:32:59

Retrofit2 + OkHttp3设置Http请求的Headers的方法汇总的相关文章

Retrofit2 + OkHttp3设置Http请求头(Headers)方法汇总

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

Android Retrofit2&amp;OkHttp3添加统一的请求头Header

在使用Retrofit时,有时候需要设置Set-Cookie等请求头,如果每一个url都需要,那么直接来个拦截器就好了. 官方说明: OkHttp3下OkHttpClient的 List< Interceptor> interceptors()方法,返回的是一个不可编辑的列表,如果对其进行编辑会报出UnSupportedOperationException Interceptor的典型使用场景,就是对request和response的Headers进行编辑 如下图所示: 注意Header头,不

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

今天发现 AngularJS 框架的$http服务提供的$http.get() /$http.post()的ajax请求中没有带 x-requested-with字段. 这样的话,后端的php 就无法判断 接受的http请求是否是 ajax请求了. 怎么办呢,显然就是给http 请求头中 加上这个字段就可以了. 1.AngularJS 中可以这样子: I don't know well MVC3 but you can set a custom header for all request fr

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

1. angular默认的请求头: 其中,Accept 和 X-Requested-With是$http自带的默认配置 2. 修改默认请求头: (1) 全局修改(整个模块) 使用$httpProvider依赖 var myApp = angular.module('MyApp',[]); myApp.config(function($httpProvider){ console.log($httpProvider.defaults.headers.common) //修改/操作$httpProv

selenium.Phantomjs设置浏览器请求头

from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities #设置浏览器请求头 dcap = dict(DesiredCapabilities.PHANTOMJS) dcap["phantomjs.page.settings.userAgent"] =( "Mozilla/5.0 (Linux; Android 5.1

ios开发网络学习六:设置队列请求与RunLoop

#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self newThreadDelegate2]; } -(void

android 设置网络请求超时

UI界面更新必须在ui线程中 不能在ruanable线程中操作ui 可以发送消息利用handler来更新ui    private void load() {        LoadDate load = new LoadDate();        load.execute("http://h.hiphotos.baidu.com/image/w%3D310/sign=1bc9c0da38292df597c3aa148c305ce2/c83d70cf3bc79f3d77fbe1c5b8a1cd

微信小程序设置全局请求URL 封装wx.request请求

app.js: App({ //设置全局请求URL globalData:{ URL: 'https://www.oyhdo.com', }, /** * 封装wx.request请求 * method: 请求方式 * url: 请求地址 * data: 要传递的参数 * callback: 请求成功回调函数 * errFun: 请求失败回调函数 **/ wxRequest(method, url, data, callback, errFun) { wx.request({ url: url,

接口测试基础知识详解http请求由三部分组成,分别是:请求行、消息报头、请求正文 1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF 其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了

HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:http://host[":"port][abs_path]http表示要通过HTTP协议来定位网络资源:host表示合法的Internet主机域名或者IP地址:port指定一个端口号,为空则使用缺省端口80:abs_path指定请求资源的URI:如果URL中没有给出abs_path,那么当它作为请求URI时,必须以"/"的形式给出,通常这个工作浏览器自动帮我们完成.e