使用Java HttpClient调用JIRA REST API遇连接拒绝错误求助
排查Java调用JIRA REST API时的Connection Refused问题
嘿,我来帮你搞定这个连接拒绝的报错!java.net.ConnectException: Connection refused: connect本质上是你的程序没法和目标JIRA服务器建立连接,咱们从网络和代码两方面一步步排查:
一、先确认网络层面的可达性
这是最常见的原因,先排除环境问题:
- 手动用浏览器访问
https://jira.mycomp.com/rest/api/latest/issue,看看能不能打开。如果打不开,要么是JIRA服务器挂了,要么是你的机器被公司防火墙/内网规则挡住了,或者需要走代理才能访问。 - 也可以用
curl命令测试:curl -u uname:pwd https://jira.mycomp.com/rest/api/latest/issue,看有没有正常响应。
二、检查代码里的问题
你的代码片段有几个可以优化和补全的地方,可能会影响连接:
1. 替换不推荐的BASE64编码器
你用的sun.misc.BASE64Encoder是JDK内部的非公开API,高版本JDK可能会禁用它,建议换成标准的java.util.Base64:
import java.util.Base64; import java.nio.charset.StandardCharsets; // ... String userpassword = "uname" + ":" + "pwd"; String encodedAuthorization = Base64.getEncoder().encodeToString(userpassword.getBytes(StandardCharsets.UTF_8));
2. 补全HTTP请求的必要配置
你的代码没写完,记得要设置请求方法、请求头这些关键配置,比如创建Issue的POST请求:
conn.setRequestMethod("POST"); // 查数据用GET,创建用POST conn.setRequestProperty("Authorization", "Basic " + encodedAuthorization); conn.setRequestProperty("Content-Type", "application/json");
3. 处理HTTPS证书问题(如果是自签名证书)
如果公司JIRA用的是自签名SSL证书,JVM默认会不信任它,导致连接失败。你可以:
- 把证书导入到JVM的信任库(
cacerts文件); - 或者自定义TrustManager跳过证书验证(仅测试环境用,生产环境不推荐):
// 跳过证书验证的示例(测试用) TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType) { } public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType) { } } }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); // 跳过主机名验证 HostnameVerifier allHostsValid = (hostname, session) -> true; HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
三、如果需要代理访问
如果公司网络必须走代理才能连JIRA,记得给连接设置代理:
import java.net.Proxy; import java.net.InetSocketAddress; // ... Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.mycomp.com", 8080)); // 替换成你的代理地址和端口 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(proxy);
完整代码示例
这里给你补全一个创建JIRA Issue的完整示例,你可以参考:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpsURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Base64; public class JiraApiClient { public static void main(String[] args) { try { URL url = new URL("https://jira.mycomp.com/rest/api/latest/issue"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); // 配置代理(如果需要就打开注释) // Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.mycomp.com", 8080)); // HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(proxy); // 认证信息 String username = "uname"; String password = "pwd"; String auth = username + ":" + password; String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8)); // 请求配置 conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Authorization", "Basic " + encodedAuth); conn.setRequestProperty("Content-Type", "application/json"); // 构造请求体(根据JIRA的字段调整) String jsonPayload = "{\"fields\":{" + "\"project\":{\"key\":\"YOUR_PROJECT_KEY\"}," + "\"summary\":\"Test Issue from API\"," + "\"description\":\"Created via Java HttpsURLConnection\"," + "\"issuetype\":{\"name\":\"Bug\"}" + "}}"; // 发送请求体 try (OutputStream os = conn.getOutputStream()) { byte[] input = jsonPayload.getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); } // 获取响应 int responseCode = conn.getResponseCode(); System.out.println("Response Code: " + responseCode); try (BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder response = new StringBuilder(); String responseLine; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } System.out.println("Response Body: " + response); } } catch (IOException e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Prabhu
相关产品推荐
相关产品推荐

