Java 8纯代码带Bearer Token的POST请求返回401问题求助
Java 8纯HTTP请求401错误排查
问题描述
必须使用Java 8完成开发,流程为:先向中间件网关发送POST请求获取accessToken,再携带该token调用服务端点的POST接口。已设置必要请求头,但服务返回401错误,具体错误信息:
{"error": "invalid_grant", "error_description": "token not found, expired or invalid", .....}
以下是我的请求代码,已设置Authorization头携带Bearer token,请问还有遗漏的地方吗?
private static void sendPOST(){ String jsonStr = getPostDataJson(); InputStream stream = null; BufferedReader reader = null; HttpURLConnection conn = null; if(accessToken != null && accessToken.length()>0) { try { URL url = new URL(SERVICE_URL); conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestProperty("Authorization", "Bearer " + accessToken); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Content-Length", String.valueOf(jsonStr.length())); conn.setRequestMethod("POST"); conn.setUseCaches(false); conn.connect(); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(jsonStr); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); System.out.println("Status Code :" + responseCode); if (responseCode == HttpURLConnection.HTTP_OK) { // success stream = conn.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(stream)); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); } else { System.out.println("Post request encountered error." + responseCode); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); }finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
排查建议
1. 先确认accessToken本身的有效性
- 打印获取到的accessToken,检查是否存在多余空格、换行符等格式问题,这些会导致
Bearer拼接后格式无效。 - 用Postman或curl直接调用服务端点,手动填入该token测试。如果同样返回401,说明token本身有问题,需排查认证环节:
- 检查认证请求的参数(如client_id、client_secret、grant_type等)是否符合网关要求;
- 确认token是否拥有访问目标服务端点的权限;
- 验证token的过期时间,是否在调用服务时已失效。
2. 代码细节修正
- 移除手动设置的Content-Length:
jsonStr.length()计算的是字符数,而HTTP的Content-Length要求是字节数(含中文时字符数≠字节数),会导致请求体解析错误。HttpURLConnection会自动计算并设置正确的字节长度,无需手动指定。 - 调整请求方法与请求头的设置顺序:
setRequestMethod("POST")应在设置请求头之前调用,避免请求属性被重置:conn.setRequestMethod("POST"); conn.setRequestProperty("Authorization", "Bearer " + accessToken); conn.setRequestProperty("Content-Type", "application/json"); - 修复资源泄漏问题:finally块中
reader变量未被实际使用,应关闭stream和断开连接:finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } if (conn != null) { conn.disconnect(); } } - 读取错误流获取详细信息:当响应码非200时,读取错误流能拿到更完整的错误提示,帮助定位问题:
} else { System.out.println("Post request encountered error. Code: " + responseCode); BufferedReader errorReader = new BufferedReader(new InputStreamReader(conn.getErrorStream())); String errorLine; StringBuffer errorResponse = new StringBuffer(); while ((errorLine = errorReader.readLine()) != null) { errorResponse.append(errorLine); } errorReader.close(); System.out.println("Error details: " + errorResponse.toString()); }
内容的提问来源于stack exchange,提问作者user1902124
相关产品推荐
相关产品推荐

