为何打印HttpURLConnection请求属性时Authorization属性在某方式中缺失?
问题解答
你遇到的问题核心在于方法用途和调用时机的错误:
方法功能混淆
getHeaderFields()的作用是获取服务器返回的响应头,而非你设置的请求头;而getRequestProperties()才是专门用来获取你通过setRequestProperty()配置的请求头的方法。调用时机错误
你在调用hpcon.connect()、甚至还没发送请求体的时候就调用了getHeaderFields(),此时请求还未发送给服务器,服务器没有返回任何响应,这个方法返回的Map几乎是空的,自然看不到Authorization属性。
只有在hpcon.connect()执行完成、服务器返回响应后,调用getHeaderFields()才能拿到有效的响应头数据,但即便如此,响应头里也不会包含你发送的Authorization请求头(除非服务器特意把这个头带回响应)。
你的代码中,前一种和第三种使用getRequestProperties()的循环能正常打印Authorization,而第二种用getHeaderFields()的循环看不到,就是这个原因。
调整打印时机后的代码参考
URL url = new URL("api-url"); HttpURLConnection hpcon = (HttpURLConnection)url.openConnection(); byte[] authBytes = grantprovider.getBytes(StandardCharsets.UTF_8); String grant_encoded = Base64.getEncoder().encodeToString(authBytes); hpcon.setRequestProperty("Authorization", "Basic " + grant_encoded); hpcon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); hpcon.setRequestMethod("POST"); hpcon.setDoInput(true); hpcon.setDoOutput(true); hpcon.setUseCaches(false); // 打印请求头(正确方式) Map<String, java.util.List<String>> map = hpcon.getRequestProperties(); for (Map.Entry<String, java.util.List<String>> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " ,Value : " + entry.getValue()); } String postData = "grant_type=client_credentials"; try(OutputStream os = hpcon.getOutputStream()) { byte[] input = postData.getBytes("utf-8"); os.write(input, 0, input.length); } // 发送请求并获取响应后,再打印响应头 hpcon.connect(); Map<String, java.util.List<String>> hdrs = hpcon.getHeaderFields(); Set<String> hdrKeys = hdrs.keySet(); for (String k : hdrKeys) { System.out.println("Property Key: " + k + " - Property Value: " + hdrs.get(k)); } // 再次打印请求头(验证) for (Map.Entry<String, java.util.List<String>> entries : hpcon.getRequestProperties().entrySet()) { String values = ""; for (String value : entries.getValue()) { values += value + ","; } System.out.println("Request - " + entries.getKey() + " - " + values ); }
内容的提问来源于stack exchange,提问作者stefano errani
相关产品推荐
相关产品推荐

