【问题标题】:HTTP POST request to JIRA using Java yields 400 bad request error, curl works fine使用 Java 对 JIRA 的 HTTP POST 请求产生 400 错误请求错误,curl 工作正常
【发布时间】:2014-06-23 14:39:25
【问题描述】:

所以我尝试使用 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"

【问题讨论】:

    标签: java http post jira jira-rest-api


    【解决方案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 而不是尝试自己动手。

    【讨论】:

      【解决方案2】:

      首先是一般提示:例如使用带有 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));
      

      【讨论】:

        【解决方案3】:

        请注意,问题出在授权上(以防万一有人也遇到此问题)。完全被迷住了,忘记发送用户名/密码。

        【讨论】:

          【解决方案4】:

          添加基本授权标头很简单:

          HttpURLConnection connection = (HttpURLConnection)jiraURL.openConnection();
          String userCredentials = "username:password";
          String basicAuth = "Basic " + new String(new Base64().encode(userCredentials.getBytes()));
          connection.setRequestProperty ("Authorization", basicAuth);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-05-28
            • 2014-03-05
            • 2022-11-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多