2012-12-20 9 views
5

Przeczytałem jedną odpowiedź na temat atlassian https://answers.atlassian.com/questions/79902/using-httpclient-c-to-create-a-jira-issue-via-rest-generates-bad-request-response, w której jeden użytkownik utworzył problem JIRA według następującego kodu. I dostosowany go ale pojawia się błąd przy użyciu self-build klasy problem z ObjectContentTworzenie problemu jira przez Odpoczynek C# httpClient

Http.HttpContent content = new Http.ObjectContent<Issue>(data, jsonFormatter); 

kompilator przyzwyczajenie zaakceptować. Czy ktoś wie dlaczego?

public string CreateJiraIssue() 
     { 

      string data= @"{ ""fields"": { 
           ""project"": 
        { 
         ""key"": ""HELP"" 
        }, 
           ""summary"": ""Test Ticket"", 
           ""description"": ""Creating of an issue using project keys and issue type names using the REST API"", 
           ""issuetype"": { 
            ""name"": ""Ticket"" 
           }, 
           ""assignee"": { ""name"": ""user"" } 
          } 
      }"; 
      string postUrl = "https://xxx.jira.com/rest/api/2/"; 
      System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); 
      client.BaseAddress = new System.Uri(postUrl); 
      byte[] cred = UTF8Encoding.UTF8.GetBytes("username:password"); 
      client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred)); 
      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 
      System.Net.Http.Formatting.MediaTypeFormatter jsonFormatter = new System.Net.Http.Formatting.JsonMediaTypeFormatter(); 

      System.Net.Http.HttpContent content = new System.Net.Http.ObjectContent<Issue>(data, jsonFormatter); 
      System.Net.Http.HttpResponseMessage response = client.PostAsync("issue", content).Result; 
      if (response.IsSuccessStatusCode) 
      { 
       string result = response.Content.ReadAsStringAsync().Result; 
       return result; 
      } 
      else 
      { 
       return response.StatusCode.ToString(); 
      } 

i korzystania

namespace IOnotification_System 
{ 
    public class Issue 
    { 
     public Fields fields { get; set; } 
     public Issue() 
     { 
      fields = new Fields(); 
     } 
    } 

    public class Fields 
    { 
     public Project project { get; set; } 
     public string summary { get; set; } 
     public string description { get; set; } 
     public Assignee assignee { get; set; } 
     public IssueType issuetype { get; set; } 
     public Fields() 
     { 
      project = new Project(); 
      issuetype = new IssueType(); 
     } 
    } 

    public class Project 
    { 
     public string key { get; set; } 
    } 

    public class IssueType 
    { 
     public string name { get; set; } 
    } 
    public class Assignee 
    { 
     public string name { get; set; } 
    } 
} 
+1

a błąd jest? –

+0

Nie mogę powiedzieć dokładnie po angielsku, ale musi to być coś takiego: "Najlepsze przeciążenie dla metody System.Net.Http.ObjectContent .ObjectContent (IOnotification_System.Issue, System.Net.Http .Formatting.MediaTyoeFormatter) nie jest kompatybilny z listą argumentów – Simon

+0

Po prostu skopiuj i wklej wiadomość z kompilatora –

Odpowiedz

2

EDIT

Komunikat jasno mówi, że System.Net.Http.ObjectContent() oczekuje obiekt problem dla swojego pierwszego parametru. Oczekuję, że pojawi się kolejny komunikat mówiący, że nie ma możliwości konwersji z ciągu na problem.

Przekazujesz ciąg znaków do metody, która oczekuje obiektu Issue. Formater służy do konwersji obiektu Issue na ciąg Json.

Masz już ciąg, więc nie ma sensu próbować go przekonwertować. Potrzebujesz tylko formatera, jeśli masz instancję Issue, którą chcesz przekonwertować na ciąg Json. Można użyć klasy StringContent i używać jej Headers własności dodawać żadnych nagłówków nie już ustawione na kliencie, np

var content=new StringContent(data); 

Original

Jaki jest komunikat o błędzie, jaki rodzaj projektu jesteś za pomocą? Przestrzeń nazw System.Net.Http.Formatting jest częścią interfejsu ASP.NET Web API. Czy budujesz aplikację ASP.NET, aplikację konsolową, coś jeszcze?

O ile nie tworzysz witryny ASP.NET, ten kod nie będzie działać. Jeśli Twoim jedynym problemem jest parsowanie żądań Jsona, po prostu użyj innej klasy deserializacji Json. Json.NET to bardzo popularny wybór.

W żadnym wypadku nie ma powodu, aby używać klasy Json do konwertowania ciągu znaków do obiektu HttpContent zawierającego ten sam ciąg. Można użyć klasy StringContent i użyć jej właściwości Headers, aby dodać nagłówki, które nie zostały jeszcze ustawione na kliencie.

+0

Mmhh .. nie jestem pewien czy mogę Cię śledzić w 100%. Widzę, że mam ciąg znaków, więc nie muszę go konwertować. I tak, masz rację, jest jeszcze jedna wiadomość zaraz po tym, jak mówi, że nie ma możliwości konwersji z ciągu na problem. Ale teraz otrzymuję błąd http: UnsupportedMediaType. Czy to nie oznacza, że ​​coś jest nie tak z ciągiem, który mijam? – Simon

+0

Używam go jako usługi sieciowej. – Simon

+1

Działa teraz! Musiał dodać var ​​content = new StringContent (data, Encoding.UTF8, "application/json"); Wielkie dzięki! – Simon

1

Poniższa robi Magic:

var content = new StringContent(data, Encoding.UTF8, "application/json");