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. publicclass RetrofitAPIManager {  
  7. publicstaticfinal String SERVER_URL = "url";  
  8. publicstatic ClientAPI provideClientApi() {  
  9.         Retrofit retrofit = new Retrofit.Builder()  
  10.                 .baseUrl(SERVER_URL)  
  11.                 .client(genericClient())  
  12.                 .build();  
  13. return retrofit.create(ClientAPI.class);  
  14.     }  
  15. publicstatic OkHttpClient genericClient() {  
  16.         OkHttpClient httpClient = new OkHttpClient.Builder()  
  17.                 .addInterceptor(new Interceptor() {  
  18. @Override
  19. public Response intercept(Chain chain) throws IOException {  
  20.                         Request request = chain.request()  
  21.                                 .newBuilder()  
  22.                                 .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")  
  23.                                 .addHeader("Accept-Encoding", "gzip, deflate")  
  24.                                 .addHeader("Connection", "keep-alive")  
  25.                                 .addHeader("Accept", "/")  
  26.                                 .addHeader("Cookie", "add cookies here")  
  27.                                 .build();  
  28. return chain.proceed(request);  
  29.                     }  
  30.                 })  
  31.                 .build();  
  32. return httpClient;  
  33.     }  
  34. }  

使用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)")


原网址: 访问
创建于: 2021-12-23 19:24:25
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论