0

因此,我尝试使用 Java 通过 REST API 检索有关 Jira 问题的信息,但是我不断收到 400 错误。我觉得我错过了一些非常愚蠢的东西,有人可以帮我找出问题所在吗?编辑:我意识到我没有在 Java 程序中将用户名/密码发送给 Jira,但我实际上不确定如何做到这一点......这里的帮助会很棒!这是我拥有的代码(已编辑公司名称):

import java.io.*;
import java.net.*;
import java.util.*;

public class JiraConnector 
{
    public static void main(String[] args)
    {
        try {
            //store necessary query information
            URL jiraURL = new URL("http://jira.somecompany.com/rest/api/2/search");
            String data = "'{\"jql\":\"project = PROJ\"}'";

            //establish connection and request properties
            HttpURLConnection connection = (HttpURLConnection)jiraURL.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Accept", "*/*");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);
            connection.setDoInput(true);

            connection.connect();

            OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
            wr.write(data.toString());
            wr.flush();
            wr.close();

            Reader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            for (int c; (c = in.read()) >= 0; System.out.print((char)c));

        } catch (MalformedURLException e) {
            System.err.println("MalformedURLException: " + e.getMessage());
        } catch (java.net.UnknownServiceException e) {
            System.err.println("UnknownServiceException: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("IOException: " + e.getMessage());
        }        
    }
}

作为记录,使用此 curl 命令有效:

curl -D- -u- user:password -X POST -H "Content-Type: application/json" --data '{"jql:"project=PROF"}' "http://jira.somecompany.com/rest/api/2/search"
4

4 回答 4

1

您似乎在帖子数据中有额外的单引号。

而不是这个:

String data = "'{\"jql\":\"project = PROJ\"}'";

尝试这个:

String data = "{\"jql\":\"project = PROJ\"}";

顺便说一句,即使您收到 400 Bad Request,JIRA 仍会提供有用的信息来帮助定位错误。您可以使用连接的 getErrorStream 方法查看它。如果我们快速将其添加到您的代码中:

import java.io.*;
import java.net.*;
import java.util.*;

public class JiraConnector 
{
    public static void main(String[] args)
    {
        HttpURLConnection connection = null;
        try {
            //store necessary query information
            URL jiraURL = new URL("http://127.0.0.1:8082/rest/api/2/search");
            String data = "{\"jql\":\"project = PROJ\"}";

            //establish connection and request properties
            connection = (HttpURLConnection)jiraURL.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Accept", "*/*");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);
            connection.setDoInput(true);

            connection.connect();

            OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
            wr.write(data.toString());
            wr.flush();
            wr.close();

            Reader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            for (int c; (c = in.read()) >= 0; System.out.print((char)c));

        } catch (MalformedURLException e) {
            System.err.println("MalformedURLException: " + e.getMessage());
        } catch (java.net.UnknownServiceException e) {
            System.err.println("UnknownServiceException: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("IOException: " + e.getMessage());
            if (connection != null) {
                try {
                    System.out.println(connection.getResponseMessage());

                    InputStream errorStream = connection.getErrorStream();
                    if (errorStream != null) {
                        Reader in = new BufferedReader(new InputStreamReader(errorStream));
                        for (int c; (c = in.read()) >= 0; System.out.print((char)c));
                    }
                }
                catch (IOException e2) {
                }
            }
        }        
    }
}

如果您要针对 REST API 做任何认真的工作,我建议您考虑使用Jersey而不是尝试自己动手。

于 2014-06-23T16:44:55.960 回答
0

首先是一般提示:例如使用带有 TamperData 插件的 FireFox,它可以跟踪常规表单提交并检查所有内容。在您的情况下,代理监视器可能会更有帮助。还:

curl --trace-ascii ...

TamperData 将显示哪里出错了。

如果没有编码参数,则采用当前平台编码;非便携式。

OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream(),
        StandardCharsets.UTF_8);
Reader in = new BufferedReader(new InputStreamReader(
        connection.getInputStream(),
        StandardCharsets.UTF_8));
于 2014-06-23T15:34:40.960 回答
0

注意,问题是授权(如果有人也有这个问题)。完全 derped 并忘记发送用户名/密码。

于 2014-06-26T07:18:44.877 回答
0

添加基本​​授权标头很容易:

HttpURLConnection connection = (HttpURLConnection)jiraURL.openConnection();
String userCredentials = "username:password";
String basicAuth = "Basic " + new String(new Base64().encode(userCredentials.getBytes()));
connection.setRequestProperty ("Authorization", basicAuth);
于 2015-08-04T20:55:02.007 回答