Java程序,用于在JIRA中获取问题的自定义/默认字段

时间:2018-02-05 09:01:10

标签: rest restful-authentication jira-rest-api jira-plugin jira-rest-java-api

我开发了一个简单的java程序来获取问题/用户故事的数据。 我想获取一个特定问题的“描述”字段。我已经使用GET方法来获得响应,但是在连接到JIRA时我遇到了错误。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class JiraIssueDescription {

public static void main(String[] args) {

  try {

    URL url = new URL("https://****.atlassian.net/rest/agile/1.0/issue/41459");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Accept", "application/json");
    conn.setRequestProperty("username", "***@abc.com");
    conn.setRequestProperty("password", "****");

    if (conn.getResponseCode() != 200) {
        throw new RuntimeException("Failed : HTTP error code : "
                + conn.getResponseCode());
    }

    BufferedReader br = new BufferedReader(new InputStreamReader(
        (conn.getInputStream())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        System.out.println(output);
    }

    conn.disconnect();

  } catch (MalformedURLException e) {

    e.printStackTrace();

  } catch (IOException e) {

    e.printStackTrace();

  }

}

}

当我运行项目时,我收到以下错误

java.net.UnknownHostException: ****.atlassian.net
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
at sun.security.ssl.BaseSSLSocketImpl.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at com.JiraIntegration.bean.JiraIssueDescription.main(JiraIssueDescription.java:24)

任何人都可以帮我解决这些错误。我需要实施OAuth吗?

2 个答案:

答案 0 :(得分:0)

UnknownHostException看起来您的网址中有拼写错误或facing some proxy issues

  1. 它在您的浏览器中有效吗? 它应该给你一些响应的json。像这样: https://jira.atlassian.com/rest/api/2/issue/JSWCLOUD-11658

  2. 您还可以使用curl等其他工具进行测试。它有用吗? curl https://jira.atlassian.com/rest/api/2/issue/JSWCLOUD-11658

  3. Atlassian rest API提供two authentication methods,Basic auth和Oauth。 Use this approach创建有效的基本身份验证标头或尝试不带参数的请求。

  4. 以下代码演示了它应该如何工作:

    package stack48618849;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
    
    import org.junit.Test;
    
    public class HowToReadFromAnURL {
        @Test
        public void readFromUrl() {
            try (InputStream in = getInputStreamFromUrl("https://jira.atlassian.com/rest/api/2/issue/JSWCLOUD-11658")) {
                System.out.println(convertInputStreamToString(in));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        @Test(expected = RuntimeException.class)
        public void readFromUrlWithBasicAuth() {
            String user="aUser";
            String passwd="aPasswd";
            try (InputStream in = getInputStreamFromUrl("https://jira.atlassian.com/rest/api/2/issue/JSWCLOUD-11658",user,passwd)) {
                System.out.println(convertInputStreamToString(in));
            } catch (Exception e) {
                System.out.println("If basic auth is provided, it should be correct: "+e.getMessage());
                throw new RuntimeException(e);
            }
        }
    
        private InputStream getInputStreamFromUrl(String urlString,String user, String passwd) throws IOException {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/json");
            String encoded = Base64.getEncoder().encodeToString((user+":"+passwd).getBytes(StandardCharsets.UTF_8));  
            conn.setRequestProperty("Authorization", "Basic "+encoded);
            return conn.getInputStream();
        }
    
        private InputStream getInputStreamFromUrl(String urlString) throws IOException {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/json");
            return conn.getInputStream();
        }
    
        private String convertInputStreamToString(InputStream inputStream) throws IOException {
            ByteArrayOutputStream result = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) != -1) {
                result.write(buffer, 0, length);
            }
            return result.toString("UTF-8");
        }
    }
    

    打印:

    {"expand":"renderedFields,names,schema,operations,editmeta,changelog,versionedRepresentations","id":"789521","self":"https://jira.atlassian.com/rest/api/2/issue/789521","key":"JSWCLOUD-11658","fields":{"customfield_18232":...
    If basic auth is provided, it should be correct: Server returned HTTP response code: 401 for URL: https://jira.atlassian.com/rest/api/2/issue/JSWCLOUD-11658
    

答案 1 :(得分:0)

您可以有效地使用HttpURLConnection的{​​{1}}来解决您的问题,而不是Spring实施方式:

使用JIRA REST API为您提供一段代码:

创建一个您希望与JIRA REST API结合使用的RESTClient,如下所示:

RestTemplate

然后您可以进一步重复使用这些方法,如下所示:

public class JIRASpringRESTClient {

    private static final String username = "fred";
    private static final String password = "fred";
    private static final String jiraBaseURL = "https://jira.xxx.com/rest/api/2/";

    private RestTemplate restTemplate;
    private HttpHeaders httpHeaders;

    public JIRASpringRESTClient() {
        restTemplate = new RestTemplate();
        httpHeaders = createHeadersWithAuthentication();
    }

    private HttpHeaders createHeadersWithAuthentication() {
        String plainCredentials = username + ":" + password;
        byte[] base64CredentialsBytes = Base64.getEncoder().encode(plainCredentials.getBytes());
        String base64Credentials = new String(base64CredentialsBytes);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Basic " + base64Credentials);
        return headers;
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public ResponseEntity<String> getJIRATicket(String issueId) {
        String url = jiraBaseURL + "issue/" + issueId;

        HttpEntity<?> requestEntity = new HttpEntity(httpHeaders);
        return restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);
    }
}

这将提供来自JIRA的public class JIRATicketGet { public static void main(String... args) { JIRASpringRESTClient restClient = new JIRASpringRESTClient(); ResponseEntity<String> response = restClient.getJIRATicket("XXX-12345"); System.out.println(response.getBody()); } } 响应,该响应采用GET格式,可以进一步操作以使用{{1来获取JSON响应中的特定字段}}

使用您在上面的步骤中获得的JSON,您可以创建一个POJO类(例如,GET),然后按如下方式使用它:

com.fasterxml.jackson.databind.ObjectMapper

希望这有帮助!