You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:39:54