C# 创建问题Jira REST API(400错误请求) 问题
我正在尝试使用HttpWebRequest创建一个RESTAPI调用来调用我们的内部Jira服务器。但不知何故,我一直收到(400)个错误的请求。我也尝试过使用WebClient和其他方法,但似乎没有找到正确的方法。有什么建议吗 URL是正确的 用户正确 密码正确 JSON数据也正确 必须有其他方式访问远程服务器,对吗?我一直在寻找,但似乎没有找到解决办法 我的代码 JSON 例外情况 在C# 创建问题Jira REST API(400错误请求) 问题,c#,jira,jira-rest-api,C#,Jira,Jira Rest Api,我正在尝试使用HttpWebRequest创建一个RESTAPI调用来调用我们的内部Jira服务器。但不知何故,我一直收到(400)个错误的请求。我也尝试过使用WebClient和其他方法,但似乎没有找到正确的方法。有什么建议吗 URL是正确的 用户正确 密码正确 JSON数据也正确 必须有其他方式访问远程服务器,对吗?我一直在寻找,但似乎没有找到解决办法 我的代码 JSON 例外情况 在request.GetResponse()上输入try块时发生异常 其他信息:远程服务器返回错误:(400)
request.GetResponse()上输入try块时发生异常代码>
其他信息:远程服务器返回错误:(400)错误请求
访问Jira Wiki#解决方案#
上面代码中的问题是Jira需要编码的凭证。如果不对凭据进行编码,Jira服务器将返回一个400错误请求错误,并且没有特定信息
我已经编写了两个新函数,一个用于API请求,另一个用于凭证编码
#API调用#
#编码功能#
补充说明:
JiraAPI是区分大小写的,所以对于“POST”,如果您执行字段、摘要和项目,它将不起作用
它必须是字段、摘要、项目读取错误响应,它必然包含更多详细信息。您对JSON正确性的假设可能是不正确的。例如,您的用户没有权限,您的数据缺少必填字段,或者类似的内容。如果没有任何相关数据或错误,我们无法对此进行任何说明。在Try块中,函数引发异常。唯一引发的错误是:远程服务器返回错误:(400)错误请求。没有任何进一步的信息。我还将生成的JSON与wiki页面上列出的JSON进行了比较,它们与您使用的古老的HttpWebRequest 1:1Look buddy相匹配,这是一个可怕的HTTP API。例如,请参阅以获取应包含更多信息的响应正文(如所述)。或者完全切换到HttpClient。根据输入进行猜测是没有用的;输出包含解决此问题所需的详细信息。您的输入可能语法正确,但服务器可能需要设置更多字段,或者不允许用户在给定项目中创建给定类型的问题。获取响应正文并阅读它以了解为什么会得到400响应。尝试检查innerException,我发现有用的消息通常隐藏在堆栈的深处
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;
}
}
{
"fields": {
"project":
{
"key": "FOO"
},
"summary": "Test the REST API",
"issuetype": {
"name": "Task"
}
}
}
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);
}