2017-01-23 12 views
0

Я знаю, что этот вопрос задан раньше, но я не могу заставить его работать.C# Закрытие проблемы в Jira с использованием API REST

Я могу выполнить аутентификацию в Jira и создать новый билет с использованием строки JSON, но попытка закрыть ту же проблему приводит к ошибке «400 Bad Request».

Код:

public string jiraJSON; 
public void openJira() 
{ 
    jiraJSON = string.Format(@"{{""fields"":{{""assignee"":{{""name"":""{0}""}},""project"":{{""key"":""TS""}},""summary"":""{1}"",""description"":""{2}"",""issuetype"":{{""name"":""Unplanned Event""}} }} }}", jiraUsernameTextBox.Text, jiraSummary, jiraDescription); 
    Dictionary<string, string> jiraResponse = sendHTTPtoJIRA(jiraJSON,"open",""); 
} 
public void closeJira(string jiraKey) 
{ 
    jiraJSON = @"{{""update"":{{""comment"":[{{""add"":{{""body"":""Done""}}}}]}},""fields"":{{""resolution"":{{""name"":""Done""}}}},""transition"":{{""id"":""51""}}}}"; 
    jiraResponse = sendHTTPtoJIRA(jiraJSON,"close",jiraKey);  
} 
private Dictionary<string,string> sendHTTPtoJIRA(string json, string operation,string issueID) 
     { 
      string restURL=""; 
      string method = ""; 
      switch (operation) 
      { 
       case "open": 
        restURL = string.Format("{0}rest/api/2/issue/", jiraURL); 
        method = "POST"; 
        break; 
       case "close": 
        restURL = string.Format("{0}rest/api/2/issue/{1}/transitions/?expand=transitions.fields", jiraURL,issueID); 
        method = "POST";      
        break; 
      } 

      HttpWebResponse response = null; 
      HttpWebRequest request = WebRequest.Create(restURL) as HttpWebRequest; 
      request.Method = method; 
      request.Accept = "application/json"; 
      request.ContentType = "application/json"; 
      request.Headers.Add("Authorization", "Basic " + authenticateJira()); 
      byte[] data = Encoding.UTF8.GetBytes(json); 
      using (var requestStream = request.GetRequestStream()) 
      { 
       requestStream.Write(data, 0, data.Length); 
       requestStream.Close(); 
      } 
      using (response = request.GetResponse() as HttpWebResponse) 
      { 
       var reader = new StreamReader(response.GetResponseStream()); 
       string str = reader.ReadToEnd(); 
       displayMessages(string.Format("The server returned '{0}'\n{1}", response.StatusCode, str), "white", "purple"); 
       var jss = new System.Web.Script.Serialization.JavaScriptSerializer(); 
       var sData = jss.Deserialize<Dictionary<string, string>>(str); 
       sData.Add("code", response.StatusCode.ToString()); 
       request.Abort(); 
       return sData; 
      } 
     } 

Я перефразировал код немного для ясности, но метод «sendHTTPtoJIRA» дословно и строки jiraJSON также дословно.

Используя этот код, я могу открыть проблему и назначить ее себе, однако, когда я попытаюсь закрыть проблему, я получаю «400 Bad Request», который говорит мне, что моя строка jiraJSON в «closeJira» "метод неверен.

Исключение земли в строке «using (response = request.GetResponse() как HttpWebResponse)» и ссылки «jiraResponse = sendHTTPtoJIRA (jiraJSON,« close », jiraKey); как строка, вызывающая метод, поэтому я знаю, что это ошибка при попытке закрыть проблему.

Общие вопросы от других постов, которые я решаемые:

  1. учетная запись пользователя, что я использую имеет права закрывать вопросы.
  2. Я пробовал методы «POST» и «PUT». Использование «PUT» вызывает ошибку «405 Method not allowed».
  3. Сбежал в фигурные скобки и кавычки.

Expanded строка JSON Я использую, чтобы закрыть вопрос:

{{ 
     ""update"":{{""comment"":[{{""add"":{{""body"":""Done""}}}}]}}, 
     ""fields"":{{""resolution"":{{""name"":""Done""}}}}, 
     ""transition"":{{""id"":""51""}} 
}} 

Я пробовал варианты, конечно. Ничто не работает. Я также включил 51 с и без кавычек безрезультатно.

Когда я просматриваю к http://jira/rest/api/2/issue/TS-1000/transitions/?expand=transitions.fields я получаю следующий результат (который, как я получил «51» для ID в моем jiraJSON строки):

{ 
    "expand": "transitions", 
    "transitions": [{ 
      "id": "11", 
      "name": "Start Progress", 
      "to": { 
       "self": "http://jira/rest/api/2/status/3", 
       "description": "This issue is being actively worked on at the moment by the assignee.", 
       "iconUrl": "http://jira/images/icons/statuses/inprogress.png", 
       "name": "In Progress", 
       "id": "3", 
       "statusCategory": { 
        "self": "http://jira/rest/api/2/statuscategory/4", 
        "id": 4, 
        "key": "indeterminate", 
        "colorName": "yellow", 
        "name": "In Progress" 
       } 
      }, 
      "fields": { 
       "attachment": { 
        "required": false, 
        "schema": { 
         "type": "array", 
         "items": "attachment", 
         "system": "attachment" 
        }, 
        "name": "Attachment", 
        "operations": [] 
       }, 
       "assignee": { 
        "required": true, 
        "schema": { 
         "type": "user", 
         "system": "assignee" 
        }, 
        "name": "Assignee", 
        "autoCompleteUrl": "http://jira/rest/api/latest/user/assignable/search?issueKey=TS-2034&username=", 
        "operations": ["set"] 
       } 
      } 
     }, { 
      "id": "51", 
      "name": "Close Issue", 
      "to": { 
       "self": "http://jira/rest/api/2/status/6", 
       "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", 
       "iconUrl": "http://jira/images/icons/statuses/closed.png", 
       "name": "Closed", 
       "id": "6", 
       "statusCategory": { 
        "self": "http://jira/rest/api/2/statuscategory/3", 
        "id": 3, 
        "key": "done", 
        "colorName": "green", 
        "name": "Done" 
       } 
      }, 
      "fields": { 
       "resolution": { 
        "required": true, 
        "schema": { 
         "type": "resolution", 
         "system": "resolution" 
        }, 
        "name": "Resolution", 
        "operations": ["set"], 
        "allowedValues": [{ 
          "self": "http://jira/rest/api/2/resolution/1", 
          "name": "Fixed", 
          "id": "1" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/5", 
          "name": "Cannot Reproduce", 
          "id": "5" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/3", 
          "name": "Duplicate", 
          "id": "3" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/4", 
          "name": "Incomplete", 
          "id": "4" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/7", 
          "name": "Review Completed", 
          "id": "7" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/6", 
          "name": "Unresolved", 
          "id": "6" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/2", 
          "name": "Won't Fix", 
          "id": "2" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/10000", 
          "name": "Done", 
          "id": "10000" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/10100", 
          "name": "Edgewater Review", 
          "id": "10100" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/10200", 
          "name": "Active Project", 
          "id": "10200" 
         }, { 
          "self": "http://jira/rest/api/2/resolution/10300", 
          "name": "Won't Do", 
          "id": "10300" 
         } 
        ] 
       }, 
       "customfield_10652": { 
        "required": false, 
        "schema": { 
         "type": "string", 
         "custom": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", 
         "customId": 10652 
        }, 
        "name": "Resolution Activity", 
        "operations": ["set"] 
       } 
      } 
     } 
    ] 
} 

Так, что я делаю с моей JSON строки? Мы ценим любые предложения. Благодаря!

+1

Вы подтвердили, что являетесь юридическим лицом json? Вы должны использовать библиотеку, такую ​​как Json.Net, и сериализовать иерархию объектов вместо json. С вашим текущим кодом вы рискуете проблемами, если ваши данные содержат апострофы или аналогично недопустимые символы, если только они не обрабатываются должным образом. –

ответ

0

Форматирование строки JSON с двойными кавычками всегда идет не так. Поэтому используйте dll Json.Net и используйте JObject для формирования строки json.

Ниже приведен пример для обновления пользовательского значения поля `

JObject customFiledObject = new JObject( new JProperty("fields", new JObject(new JProperty("customfield_1100", new JArray(10)))));

После подготовки нужного объекта JSON, формат объекта в Json строку, как показано ниже

string jSonString = customFiledObject.ToString(Newtonsoft.Json.Formatting.Indented);

0

Я знаю, что вопрос имеет был дан ответ в течение некоторого времени, но для кого-либо другого, страдающего от 400 Bad Request от Jiras ', вы можете зафиксировать более значимую ошибку, добавив инструкцию catch.

catch (System.Net.WebException ex) 
{ 
    WebResponse resp = ex.Response; 
    string JiraErrorMessages = (new System.IO.StreamReader(resp.GetResponseStream(), true)).ReadToEnd(); 
}