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

Java HttpURLConnection调用JIRA XRAY Rest API返回400错误

XRAY JIRA Rest API 调用返回400错误修复方案

核心问题定位

你的代码存在两处直接导致异常的问题:

  1. 认证请求头拼写错误:代码中写的请求头键为Autherization,正确的HTTP基础认证头键应为Authorization(中间字母为o而非e),服务端无法识别该错误头时,会直接返回400响应,而非预期的401未授权响应。这也是你用Postman、RestAssured能正常调用,原生HttpURLConnection调用失败的最核心原因——这两个工具会自动补全/正确拼写认证头,不会出现手写笔误。
  2. 错误响应流未处理:当HTTP响应码大于等于400时,HttpURLConnection调用getInputStream()会直接抛出IOException,你必须通过getErrorStream()才能读取到服务端返回的具体错误明细(比如JSON结构不合法、字段缺失、权限不足等具体提示),当前写法无法拿到真实报错原因,只会拿到流读取异常。

修复后完整代码

import java.net.HttpURLConnection;
import java.net.URL;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

// 省略类定义
public void callXrayExecutionApi() throws Exception {
    HttpURLConnection con = null;
    InputStreamReader inputStream = null;
    URL jira_API_URL = new URL("https://jira.abc.com/rest/raven/latest/import/execution");

    String encodeCredentials = Base64.getEncoder().encodeToString(
            "kkris:testjira@234".getBytes(StandardCharsets.UTF_8));
    con = (HttpURLConnection) jira_API_URL.openConnection();
    con.setRequestMethod("POST");
    con.setDoOutput(true);
    // 修正认证头拼写
    con.setRequestProperty("Authorization", "Basic " + encodeCredentials);
    con.setRequestProperty("Content-Type", "application/json");
    con.setRequestProperty("X-Atlassian-Token", "nocheck");

    // 写入请求体
    try(OutputStream os = con.getOutputStream()){
        byte[] input = json.toString().getBytes(StandardCharsets.UTF_8);
        os.write(input, 0, input.length);
    }

    int responseCode = con.getResponseCode();
    if (responseCode >= 200 && responseCode < 300) {
        // 正常响应读取普通输入流
        inputStream = new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8);
        // 此处补充你的响应解析逻辑
    } else {
        // 错误响应读取错误流,打印具体报错信息
        try (InputStream errorStream = con.getErrorStream();
             InputStreamReader errorReader = new InputStreamReader(errorStream, StandardCharsets.UTF_8)) {
            // 读取errorReader内容即可拿到XRAY返回的具体错误原因
            char[] buffer = new char[1024];
            StringBuilder errorMsg = new StringBuilder();
            int len;
            while ((len = errorReader.read(buffer)) != -1) {
                errorMsg.append(buffer, 0, len);
            }
            System.out.println("XRAY接口返回错误:" + errorMsg);
        }
        throw new RuntimeException("调用XRAY执行接口失败,响应码:" + responseCode);
    }
}

后续排查指引

如果修正认证头后仍然返回400,对照以下点逐一校验:

  • 对比Postman中成功请求的Body,确认json对象序列化后的字符串完全一致,XRAY测试执行接口对JSON结构校验严格,缺失testExecKey、tests数组、测试执行状态值等必填字段都会触发400
  • 确认请求头不要多余携带Postman自动生成的非必要头,避免触发服务端内容协商异常
  • 确认调用账号拥有目标XRAY项目的测试执行权限,部分低版本XRAY在权限不足时会返回400而非403响应

内容的提问来源于stack exchange,提问作者Devkant Krishnatrey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.12 16:15:51