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

最初に一般的なヒント: たとえば、FireFox と TamperData アドオンを使用すると、通常のフォーム送信を追跡し、すべてを検査できます。あなたの場合、プロキシモニターがより役立つかもしれません。また:

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

基本的な承認ヘッダーを追加するのは簡単です。

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 に答える
0

注意してください、問題は承認でした(誰かがこの問題を抱えている場合に備えて)。完全にだまされて、ユーザー名/パスワードを送信するのを忘れました。

于 2014-06-26T07:18:44.877 に答える