2012-12-20 25 views
5

के माध्यम से जिरा मुद्दा बनाना मैंने एटलसैन https://answers.atlassian.com/questions/79902/using-httpclient-c-to-create-a-jira-issue-via-rest-generates-bad-request-response पर एक उत्तर पढ़ा है जहां एक उपयोगकर्ता ने निम्नलिखित कोड द्वारा एक जिरा मुद्दा बनाया है। मैं इसे अनुकूलित लेकिन अभ्यस्त इसे स्वीकार ObjectContentबाकी सी # httpClient

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

संकलक के साथ एक स्वयं का निर्माण वर्ग मुद्दे का उपयोग करके कोई त्रुटि मिलती है। क्या किसी को पता है क्यों?

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(); 
      } 

और

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

और त्रुटि है? –

+0

मैं आपको बिल्कुल अंग्रेजी में नहीं बता सकता, लेकिन यह कुछ ऐसा होना चाहिए: "विधि के लिए सबसे अच्छा अधिभार System.Net.Http.ObjectContent .bjectContent (IOnotification_System.Issue, System.Net.Http .Formatting.MediaTyoeFormatter) तर्क सूची के साथ संगत नहीं है। – Simon

+0

बस संकलक –

उत्तर

2

संपादित

संदेश का उपयोग कर स्पष्ट रूप से कहा गया है कि System.Net.Http.ObjectContent() अपनी पहली पैरामीटर के लिए एक मुद्दा वस्तु की उम्मीद है। मुझे उम्मीद है कि एक और संदेश सही कहने के बाद है कि स्ट्रिंग से किसी समस्या तक कोई रूपांतरण संभव नहीं है।

आप एक ऐसी विधि के लिए एक स्ट्रिंग पास कर रहे हैं जो किसी समस्या ऑब्जेक्ट की अपेक्षा करता है। फॉर्मेटर का उपयोग किसी समस्या ऑब्जेक्ट को जेसन स्ट्रिंग में कनवर्ट करने के लिए किया जाता है।

आपके पास पहले से ही स्ट्रिंग है, इसलिए इसे बदलने की कोशिश करने में कोई बात नहीं है। यदि आपके पास कोई समस्या उदाहरण है जिसे आप किसी जेसन स्ट्रिंग में कनवर्ट करना चाहते हैं तो आपको केवल फ़ॉर्मेटर की आवश्यकता है। आप StringContent वर्ग का उपयोग करें और पहले से ही ग्राहक, जैसे पर सेट नहीं किसी भी हेडर को जोड़ने के लिए अपने Headers संपत्ति का उपयोग कर सकते हैं:

var content=new StringContent(data); 

मूल

क्या त्रुटि संदेश है और आप इस परियोजना की किस तरह कर रहे हैं का उपयोग करते हुए? System.Net.Http.Formatting नामस्थान एएसपी.नेट वेब एपीआई का हिस्सा है। क्या आप एएसपी.NET एप्लिकेशन, कंसोल एप्लिकेशन, कुछ और बना रहे हैं?

जब तक आप एक एएसपी.NET साइट नहीं बना रहे हैं तो यह कोड काम नहीं करेगा। यदि आपका एकमात्र मुद्दा यह है कि जेसन अनुरोधों का विश्लेषण कैसे करें, तो बस एक और जेसन deserialization वर्ग का उपयोग करें। Json.NET एक बहुत लोकप्रिय विकल्प है।

किसी भी मामले में एक स्ट्रिंग को एक HttpContent ऑब्जेक्ट में कनवर्ट करने के लिए जेसन क्लास का उपयोग करने का कोई कारण नहीं है जिसमें सटीक समान स्ट्रिंग है। आप StringContent कक्षा का उपयोग कर सकते हैं और अपने Headers प्रॉपर्टी का उपयोग किसी भी शीर्षलेख को जोड़ने के लिए कर सकते हैं जो क्लाइंट पर पहले से सेट नहीं है।

+0

एमएमएचएच में कनवर्ट करना चाहते हैं तो आपको केवल फॉर्मेटर की आवश्यकता है .. सुनिश्चित नहीं है कि मैं 100% का अनुसरण कर सकता हूं या नहीं। मैं देखता हूं कि मेरे पास एक स्ट्रिंग है, इसलिए मुझे इसे बदलने की आवश्यकता नहीं है। और हाँ आप सही थे, यह कहने के बाद एक और संदेश है कि स्ट्रिंग से किसी समस्या तक कोई रूपांतरण संभव नहीं है। लेकिन अब मुझे एक HTTP त्रुटि मिलती है: असमर्थित मीडिया टाइप। क्या इसका मतलब यह नहीं है कि स्ट्रिंग के साथ कुछ गड़बड़ है? – Simon

+0

मैं इसे webservice के रूप में उपयोग करता हूं। – Simon

+1

यह अब काम करता है! Var content = new StringContent (डेटा, एन्कोडिंग.यूटीएफ 8, "एप्लिकेशन/जेसन") जोड़ना था; आपका बहुत बहुत धन्यवाद! – Simon

1

निम्नलिखित जादू करता है:

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