OkHttp Get请求添加HttpHeader及调试验证方法咨询
OkHttp GET请求添加请求头及调试验证指南
我来帮你梳理一下OkHttp添加请求头的正确方式,以及怎么确认请求头是否真的发送到了服务器,完全从Java代码层面给你讲清楚~
一、正确添加请求头的两种常用方式
1. 单个请求直接添加
如果只是给某一个请求单独加请求头,直接在Request.Builder里调用addHeader()就可以了,简单直接:
// 构建带请求头的Request Request request = new Request.Builder() .url("你的目标请求URL") .addHeader("Header", "123") // 直接在这里添加请求头 .build(); // 创建OkHttpClient实例 OkHttpClient okHttpClient = new OkHttpClient(); // 发起异步请求 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 建议加上失败日志,方便排查问题 e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { // 处理成功响应 String responseContent = response.body().string(); System.out.println("响应内容:" + responseContent); } else { System.out.println("请求失败,状态码:" + response.code()); } } });
2. 全局拦截器统一添加
如果你的App里多个请求都需要加相同的请求头,用Interceptor(拦截器)会更高效,你的代码其实已经用对了这个思路,我给你优化一下细节:
// 构建带拦截器的OkHttpClient OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { // 获取原始请求 Request originalRequest = chain.request(); // 基于原始请求构建新请求,添加请求头 Request newRequest = originalRequest.newBuilder() .addHeader("Header", "123") .build(); // 继续执行修改后的请求 return chain.proceed(newRequest); } }) .build(); // 创建基础Request(不需要单独加头,拦截器会自动处理) Request request = new Request.Builder() .url("你的目标请求URL") .build(); // 发起异步请求 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { System.out.println("请求成功"); } } });
这种方式下,所有通过这个okHttpClient发起的请求,都会自动带上你添加的Header: 123,非常适合全局统一配置的场景。
二、调试确认请求头已发送到服务器
1. 用OkHttp官方日志拦截器打印请求详情
这是最方便的调试方式,OkHttp提供了HttpLoggingInterceptor,可以打印完整的请求和响应日志,包括请求头。
首先添加依赖(Gradle项目):
implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
然后修改OkHttpClient的构建代码,添加日志拦截器:
// 创建日志拦截器,设置日志打印级别 HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(message -> { // 把日志输出到控制台 System.out.println("OkHttp 日志:" + message); }); // 设置为BODY级别,会打印请求头、请求体、响应头等所有细节 loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) // 先加日志拦截器,确保能看到修改后的请求 .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Request newRequest = originalRequest.newBuilder() .addHeader("Header", "123") .build(); return chain.proceed(newRequest); } }) .build();
运行代码后,你会在控制台看到类似这样的日志片段,里面就能找到你添加的请求头:
OkHttp 日志:--> GET 你的请求URL HTTP/1.1 OkHttp 日志:Header: 123 OkHttp 日志:--> END GET
2. 在自定义拦截器里手动打印请求头
如果你不想加额外依赖,也可以直接在自己的拦截器里打印请求头信息:
@Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Request newRequest = originalRequest.newBuilder() .addHeader("Header", "123") .build(); // 遍历打印所有请求头 Headers headers = newRequest.headers(); for (int i = 0; i < headers.size(); i++) { String headerName = headers.name(i); String headerValue = headers.value(i); System.out.println("请求头[" + i + "]:" + headerName + " = " + headerValue); } return chain.proceed(newRequest); }
这样就能直接在控制台看到所有要发送的请求头,确认Header:123存在即可。
3. 用抓包工具验证(最准确)
如果要100%确认请求头确实发送到了服务器,可以用Charles、Fiddler这类抓包工具:
- 配置好手机或模拟器的代理,指向抓包工具的地址
- 启动抓包工具后发起请求
- 在工具的请求列表里找到你的请求,查看请求头部分,就能看到是否包含你添加的
Header:123
这种方式能直接看到服务器收到的真实请求报文,是最准确的验证方式。
小提示
你的代码里onFailure方法是空的,建议加上e.printStackTrace(),这样请求失败时能快速看到异常原因,方便排查问题~
内容的提问来源于stack exchange,提问作者SO 80
相关产品推荐
相关产品推荐

