【问题标题】:Create Issue Jira REST API (400 Bad Request)创建问题 Jira REST API(400 错误请求)
【发布时间】:2019-02-06 09:55:10
【问题描述】:

问题

我正在尝试使用 HttpWebRequest 创建对我们内部 Jira 服务器的 REST API 调用。但不知何故,我不断收到(400)错误请求错误。我也尝试过使用 WebClient 和其他方法,但我似乎没有找到正确的方法。有什么建议吗?

网址正确

用户正确

密码正确

JSON 数据也正确

一定有另一种访问远程服务器的方法吧?我一直在寻找,但似乎没有找到解决方案。

我的代码

public static void CreateJiraRequest(JiraApiObject.RootObject jiraApiObject)
{
    string url = "https://jira-test.ch.*********.net/rest/api/latest/issue/";
    string user = "peno.ch";
    string password = "**********";

    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/json";
    request.Credentials = new System.Net.NetworkCredential(user, password);

    string data = JsonConvert.SerializeObject(jiraApiObject);

    using (var webStream = request.GetRequestStream())
    using (var requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
    {
        requestWriter.Write(data);
    }

    try
    {
        var webResponse = request.GetResponse();
        using (var responseReader = new StreamReader(webResponse.GetResponseStream()))
        {
            string response = responseReader.ReadToEnd();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

JSON

{
    "fields": {
       "project":
       {
          "key": "FOO"
       },
       "summary": "Test the REST API",
       "issuetype": {
          "name": "Task"
       }
   }
}

异常

request.GetResponse();上进入try块时出现异常

附加信息:远程服务器返回错误:(400) Bad Request。

访问 Jira Wiki here

【问题讨论】:

  • 阅读错误响应,它必然包含更多细节。您对 JSON 正确的假设可能是不正确的。例如,您的用户没有权限,您的数据缺少必填字段,或类似情况。如果没有任何相关数据或错误,我们对此无话可说。
  • 听键盘侠Try块中的函数抛出异常唯一抛出的错误是:远程服务器返回错误:(400)错误请求。没有任何进一步的信息。我还将生成的 JSON 与 wiki 页面上列出的 JSON 进行了 1:1 匹配
  • 看哥们,你正在使用古老的 HttpWebRequest,这是一个可怕的 HTTP API。参见例如.Net HttpWebRequest.GetResponse() raises exception when http status code 400 (bad request) is returned 以获取应包含更多信息的响应正文(如in the docs 所述)。或者完全切换到 HttpClient。
  • 根据输入猜测是没有用的;输出包含解决此问题所需的详细信息。您的输入在语法上可能是正确的,但服务器可能需要设置更多字段或不允许您的用户在给定项目中创建给定类型的问题。获取响应正文并阅读它以了解您收到 400 响应的原因。
  • 尝试检查innerException,我发现有用的消息通常隐藏在堆栈深处

标签: c# jira jira-rest-api


【解决方案1】:

#解决方案#

上面代码中的问题是 Jira 需要编码凭据。如果不对凭据进行编码,Jira 服务器将返回没有具体信息的 400 Bad Request 错误。

我编写了两个新函数,一个用于 API 请求,一个用于凭据编码。

#API 调用#

public static string PostJsonRequest(string endpoint, string userid, string password, string json)
    {
        // Create string to hold JSON response
        string jsonResponse = string.Empty;
        
        using (var client = new WebClient())
        {
            try
            {
                client.Encoding = System.Text.Encoding.UTF8;
                client.Headers.Set("Authorization", "Basic " + GetEncodedCredentials(userid, password));
                client.Headers.Add("Content-Type: application/json");
                client.Headers.Add("Accept", "application/json");
                var uri = new Uri(endpoint);
                var response = client.UploadString(uri, "POST", json);
                jsonResponse = response;
            }
            catch (WebException ex)
            {
                // Http Error
                if (ex.Status == WebExceptionStatus.ProtocolError)
                {
                    HttpWebResponse wrsp = (HttpWebResponse)ex.Response;
                    var statusCode = (int)wrsp.StatusCode;
                    var msg = wrsp.StatusDescription;
                    throw new HttpException(statusCode, msg);
                }
                else
                {
                    throw new HttpException(500, ex.Message);
                }
            }
        }

        return jsonResponse;
    }

#编码函数#

private static string GetEncodedCredentials(string userid, string password)
{
    string mergedCredentials = string.Format("{0}:{1}", userid, password);
    byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials);
    return Convert.ToBase64String(byteCredentials);
}

补充说明: Jira API 区分大小写,因此对于“POST”,如果您执行 Fields、Summary、Project 将不起作用 它必须是字段、摘要、项目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多