Android中HttpURLConnection无法设置请求头问题求助
Android 12中HttpURLConnection自定义请求头不生效问题排查
核心问题:你打印的是响应头而非请求头
你当前代码中使用getHeaderFieldKey(i)和getHeaderField(i)获取并打印的是服务器返回的响应头,并非你设置的请求头,这是看不到自定义请求头的直接原因。
正确验证请求头的方式
HttpURLConnection没有遍历所有请求头的API,但可以通过getRequestProperty(String key)逐个获取你设置的请求头:
// 在设置请求头后添加以下代码打印请求头 activity.LogTextToScreen("Content-Type: " + urlConnection.getRequestProperty("Content-Type")); activity.LogTextToScreen("Date: " + urlConnection.getRequestProperty("Date")); activity.LogTextToScreen("Accept: " + urlConnection.getRequestProperty("Accept")); activity.LogTextToScreen("Test-Header: " + urlConnection.getRequestProperty("Test-Header"));
Android 12下的请求头限制与注意事项
- 系统保留头不可自定义:
Date属于系统保留请求头,Android会自动覆盖为标准GMT时间,你设置的"Now"不会生效。 - GET请求的Content-Type无意义:GET请求通常没有请求体,设置空值的
Content-Type会被系统忽略,若需设置该字段请配合POST请求使用。 - 合法的Accept字段值:你设置的
"All"不是标准的Accept值,建议改为"*/*"以匹配所有响应类型。 - 自定义头的有效性:非系统保留的自定义头(如
Test-Header)在Android 12中可以正常发送,若怀疑未发送,需通过抓包工具(如Charles)或服务器端日志确认实际请求内容。
修正后的代码示例
URL url = new URL(urlString); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); // 设置合法的请求头,避开系统保留字段 urlConnection.setRequestProperty("Accept", "*/*"); urlConnection.setRequestProperty("Test-Header", "Where"); // 打印请求头 activity.LogTextToScreen("Request: " + urlConnection.getRequestMethod()); activity.LogTextToScreen("Accept: " + urlConnection.getRequestProperty("Accept")); activity.LogTextToScreen("Test-Header: " + urlConnection.getRequestProperty("Test-Header")); // 发起请求(必须调用该类方法,请求才会实际发送) InputStream inputStream = urlConnection.getInputStream(); // 打印响应头(此时获取的才是服务器返回的内容) for (int i = 0; ; i++) { String key = urlConnection.getHeaderFieldKey(i); String value = urlConnection.getHeaderField(i); if (key == null && value == null) break; activity.LogTextToScreen(key + "=" + value); }
内容的提问来源于stack exchange,提问作者Tom Jacobs
相关产品推荐
相关产品推荐

